equals는 일반 규약을 지켜 재정의하라 두 객체가 같은지 비교하는 목적으로 사용되는 equals 메서드는 재정의하기 쉬워 보이지만 곳곳에 함정이 도사리고 있습니다. 몇가지 규칙들을 제대로 지키지 않을 경우 개발자가 생각한 의도와 다르게 동작해서 프로그램에 오류가 발생할 수 있습니다. 재정의를 하지 않는 경우 해당 클래스의 인스턴스는 자기자신과만 같다고 평가하게 됩니다. 아래 두개의 인스턴스 객체를 살펴보면 ID, Name, Age는 모두 동일합니다. 하지만 재정의를 하지 않은 인스턴스이기 때문에 둘은 다른 객체로 평가됩니다. 즉 동등성은 성립하지만 동일성은 성립하지 않기 때문입니다. 그래서 동일성도 성립을 하기 위해서는 equals 메서드를 재정의해서 사용해야하는 경우도 있습니다. 재정의하지 않아도 ..
try-finally 보다는 try-with-resources를 사용하라 자바 라이브러리에는 close 메서드를 호출해 직접 닫아줘야 하는 자원이 많습니다. InputStream, OutputStream, java.sql.Connection 등이 좋은 예입니다. 사용한 자원을 닫아주는 것은 클라이언트가 놓치기 쉬워서 예측할 수 없는 성능 문제로 이어지기도 합니다. 이런 자원 중 상당수가 안정망으로 finalizer를 사용하고는 있지만 Item08에서 본거처럼 그렇게 믿을만한 녀석은 아닙니다. 💡close() 메서드를 사용하여 자원 회수 구글링이나 많은 책에서 아래와 같은 코드를 심심치 않게 볼 수 있습니다. 지금까지 우리는 명시적으로 close() 메서드를 호출해왔었습니다. 아래 예제도 finally를 ..
finalizer와 cleaner 사용을 피하라 자바에서 제공하는 두 가지 객체 소멸자는 finalizer와 cleaner입니다. finalizer finalizer는 예측할 수 없고, 상황에 따라 위험할 수 있어 일반적으로 불필요합니다. 오작동, 낮은 성능, 이식성 문제의 원인이 되기도 하며, 기본적으로 사용하지 않는게 좋습니다. cleaner cleaner는 finalizer보다는 덜 위험하지만, 여전히 예측할 수 없고, 느리고, 일반적으로는 불필요합니다. 문제점 🧨 finalizer와 cleaner는 즉시 수행된다는 보장이 없습니다. 객체에 접근할 수 없게된 후 finalizer나 cleaner가 실행되기까지 얼마나 걸릴지 알 수 없습니다. 즉 finalizer와 cleaner는 제때 실행되어야 ..
다 쓴 객체 참조를 해제하라 자바에서는 가비지 컬렉터가 메모리를 알아서 관리 해주니까 프로그래머가 메모리 관리에 신경써야 하는 부분이 적습니다. 그래서 자칫 메모리 관리에 더 이상 신경쓰지 않아도 된다고 오해할 수 있는데, 절대 사실이 아닙니다. 일반적으로 객체 참조가 해제되서 객체를 참조하는 곳이 없게되면 가비지 컬렉터는 해당 객체를 회수해갑니다. 💡예제 코드 아래 예제 코드에서는 스택이 커졌다가 줄어들었을 때 스택에서 꺼낸 객체들을 가비지 컬렉터가 회수하지 않습니다. 프로그램에서 해당 객체를 더 이상 사용하지 않더라도 회수를 하지 않습니다. 예제 코드에서는 스택이 배열에 다 쓴 참조를 여전히 가지고 있습니다.(다 쓴 참조란 더이상 쓰이지 않을 참조란 의미) public class Stack { pri..
- Total
- Today
- Yesterday
- spring boot redisson sorted set
- transactional outbox pattern spring boot
- spring boot redisson destributed lock
- spring boot redisson 분산락 구현
- java ThreadLocal
- spring boot poi excel download
- spring boot excel download paging
- java userThread와 DaemonThread
- service based architecture
- JDK Dynamic Proxy와 CGLIB의 차이
- 서비스 기반 아키텍처
- redis 대기열 구현
- polling publisher spring boot
- spring boot excel download oom
- @ControllerAdvice
- transactional outbox pattern
- redis sorted set으로 대기열 구현
- pipe and filter architecture
- 레이어드 아키텍처란
- 트랜잭셔널 아웃박스 패턴 스프링부트
- space based architecture
- 자바 백엔드 개발자 추천 도서
- 람다 표현식
- redis sorted set
- 공간 기반 아키텍처
- 트랜잭셔널 아웃박스 패턴 스프링 부트 예제
- spring boot 엑셀 다운로드
- microkernel architecture
- pipeline architecture
- spring boot redis 대기열 구현
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |