본문 바로가기

이펙티브자바35

[Effective Java] 아이템22 인터페이스는 타입을 정의하는 용도로만 사용하라 ■ 상수 인터페이스 인터페이스는 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할로만 사용해야한다. 이 지침에 맞지 않는 예로 상수 인터페이스가 있다. 상수 인터페이스란 상루르 뜻하는 static final 필드로만 가득 찬 인터페이스를 말한다. // 코드 22-1 상수 인터페이스 안티패턴 - 사용금지! (139쪽) public interface PhysicalConstants { // 아보가드로 수 (1/몰) static final double AVOGADROS_NUMBER = 6.022_140_857e23; // 볼츠만 상수 (J/K) static final double BOLTZMANN_CONSTANT = 1.380_648_52e-23; // 전자 질량 (kg) static final d.. 2021. 3. 1.
[Effective Java] 아이템21 인터페이스는 구현하는 쪽을 생각해 설계하라 ■ 인터페이스 디폴트 메서드 모든 상황에서 불변식을 해치지 않는 디폴트 메서드를 작성하기는 어렵다. 디폴트 메서드는 기존 구현체에 런타임 오류를 일으킬 수 있다. 인터페이스를 설계 할 때는 세심한 주의를 기울여야 한다. ■ 자바 8의 Collection 인터페이스에 추가된 디폴트 메서드 자바 8에서 추가된 Collection 인터페이스의 removeIf() 메서드는 Predicate의 결과에 따라 원소를 제거하는 함수이다. 범용적으로 구현되어 있지만 모든 Collection 구현체와 어우러지는 것은 아니다. default boolean removeIf(Predicate 2021. 3. 1.
[Effective Java] 아이템18 상속보다는 컴포지션을 사용하라 ■ 상속의 위험성 상위 클래스와 하위 클래스를 모두 같은 프로그래머가 통제하는 패키지 안에서라면 상속도 안전하다. 하지만 일반적인 구체 클래스를 패키지 경계를 넘어 다른 패키지의 구체 클래스를 상속하는 일은 위험하다. 상속은 상위 클래스가 어떻게 구현되느냐에 따라 하위 클래스의 동작에 이상이 생길 수 있다. 상위 클래스의 릴리스마다 내부 구현이 달라질 수 있으므로 하위 클래스가 오동작할 수 있다. 자신의 다른 부분을 사용하는 '자기 사용'여부는 해당 클래스의 내부 구현에 해당 되며 다음 릴리스에서도 유지될 수 알 수 없다. 하위 클래스에 추가한 새 메서드가 상위 클래스 다음 릴리즈에서 같은 시그니처를 가질 경우 컴파일도 되지 않는다. ■ 컴포지션 설계 상속의 문제점을 피하기 위한 방법으로 새로운 클래스를.. 2021. 2. 21.
[Effective Java] 아이템7 다 쓴 객체 참조를 해제하라 ■ 메모리 누수가 일어나는 예시 코드 자바언어처럼 가비지 컬렉터를 갖춘 언어로 넘어오면 다 쓴 객체를 알아서 회수해가니 메모리 관리를 더이상 신경쓰지 않는다고 착각할 수 있다. 다음 스택 코드를 살펴보면 스택에서 꺼내진 객체들은 가비지 컬렉터가 회수하지 않는다. 프로그램에서 그 객체들을 더이상 사용하지 않더라도 말이다. 이 스택이 다 쓴 참조를 여전히 가지고 있기 때문이다. 여기서 다 쓴 참조란 문자 그대로 앞으로 다시 사용하지 않을 참조를 뜻한다. public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Object[] ge.. 2021. 1. 17.
[Effective Java] 아이템3 private 생성자나 열거 타입으로 싱글턴임을 보증하라 1. 싱글턴(Singleton) 싱글턴이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다. 전역 변수이기 때문에 프로그램 내부에서 이 객체를 공유하며 사용한다. 싱글턴 생성 방식1 - public static final 방식 //public static final 필드 방식의 싱글턴 public class Elvis { public static final Elvis INSTANCE = new Elvis(); private Elvis(){...}; } private 생성자는 public static final 필드인 Elvis.INSTANCE를 초기화할 때 딱 한번 호출 public 이나 protected(같은 패키지 or 상속 받을 시 접근 가능) 생성자가 없으므로 Elivis 클래스가 초기화 .. 2021. 1. 13.