본문 바로가기
반응형

이펙티브자바17

[아이템18] 상속보다는 컴포지션을 사용하라 이 내용은 이펙티브 자바 Effective Java 3/E 를 읽으면서 정리한 내용을 포함하고 있습니다. 상속은 코드를 재사용하는 강력한 수단이지만, 항상 최선은 아닙니다. 잘못 사용하면 오류를 내기 쉬운 소프트웨어를 만들게 됩니다. 상위 클래스와 하위 클래스를 모두 같은 프로그래머가 통제하는 패키지 안에서라면 상속도 안전한 방법입니다. 상속의 문제점 메소드 호출과 달리 상속은 캡슐화를 깨뜨리게 됩니다. 상위 클래스가 어떻게 구현되느냐에 따라 하위 클래스의 동작에 이상이 생길 수 있습니다. public class InstrumentedHashSet extends HashSet { // 추가된 원소의 수 private int addCount = 0; public InstrumentedHashSet() { .. 2022. 9. 18.
[아이템17] 변경 가능성을 최소화하라 이 내용은 이펙티브 자바 Effective Java 3/E 를 읽으면서 정리한 내용을 포함하고 있습니다. 불변 클래스란 간단히 말해 그 인스턴스의 내부 값을 수정할 수 없는 클래스입니다. 불변 인스턴스에 간직된 정보는 고정되어 객체가 파괴되는 순간까지 절대 달라지지 않습니다. 불변 클래스 규칙 객체의 상태를 변경하는 메소드(변경자)를 제공하지 않습니다. 클래스를 확장할 수 없도록 합니다. 상속을 막는 대표적인 방법은 클래스를 final로 선언하는 것입니다. 모든 필드를 final로 선언합니다. 시스템이 강제하는 수단을 이용해 설계자의 의도를 명확히 드러내는 방법입니다. 새로 생성된 인스턴스를 동기화 없이 다른 스레드로 건네도 문제없이 동작하게끔 보장하는 데도 필요합니다. 모든 필드를 private으로 선.. 2022. 9. 18.
[아이템16] public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라 이 내용은 이펙티브 자바 Effective Java 3/E 를 읽으면서 정리한 내용을 포함하고 있습니다. 인스턴스 필드들만 모아놓은 값 객체를 작성하는 경우가 종종 있습니다. 인스턴스 필드들만 모아놓은 객체 class Point { public double x; public double y; }이런 클래스는 단점은 다음과 같습니다. 데이터 필드에 직접 접근할 수 있으니 캡슐화의 이점을 제공하지 못합니다. API를 수정하지 않고는 내부 표현을 바꿀 수 없습니다. 불변식을 보장할 수 없으며, 외부에서 필드에 접근할 때 부수 작업을 수행할 수도 없습니다. 철저한 객체 지향 개발자는 이런 클래스를 상당히 싫어해서 필드들을 모두 private으로 바꾸고 public 접근자(getter)를 추가합니다. class .. 2022. 9. 18.
[아이템15] 클래스와 멤버의 접근 권한을 최소화하라 이 내용은 이펙티브 자바 Effective Java 3/E 를 읽으면서 정리한 내용을 포함하고 있습니다. 어설프게 설계된 컴포넌트와 잘 설계된 컴포넌트의 가장 큰 차이는 바로 클래스 내부 데이터와 내부 구현 정보를 외부 컴포넌트로부터 얼마나 잘 숨겼느냐입니다. 잘 설계된 컴포넌트는 모든 내부 구현을 완벽히 숨겨, 구현과 API를 깔끔히 분리합니다. 정보 은닉 또는 캡슐화라고 하는 이 개념은 소프트웨어 설계의 근간이 되는 원리입니다. 기본 원칙 모든 클래스와 멤버의 접근성을 가능한 한 좁혀야 합니다. 소프트웨어가 올바로 동작하는 한 항상 가장 낮은 접근 수준을 부여해야 한다는 뜻입니다. 가장 바깥이라는 의미의 톱레벨 클래스와 인터페이스에 부여할 수 있는 접근 수준은 package-private와 publi.. 2022. 9. 18.
[아이템14] Comparable을 구현할지 고려하라 이 내용은 이펙티브 자바 Effective Java 3/E 를 읽으면서 정리한 내용을 포함하고 있습니다. Comparable 인터페이스의 유일무이한 메서드인 compareTo 를 알아보도록 하겠습니다. compareTo 는 Object의 메서드가 아닙니다. equals와 거의 비슷하나 2가지가 다릅니다. 첫째는, compareTo는 단순 동치성 비교에 더해 순서까지 비교할 수 있습니다. 둘째는, 제네릭 합니다. Comparable을 구현했다는 것은 그 클래스의 인스턴스들에는 자연적인 순서가 있음으 뜻합니다. 그래서 Comparable을 구현한 객체들의 배열은 손쉽게 정렬할 수 있습니다. Arrays.sort(a);아래 코드는 중복을 제거하고 알파벳순으로 출력합니다. String이 Comparable을 구.. 2022. 9. 18.
[아이템13] clone 재정의는 주의해서 진행하라 이 내용은 이펙티브 자바 Effective Java 3/E 를 읽으면서 정리한 내용을 포함하고 있습니다. clone 메서드의 목적은 객체의 복제본(원본과 상태가 같은 별개의 객체)을 만드는 것입니다. clone 구현 clone 메서드를 정상적으로 구현하기 위해서는 Cloneable 인터페이스를 구현해야 합니다. @HotSpotIntrinsicCandidate protected native Object clone() throws CloneNotSupportedException;clone 메서드를 구현하지 않아도 되는가? clone은 Object 클래스에 정의되어 있습니다. 객체가 clone 메서드를 상속해도 clone 메서드의 접근제어자는 protected 이므로 메서드를 호출할 수 없습니다. clone .. 2022. 9. 18.
반응형