Reference/Effective-Java

    [Effective-Java] Chapter4 #22. 인터페이스는 타입을 정의하는 용도로만 사용하라

    💡 인터페이스는 타입을 정의하는 용도로만 사용하라. 상수 공개용 수단으로는 사용하지 말자. 📌 안티 패턴 - 상수 인터페이스 public interface PhysicalConstants { // 아보가드로 수 static final double AVOGADROS_NUMBER = 6.022_140_857e23; // 볼츠만 상수 static final double BOLTZMANN_CONSTANT = 1.380_648_52e-23; // 전자 질량 static final double ELECTRON_MASS = 9.109_383_56e-31; } 메서드 없이, 상수를 뜻하는 static final field로만 가득 찬 인터페이스. 상수 인터페이스 안티패턴은 인터페이스를 잘못 사용한 예다. 클래스 내부에..

    [Effective-Java] Chapter4 #21. 인터페이스는 구현하는 쪽을 생각해 설계하라

    인터페이스의 세상은 2개로 나누어진다. "현재의 인터페이스에 새로운 메서드가 추가될 일은 영원히 없다"고 가정하고 모든 클래스를 작성하던 자바7까지의 세상과 인터페이스에 메서드를 추가할 수 있도록 디폴트 메서드가 제공된 세상이다. 📌 자바 8 이후의 인터페이스 default method가 추가되면서 새로운 인터페이스를 구현하지 않아서 발생하는 컴파일 에러를 잡을 수 있게 되었다. 하지만 default method에도 위험은 따른다. 자바 8의 Collection 인터페이스에 추가된 removeIf 메서드를 예로 생각해보자 이 메서드는 주어진 불리언 함수(predicate)가 true를 반환하는 모든 원소를 제거한다. 디폴트 구현은 반복자를 이용해 순회하면서 각 원소를 인수로 넣고 predicate를 호출..

    [Effective-Java] Chapter4 #20. 추상 클래스보다는 인터페이스를 우선하라

    자바가 제공하는 다중 구현 메커니즘으로 interface와 abstract class가 존재한다. 자바 8부터는 인터페이스에 default method를 지원하여 두 메커니즘 모두 인스턴스 메서드를 구현 형태로 제공할 수 있다. 둘의 가장 큰 차이는 추상 클래스가 정의한 타입을 구현하는 클래스는 반드시 추상 클래스의 하위 클래스가 되어야 한다. 이는 단일 상속만 지원하는 자바의 한계로 인해, 추상 클래스 방식은 새로운 타입 정의에 커다란 제약을 지게 된다. 하지만 인터페이스는 어떤 클래스를 상속했든 같은 타입으로 취급한다. 인터페이스 : 다중 상속이 가능하고 구현한 클래스와 같은 타입으로 취급. java8부터 default 메서드 제공 추상클래스 : 다중 상속 불가, 구현체와 상화관계에 있음. 📌 인터페..

    [Effective-Java] Chapter4 #19. 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라

    상속용 클래스는 재정의할 수 있는 메스드들을 내부적으로 어떻게 이용하는지(자기사용) 문서로 남겨야 한다. 📌 상속을 고려한 문서화 재정의 가능 메서드(public과 protected 중 final이 아닌 모든 메서드)를 호출할 수 있는 모든 상황을 문서로 남겨야 한다. 클래스의 API로 공개된 메서드에서 클래스 자신의 또 다른 메서드를 호출할 수 있는데, 마침 호출되는 메서드가 재정의 가능 메서드라면 그 사실을 호출하는 메서드의 API 설명에 적시해야 한다. (어떤 순서로 호출하며, 각각의 호출 결과가 이어지는 처리에 어떤 영향을 주는지도 담아야 한다.) API 문서의 메서드 설명 끝에서 종종 "Implementation Requirements"로 시작하는 절을 볼 수 있는데, 그 메서드의 내부 동작 방..