상속4 [Effective Java] 아이템19 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라 ■ 상속을 고려한 문서화와 설계 우선 메서드를 재정의하면 어떤 일이 일어나는지를 정확히 정리하여 문서로 남겨야 한다. 즉, 상속용 클래스는 재정의할 수 있는 메서드들을 내부적으로 어떻게 이용하는지(자기사용) 문서로 남겨야한다. 클래스의 API로 공개된 메서드에서 클래스 자신의 또 다른 메서드를 호출할 수도 있다.(전 장의 addAll 예시) 그런데 재정의가 가능한 메서드라면 그 사실을 api 명세에 적시해야 한다. API문서의 메서드 설명 끝에서 종종 "Implementation Requiredments"로 시작하는 절을 볼 수 있다. 그 메서드 내부 동작 방식을 설명하는 곳이다. 이 절을 메서드 주석에 @implSpec 태그를 붙여주면 자바독 도구가 생성해준다. public boolean remove(.. 2021. 2. 23. [Effective Java] 아이템18 상속보다는 컴포지션을 사용하라 ■ 상속의 위험성 상위 클래스와 하위 클래스를 모두 같은 프로그래머가 통제하는 패키지 안에서라면 상속도 안전하다. 하지만 일반적인 구체 클래스를 패키지 경계를 넘어 다른 패키지의 구체 클래스를 상속하는 일은 위험하다. 상속은 상위 클래스가 어떻게 구현되느냐에 따라 하위 클래스의 동작에 이상이 생길 수 있다. 상위 클래스의 릴리스마다 내부 구현이 달라질 수 있으므로 하위 클래스가 오동작할 수 있다. 자신의 다른 부분을 사용하는 '자기 사용'여부는 해당 클래스의 내부 구현에 해당 되며 다음 릴리스에서도 유지될 수 알 수 없다. 하위 클래스에 추가한 새 메서드가 상위 클래스 다음 릴리즈에서 같은 시그니처를 가질 경우 컴파일도 되지 않는다. ■ 컴포지션 설계 상속의 문제점을 피하기 위한 방법으로 새로운 클래스를.. 2021. 2. 21. [Java] 17. 상속과 final 1. 상속과 관련된 예약어 'final' final은 클래스, 메소드, 변수에 선언할 수 있습니다. final이라는 단어의 뜻은 "마지막" 이라는 뜻입니다. 이 예약어를 클래스, 메소드, 변수가 어떻게 달라지는지 각각의 상황에 대해서 알아봅시다. 2. 클래스에 final을 선언할 때 클래스 선언시 final을 접근 제어자와 class예약어 사이에 추가할 수 있습니다. package c.impl; public final class FinalClass { } 이 FinalClass의 객체를 생성하고, 선언된 메소드를 사용하는 것은 전혀 상관 없습니다. 하지만, 클래스가 final로 선언되어 있으면 상속을 해 줄 수 없습니다. extends 키워드로 이 클래스를 상속 받고 컴파일을 해보면 상속을 받을 수 없다.. 2019. 4. 8. [Java] 11. 상속 1. 상속이란? 상속이란 말 그대로 자식이 부모로 부터 무언가를 물려 받는 것을 말합니다. 1 2 3 4 5 6 7 8 9 10 11 package c.inheritance; public class Parent { public Parent() { System.out.println("Parent Constructor"); } public void printName() { System.out.println("printName() - Parent"); } } Colored by Color Scripter 1 2 3 4 5 6 7 8 package c.inheritance; public class Child extends Parent{ public Child() { System.out.println("Child.. 2019. 3. 21. 이전 1 다음