이펙티브 자바 3판7 [아이템 10] equals는 일반 규약을 지켜서 재정의하라. 이펙티브 자바 3장 - 모든 객체의 공통 메서드 [아이템 10] equals는 일반 규약을 지켜서 재정의하라. 1. equals를 재정의 하지 않는 것이 좋은 상황 상황 1. 각 인스턴스가 본질적으로 고유하다. 값을 표현하는 게 아니라 동작하는 개체를 표현하는 클래스 대표적으로 Thread 클래스가 좋은 예이다. 상황 2. 인스턴스의 '논리적 동치성'을 검사할 일이 없다. 논리적 동치성을 검사하는 예 : java.util.regex.Pattern에서 두 Pattern의 인스턴스가 같은 정규 표현식을 나타내는지 검사 상황 3. 상위 클래스에서 재정의한 equals가 하위 클래스에도 딱 들어맞는다. 상황 4. 클래스가 private이거나 package-private이고 equals 메서드를 호출할 일이 없다.. 2023. 4. 20. [아이템 7] 다 쓴 객체 참조를 해제하라. 이펙티브 자바 2장 - 객체의 생성과 파괴 [아이템 7] 다 쓴 객체 참조를 해제하라. GC가 다 쓴 객체를 회수해 간다고 메모리 관리에 신경을 안 쓰면 안된다 -> 해결책 : 해당 객체의 참조를 다 사용했을 때는 null 처리(참조 해체)를 하면 됨. 객체 참조를 null 처리를 하는 것은 아주 예외적인 상황에 발생해야 함 예외적인 상황 1 - 자기 메모리를 직접 관리하는 클래스라면 항상 메모리 누수에 주의해야 함. 원소를 다 사용한 즉시 그 원소가 참조한 객체들을 다 null 처리를 해줘야 함. 예외적인 상황 2 - 캐시 해결책 : WeakHashmap을 이용해서 캐시를 만듦 / 백그라운드 스레드를 활용 예외적인 상황 3 - 리스너, 콜백 해결책 : 약한 참조(weak reference)로 저장 2023. 4. 19. [아이템 6] 불필요한 객체 생성을 피하라. 이펙티브 자바 2장 - 객체의 생성과 파괴 [아이템 6] 불필요한 객체 생성을 피하라. 1. 똑같은 기능의 객체를 매번 생성하기보다는 객체 하나를 재사용하는 편이 나을때가 많다. 2. 똑같은 기능의 객체를 매번 생성하기보다는 객체 하나를 재사용하는 편이 나을때가 많다. Boolean(String) 생성자 대신 Boolean.valueOf(String) 팩터리 메서드를 사용하는 것이 좋음. 3. 생성 비용이 비싼 객체는 캐싱하여 재사용하는 것이 나을때가 많다. 이 메서드에서 사용하는 String.matches는 성능이 중요한 상황에서는 사용하기 적합하지 않음. matches 메서드 안에서 만드는 정규 표현식용 Pattern 인스턴스는 인스턴스 생성 비용이 높음. 따라서 Pattern 인스턴스를 캐싱해두고 .. 2023. 4. 18. [아이템 4] 인스턴스화를 막으려거든 private 생성자를 사용하라. 정적 메서드와 정적 필드만을 담은 클래스의 쓰임새 1. 기본 타입 값이나 배열 관련 메서드들을 모아놓을때 사용(java.lang.Math / java.util.Arrays) 2. 특정 인터페이스를 구현하는 객체를 생성해주는 정적 메서드를 모아놓을때 사용(java.util.Collections) 3. final 클래스와 관련한 메서드들을 모아놓을때 사용. 인스턴스화를 막는 방법 (문제) 정적 멤버만 가지는 클래스는 인스턴스로 만들려고 설계한 것이 아님. 하지만, 생성자를 명시하지 않으면 컴파일러가 자동으로 기본 생성자를 만들어줌으로, 인스턴스화 할 수 있는 클래스가 됨. (해결방법) private 생성자를 추가해서 클래스의 인스턴스화를 막을 수 있음. 하지만 직관적이지는 않으므로 적적한 주석을 달아주는 것.. 2023. 4. 18. [아이템 3] private 생성자나 열거 타입으로 싱글턴임을 보증하라. 이펙티브 자바 2장 - 객체의 생성과 파괴 [아이템 3] private 생성자나 열거 타입으로 싱글턴임을 보증하라. 싱글턴? 인스턴스를 오직 하나만 생성할 수 있는 클래스 [싱글턴을 만드는 방법] [방법 1] 생성자를 private으로 감추어둠. 유일한 인스턴스에 접근할 수 있는 수단으로 public static 멤버를 하나 마련해둠. [방법 2] 정적 팩터리 메서드 패턴 사용. 정적 팩터리 메서드를 public static 멤버로 제공함. [방법 3] 원소가 하나인 열거 타입을 선언하는 것 대부분 상황에서는 원소가 하나뿐인 열거 타입이 싱글턴을 만드는 가장 좋은 방법임. 2023. 4. 18. [아이템 2] 생성자에 매개변수가 많다면 빌더를 고려하라. 이펙티브 자바 2장 - 객체의 생성과 파괴 [아이템 2] 생성자에 매개변수가 많다면 빌더를 고려하라 정적 팩터리와 생성자의 동일한 제약 선택적 매개변수가 많을때 적절하게 대응하기 어려움. 대안책 1. 점층적 생성자 패턴 사용 점층적 생성자 패턴도 쓸 수 있지만, 매개변수 개수가 많아지면 클라이언트 코드를 작성하거나 읽기 어려울 수 있음. 대안책 2. 자바빈즈 패턴 자바빈즈 패턴에서는 객체 하나를 만들려면 메서드를 여러 개 호출해야 하고, 객체가 완전히 생성되기 전까지는 일관성이 무너짐. 클래스를 불변으로 만들 수 없으며, 스레드 안정성을 얻으려면 추가로 작업을 해줘야만 함. 대안책 3. 빌더 패턴 점층적 생성자 패턴의 안정성과 자바 빈즈 패턴의 가독성을 겸비한 빌더 패턴 메서드 호출이 흐르듯 연결된다는 .. 2023. 4. 18. [아이템 1] 생성자 대신에 정적 팩토리 메서드 패턴을 고려하라. 이펙티브 자바 2장 - 객체 생성과 파괴 [아이템 1] 생성자 대신에 정적 팩토리 메서드 패턴을 고려하라. 클라이언트가 클래스의 인스턴스를 얻는 방법 public 생성자 사용(전통적인 방법) 정적 팩터리 메서드(static factory method)(public 생성자 이외의 다른 방법) 그 클래스의 인스턴스를 반환하는 단순한 정적 메서드 public 생성자 대신에 정적 팩터리 메서드를 사용하는 것의 장점 이름을 가질 수 있다. 호출할 때마다 인스턴스를 새로 생성하지 않아도 된다. 반환 타입의 하위 타입 객체를 반환할 수 있는 능력이 있다. 인터페이스를 정적 팩터리 메서드의 반환 타입으로 사용하는 인터페이스 기반 프레임워크를 만드는 핵심 기술. 입력 매개변수에 따라서 매번 다른 클래스의 객체를 반환할 .. 2023. 4. 18. 이전 1 다음