본문 바로가기
책(독서)

[이펙티브자바] ~104p item 13~16

by DevJR 2020. 10. 12.

아이템 13 - clone의 재정의는 주의해서 진행하라

 

-> Cloneable 은 복제해도 되는 클래스임을 명시하는 용도의 인터페이스이나, 실제 복제 역할을 하는 메소드인 clone은 Cloneable이 아닌 Object 클래스에 선언되어 있어서 Cloneable만 구현한다고 해서 외부 객체에서 clone메소드를 호출 할 수는 없다. (리플렉션을 사용하면 가능할 수도 있으나, 100% 성공하지는 않는다고 함)

 

-> 결론적으로 Cloneable은 문제가 꽤 많다. clone메소드를 사용해서 복제하는 방법보다는 복사생성자(변환생성자), 복사팩터리(변환팩터리) 를 사용하는 편이 더 좋은 경우가 많다.

 

ex> 복사 생성자

public Burger(Burger burger) {... }

ex> 복사 팩터리

public static Burger newInstance(Burger burger) {...};

-> 자신과 같은 클래스를 인수로 받는 생성자와 팩터리, (인수를 인터페이스로 받으면, 복제할 때 구체화된 객체 타입으로 변환하여 리턴 가능하다.)

ex> HashSet을 인수로 받아서 TreeSet으로 복제

-> 배열의 경우는 clone을 사용하기에 딱 적합하다.

 

아이템 14 - Comparable을 구현할 지 고려하라

 

-> 순서를 고려해야 하는 값 클래스 작성시에는 Comparable 인터페이스를 구현하여 해당 인스턴스들을 손쉽게 정렬 가능하다.

-> Comparable 인터페이스의 유일한 메소드 compareTo 메소드에서는 필드 값을 비교하여 -1, 0, 1을 리턴하는데,

비교 연산시 '<' 나 '>' 등의 부등호 비교 연산자는 사용하지 않는다. compare 메소드나 Comparator 인터페이스가 제공하는 비교자 생성 메서드를 사용하여야 한다.

 

아이템 15 - 클래스와 멤버의 접근 권한을 최소화하라

 

-> 잘 설계된 컴포넌트는 모든 내부 구현을 완벽히 숨겨서, 구현과 API를 깔끔히 분리한다. 

    이를 정보 은닉, 또는 캡슐화 라고 부른다.

-> 이 캡슐화의 장점은 굉장히 많은데, 결국 이 캡슐화를 위해서는 모든 클래스와 멤버의 접근성을 가능한 좁혀야 한다.

-> 멤버(필드, 메서드, 중첩 클래스, 중첩 인터페이스) 접근 수준

   - private : 멤버를 선언한 톱레벨 클래스에서만 접근 가능

   - package-private : 멤버가 소속된 패키지 안의 모든 클래스에서 접근할 수 있다.

     (접근제한자 명시하지 않았을 때의 기본값, 인터페이스 멤버제외[기본 public])

   - protected : package-private의 접근 범위를 포함. 이 멤버를 선언한 하위 클래스에서도 접근 가능.

   - public : 모든 곳에서 접근 가능

 

-> public 클래스는 상수용 public static final 필드 외에는 어떠한 public 필드도 가져서는 안 된다.

-> public static final 필드가 참조하는 객체가 불변인지 확인하라.

 

아이템 16 - public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라

 

-> 제목이 곧 내용이다.

-> public 클래스는 절대 가변 필드를 직접 public 등으로 선언해서 노출하는 등의 우를 범하면 안된다,.

-> 불변필드(final)라면 노출해도 가변 필드보다야 덜 위험하지만 100%안심할 수는 없다.

-> 그러나 간혹 package-private클래스나 private 중첩 클래스(?)에서는 필드를 노출하는 편이 나을 때가 있다.