본문 바로가기
  • soobinhand의 기술 블로그
728x90

도서37

아이템 8 - finalizer와 cleaner 사용을 피하라. 자바는 두 가지 객체 소멸자가 있다. 그 중, finalizer는 예측할 수 없고, 상황에 따라 위험할 수 있어 일반적으로 불필요하다. 오동작, 낮은 성능, 이식성 문제의 원인이 되기도 한다. 기본적으로 '쓰지 말아야' 한다. cleaner는 finalizer보다는 덜 위험하지만, 여전히 예측할 수 없고, 느리고, 일반적으로 불필요하다. 즉, 두 객체 소멸자는 제때 실행되어야 하는 작업엔 절대 사용하면 안된다. 상태를 영구적으로 수정하는 작업에서는 절대 두 객체 소멸자에 의존해서는 안 된다. 두 객체 소멸자는 심각한 성능 문제도 동반한다. finalizer를 사용한 클래스는 finalizer 공격에 노출되어 심각한 보안 문제를 일으킬 수도 있다. 그렇다면 파일이나 스레드 등 종료해야 할 자원을 담고 있는.. 2022. 1. 27.
아이템 7 - 다 쓴 객체 참조를 해제하라. 가비지 컬렉션을 사용한다고 해서 메모리 관리에 더 이상 신경 쓰지 않아도 되는 것은 절대 아니다. 가비지 컬렉션에서는 메모리 누수를 찾기가 아주 까다롭다. 객체 참조 하나를 살려두면 가비지 컬렉터는 그 객체가 참조하는 모든 객체를 회수하지 못한다. 이러면 악영향을 줄 수 있다. 해법은 간단하다. 해당 참조를 다 썼을 때, null 처리(참조 해제)하면 된다. 객체 참조를 null 처리하는 것은 예외적인 경우여야 한다. 프로그래머는 비활성 영역이 되는 순간 null 처리해서 해당 객체를 더는 쓰지 않을 것임을 가비지 컬렉터에 알려야 한다. 일반적으로 자기 메모리를 직접 관리하는 클래스라면 프로그래머는 항시 메모리 누수에 주의해야 한다. 캐시 역시 메모리 누수를 일으키는 주범이다. 객체 참조를 캐시에 넣고 .. 2022. 1. 27.
아이템 6 - 불필요한 객체 생성을 피하라. String.matches는 정규표현식으로 문자열 형태를 확인하는 가장 쉬운 방법이지만, 성능이 중요한 상황에서 반복해 사용하기엔 적합하지 않다. 성능을 개선하려면 필요한 정규표현식을 표현하는 Pattern 인스턴스를 클래스 초기화 과정에서 직접 생성해 캐싱해두고, 나중에 메소드가 호출될 때마다 이 인스턴스를 재사용한다. 불필요한 객체를 만들어내는 또 다른 예시는 오토박싱을 들 수 있다. 오토박싱은 프로그래머가 기본 타입과 박싱된 기본 타입을 섞어 쓸 때 자동으로 상호 변환해주는 기술이다. 오토박싱은 기본 타입과 그에 대응하는 박싱된 기본 타입의 구분을 흐려주지만, 완전히 없애주는 것은 아니다. 박싱된 기본 타입보다는 기본 타입을 사용하고, 의도치 않은 오토박싱이 숨어들지 않도록 주의하자. 관련 코드 h.. 2022. 1. 26.
아이템 5 - 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라. 사용하는 자원에 따라 동작이 달라지는 클래스에는 정적 유틸리티 클래스나 싱글턴 방식이 적합하지 않다. 대신 클래스가 여러 자원 인스턴스를 지원해야 하며, 클라이언트가 원하는 자원을 사용해야 한다. 인스턴스를 생성할 때 생성자에 필요한 자원을 넘겨주는 방식이 좋다. 핵심 정리 클래스가 내부적으로 하나 이상의 자원에 의존하고 그 자원이 클래스 동작에 영향을 준다면 싱글턴과 정적 유틸리티 클래스는 사용하지 않는 것이 좋다. 이 자원들을 클래스가 직접 만들게 해서도 안 된다. 대신 필요한 자원을 생성자에 넘겨주자. 의존 객체 주입이라 하는 이 기법은 클래스의 유연성, 재사용성 테스트 용이성을 기막히게 개선해준다. 관련 코드 https://github.com/Soobinhand/effective_java/tree.. 2022. 1. 26.
728x90