Java/Effective Java
-
[Effective Java] Item 21. 인터페이스는 구현하는 쪽을 생각해 설계하라Java/Effective Java 2020. 9. 1. 21:03
자바 8 전에는 기존 구현체를 깨뜨리지 않고는 인터페이스에 메서드를 추가할 방법이 없었지만, 자바 8 이후에는 기존 인터페이스에 메서드를 추가할 수 있도록 디폴트 메서드를 지원하기 시작했습니다. 디폴트 메서드를 선언하면, 그 인터페이스를 구현한 후 디폴트 메서드를 재정의하지 않은 모든 클래스에서 디폴트 구현이 쓰이게 됩니다. 이처럼 자바에도 기존 인터페이스에 메서드를 추가하는 길이 열렸지만 모든 기존 구현체들과 매끄럽게 연동되리라는 보장은 없습니다. 디폴트 메서드로 인한 기존 구현 클래스의 호환성 위 코드는 Collection 인터페이스에 추가된 디폴트 메서드인 removeIf() 입니다. 이 메서드는 주어진 불리언 함수(predicate)가 true를 반환하는 모든 원소를 제거합니다. 범용성을 위해 추..
-
[Effective Java] Item 20. 추상 클래스보다는 인터페이스를 우선하라Java/Effective Java 2020. 8. 31. 23:56
자바가 제공하는 다중 구현 메커니즘 자바에서는 다중 구현 메커니즘은 인터페이스와 추상 클래스, 이렇게 두 가지입니다. 자바 8부터는 인터페이스도 디폴트 메서드(default method)를 제공할 수 있게 되었습니다. public interface Hello { default void say() { System.out.println("Hello World"); } } 이로써 인터페이스와 추상 클래스는 모드 인스턴스 메서드를 구현 형태로 제공이 가능합니다. 인터페이스와 추상 클래스의 차이 두 메커니즘의 차이는 추상 클래스가 정의한 타입을 구현하는 클래스는 반드시 추상 클래스의 하위 클래스가 되어야 한다는 점입니다. 자바는 단일 상속만 지원하니, 추상 클래스 방식은 새로운 타입을 정의하는 데 커다란 제약이 ..
-
[Effective Java] Item 19. 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라Java/Effective Java 2020. 8. 30. 22:29
재정의 가능한 메서드의 문서화 상속용 클래스는 재정의할 수 있는 메서드들을 내부적으로 어떻게 이용하지는지(자기사용) 문서로 남겨야 합니다. 클래스의 API로 공개된 메서드에서 클래스 자신의 또다른 메서드를 호출할 수도 있습니다. 그리고 그 호출되는 메서드가 재정의 가능 메서드라면 그 사실을 호출하는 메서드의 API 설명에 적시해야 합니다. 어떤 순서로 호출하는지, 각각의 호출 결과가 이어지는 처리에 어떤 영향을 주는지도 담아야 합니다. API 문서의 Implementation Requirements 메서드의 주석에 @implSpec 태그를 붙여주면 자바독 도구가 생성해줍니다. 좋은 API 문서란 '어떻게'가 아닌 '무엇'을 하는지를 설명해야 합니다. @implSpec 태그를 활성화하려면 명령줄 매개변수로..
-
[Effective Java] Item 18. 상속보다는 컴포지션을 사용하라Java/Effective Java 2020. 8. 29. 23:49
상속은 코드를 재사용하는 강력한 수단이지만, 잘못 사용하면 객체의 유연성을 해치는 설계를 하게 되는 결과를 초래할 수 있습니다. 상속이 캡슐화를 깨뜨리기 때문입니다. 상속은 하위 클래스가 상위 클래스에 대한 내부 구현 정보를 알게 합니다. 그리고 상위 클래스가 어떻게 구현되느냐에 따라 하위 클래스의 동작에 이상이 생길 수 있습니다. 상속을 잘못 사용한 예 import java.util.Collection; import java.util.HashSet; public class InstrumentedHashSet extends HashSet { //추가된 원소의 수 private int addCount = 0; public InstrumentedHashSet() {} public InstrumentedHas..