자바가 제공하는 다중 구현 메커니즘은 인터페이스와 추상 클래스가 있습니다. JAVA 8 부터는 인터페이스에서 defualt moethod를 제공할 수 있게 되어서 두 메커니즘 모두 인스턴스 메서드를 구현 형태로 제공할 수 있습니다. 추상 클래스와 인터페이스의 큰 차이점은 추상 클래스의 정의한 타입을 구현 클래스는 반드시 서브클래스가 된다는 점입니다. 자바에서는 단일 상속만 지원하기 때문에 이런 제약은 새로운 타입을 정의하는데 커다란 제약이 됩니다. 반면 인터페이스의 준수 사항을 잘 지키고 모든 메서드를 구현한 클래스는 어느 계층에 있든 인터페이스를 구현할 수 있습니다....
Effective Java 3E
[아이템 19] 상속을 고려해 설계하고 문서화하라. 그렇지 않았다면 상속을 금지하라
여기서 말하는 외부란 프로그래머의 통제권 밖에 있어서 언제 어떤식으로 변경될지 모른다는 뜻입니다. 상속을 고려한 문서화 상속용 클래스는 재정의할 수 있는 메서드들은 내부적으로 어떻게 이용하는지 문서로 남겨야 합니다. 클래스의 내부 동작 과정 중간에 끼어들 수 있는 훅(hook)을 잘 선별하여 protected메서드 형태로 공개하는 것도 고려해보는 것도 좋습니다. (한편으로 너무 적게 노출해서 상속으로 얻는 이점을 없애지 않도록 주의해야 합니다.) 상속용으로 설계한 클래스는 배포 전에 반드시 하위 클래스를 만들어 검증 해야 합니다. 상속을 허용하는 클래스가 지켜야 할 제약 상속용 클래스의 생성자는 직접적으로든 간접적으로든 재정의 가능 메서드를 호출해서는 안 됩니다....
[아이템 18] 상속보다는 컴포지션을 사용하라
우선 이번 아이템에서 다루는 상속은 클래스가 다른 클래스를 확장하는 것을 말합니다. 상속 같은 경우 상위 클래스가 구현 방식에 따라 하위 클래스 동작에 영향을 미칠 수 있습니다. 예제를 위한 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 public class CustomHashSet<E> extends HashSet<E> { private int addCount = 0; public CustomHashSet() { } @Override public boolean add(E e) { addCount++; System....
[아이템 17] 변경 가능성을 최소화하라
불변 클래스(Immutable Class)란 말 그대로 객체가 생성된 후에 더이상 값을 변경할 수 없는 것을 의미합니다. 자바에서는 대표적으로 String, Integer, Float,Long 등이 있습니다. 📌 클래스를 불변으로 만들기 위한 규칙 객체의 상태를 변경하는 메서드를 제공하지 않습니다. 클래스를 확장할 수 없도록 합니다. 모든 필드를 private final으로 선언합니다. 생성자 관리를 잘할 것 (밑에서 설명) 자신 외에는 내부에 가변 컴포넌트에 접근할 수 없도록 합니다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public final class Calculator { private final int x; private final int y; public Calculator(int x, int y) { this....
[아이템 16] public 클래스에서는 public 필드가 아닌 접근 메서드를 사용하라
1 2 3 4 5 // 부적적한 코드 public class Point { public int x; public int y; } 위 코드는 객체지향의 특징 중 하나인 캡슐화를 살리지 못했습니다. 다음과 같이 추상화의 이점을 살려서 코드를 수정할 수 있습니다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public class Point { public int x; public int y; public Point(int x, int y) { this....