Effective Java73 [Effective Java] 아이템19 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라 ■ 상속을 고려한 문서화와 설계 우선 메서드를 재정의하면 어떤 일이 일어나는지를 정확히 정리하여 문서로 남겨야 한다. 즉, 상속용 클래스는 재정의할 수 있는 메서드들을 내부적으로 어떻게 이용하는지(자기사용) 문서로 남겨야한다. 클래스의 API로 공개된 메서드에서 클래스 자신의 또 다른 메서드를 호출할 수도 있다.(전 장의 addAll 예시) 그런데 재정의가 가능한 메서드라면 그 사실을 api 명세에 적시해야 한다. API문서의 메서드 설명 끝에서 종종 "Implementation Requiredments"로 시작하는 절을 볼 수 있다. 그 메서드 내부 동작 방식을 설명하는 곳이다. 이 절을 메서드 주석에 @implSpec 태그를 붙여주면 자바독 도구가 생성해준다. public boolean remove(.. 2021. 2. 23. [Effective Java] 아이템18 상속보다는 컴포지션을 사용하라 ■ 상속의 위험성 상위 클래스와 하위 클래스를 모두 같은 프로그래머가 통제하는 패키지 안에서라면 상속도 안전하다. 하지만 일반적인 구체 클래스를 패키지 경계를 넘어 다른 패키지의 구체 클래스를 상속하는 일은 위험하다. 상속은 상위 클래스가 어떻게 구현되느냐에 따라 하위 클래스의 동작에 이상이 생길 수 있다. 상위 클래스의 릴리스마다 내부 구현이 달라질 수 있으므로 하위 클래스가 오동작할 수 있다. 자신의 다른 부분을 사용하는 '자기 사용'여부는 해당 클래스의 내부 구현에 해당 되며 다음 릴리스에서도 유지될 수 알 수 없다. 하위 클래스에 추가한 새 메서드가 상위 클래스 다음 릴리즈에서 같은 시그니처를 가질 경우 컴파일도 되지 않는다. ■ 컴포지션 설계 상속의 문제점을 피하기 위한 방법으로 새로운 클래스를.. 2021. 2. 21. [Effective Java] 아이템17 변경 가능성을 최소화하라 ■ 불변 클래스란? 불변 클래스란 인스턴스의 내부 값을 수정할 수 없는 클래스다. 불변 클래스는 가변 클래스보다 설계하고 구현하기 쉬우며, 오류가 생길 여지도 적고 훨씬 안전하다. 불변 객체는 단순하며 생성된 시점의 상태를 파괴될 때까지 그대로 간직한다. ■ 불변 클래스 생성 규칙 객체의 상태를 변경하는 메서드를 제공하지 않는다. 클래스를 확장할 수 없도록한다. 클래스 final 선언 private 생성자 모든 필드를 final로 선언한다. 모든 필드를 private로 선언한다. 자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 한다. 생성자, 접근자, readObject 메서드 모두에서 방어적 복사를 수행하라. 다음은 불변 복소수 클래스이다. 이 클래스는 복소수(실수부, 허수부로 구성된 수)를 표현.. 2021. 2. 17. [Effective Java] 아이템16 public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라 가끔 인스턴스 필드들을 모아놓는 일 외에는 아무 목적도 없는 클래스를 볼 수 있다. 이런 클래스는 데이터 필드에 직접 접근할 수 있기 때문에 캡슐화의 이점을 제공하지 못한다. 따라서 API를 수정하지 않고는 내부 표현을 바꿀 수 없고, 불변식을 보장할 수 없다. 객체 지향 프로그래머라면 필드들을 모두 private로 바꾸고 public 접근자(getter)를 추가한다. Class Point{ public double x; public double y; } 아래 코드 처럼 패키지 바깥에서 접근할 수 있는 클래스라면 접근자를 제공함으로써 클래스 내부 표현 방식을 언제든 바꿀 수 있는 유연성을 얻을 수 있다. public 클래스가 필드를 공개하면 이를 사용하는 클라이언트가 생겨날 것이므로 내부 표현 방식을 마.. 2021. 2. 17. [Effective Java] 아이템15 클래스와 멤버의 접근 권한을 최소화하라 어설프게 설계된 컴포넌트와 잘 설계된 컴포넌트의 가장 큰 차이는 바로 클래스 내부 데이터와 내부 구현 정보를 외부 컴포넌트로부터 얼마나 잘 숨겼느냐다. API를 통해서만 다른 컴포넌트와 소통하고 서로의 내부 동작 방식에는 전혀 개의치 않는다. 이것을 정보은닉, 혹은 캡슐화라고 한다. ■ 정보 은닉의 장점 여러 컴포넌트를 병렬로 개발할 수 있기 때문에 시스템 개발 속도를 높인다. 컴포넌트를 더 빨리 파악하여 디버깅할 수 있고 다른 컴포넌트로 교체비용도 줄어든다. 정보 은닉이 성능을 높여주지는 않지만 성능 최적화에 도움을 준다. 다른 컴포넌트에 영향을 주지 않고 해당 컴포넌트만 최적화 가능 외부에 의존하지 않고 독자적으로 동작할 수 있는 컴포넌트라면 그 컴포넌트와 함께 개발되지 않은 낯선 환경에서도 유용하게.. 2021. 2. 17. [Effective Java] 아이템14 Comparable을 구현할지 고려하라 ■ Comparable 인터페이스 Comparable 인터페이스는 객체간 비교를 용이하게 해주는 인터페이스이다. 이 인터페이스를 구현한 객체들은 서로간의 비교 연산이 가능하다. Comparable을 구현한 객체들의 배열은 다음처럼 손쉽게 정렬할 수 있다. Arrays.sort(a); 자바 플랫폼 라이브러리의 모든 값 클래스와 열거타입이 Comparable을 구현했다. 알파벳, 숫자, 연대 같이 순서가 명확한 값 클래스를 작성한다면 반드시 Comparable 인터페이스를 구현하자. ■ compareTo Comparable 인터페이스의 유일한 메서드인 compareTo의 규약을 살펴 보겠다. 매개 변수 인스턴스와 자신의 인스턴스를 비교하도록 해야한다. 또한 자신의 인스턴스가 매개변수보다 작으면 음수, 같으면.. 2021. 2. 5. 이전 1 ··· 7 8 9 10 11 12 13 다음