목록책 정리/이펙티브 자바 3 (36)
초보개발자 긍.응.성

불변 클래스의 장단점과 생성 방법을 알아보자. 불변 클래스 불변 클래스는 인스턴스의 내부 값을 수정할 수 없는 클래스다. 이 정보는 객체가 파괴되는 순간까지 절대 달라지지 않는다. 불변 클래스의 예시로는 String, 기본 타입의 박싱 된 클래스, BigInteger, BigDecimal이 존재한다. 불변 클래스로 만들기 위한 규칙 객체의 상태를 변경하는 메서드(변경자)를 제공하지 않는다. 클래스를 확장할 수 없도록 한다. 모든 필드를 final로 선언한다. 모든 필드를 private로 선언한다. 자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 한다. public final class Complex { // final 클래스 - 확장 불가 private final double re; // 필드를 p..

기본적으로 java 파일마다 하나의 public 클래스를 생성한다. public 클래스에서 필드에 지정해야 할 접근자 타입에 대하여 알아보자. public 클래스 public 클래스는 패키지 바깥에서도 접근 가능하다. 그렇기에 public 클래스의 데이터 필드는 private 접근자를 이용하여 노출을 제한해줄 필요가 있다. public 클래스가 필드를 public으로 공개하면 클라이언트는 이를 활용하기 때문에, 접근 및 수정이 일어날 수 있다. 불변(final) 필드라면 public 으로 선언하더라도 수정이 일어나지 않겠지만, 여전히 API를 변경하지 않고는 표현 방식을 바꿀 수 없다는 단점이 존재한다. public 클래스 접근 제한 private 접근 제한자를 통해 필드를 공개하지 않도록 하고, 생성한..

정보은닉을 위해 사용하는 접근 제한자와, 접근 제한자의 사용법을 알아보자. 정보 은닉의 장점 여러 컴포넌트를 병렬로 개발하여 시스템 개발 속도를 높인다. 각 컴포넌트를 더 빨리 파악하여 디버깅 할 수 있고, 다른 컴포넌트로 교체하는 비용도 적기 때문에 시스템 관리 비용을 낮춘다. 성능 최적화에 도움을 준다. 소프트 웨어 재사용성을 높인다. 개별 컴포넌트들의 동작을 검증할 수 있기에, 큰 시스템을 제작하는 난이도를 낮춰준다. 접근 제한자 정보 은닉을 위해 자바에서는 접근 제한자를 활용한다. 기본 원칙: 모든 클래스와 멤버의 접근성을 가능한 한 좁혀야 한다 접근 제한자의 종류 private: 멤버를 선언한 톱레벨 클래스에서만 접근할 수 있다. package-private: 멤버가 소속된 패키지 안의 모든 클..

Comparable 인터페이스를 이용해야 할 때와 어떻게 사용해야 하는지 알아보자. Comparable Comparable 인터페이스는 오직 단 하나의 메서드 compareTo를 가진다. 이전 장에서 살펴본 Cloneable은 clone 메서드를 Object에 가지지만, 이와 달리 Comparable의 compareTo 메서드는 Object에 속하지 않는다. compareTo 메서드는 단순 동치성 비교에 더해 순서까지 비교할 수 있으며 제네릭하다. 그러므로 Comparable을 구현했다는 것은 그 클래스의 인스턴스들에는 자연적인 순서(nature order)가 있음을 뜻한다. public interface Comparable { public int compareTo(T o); } Comparable.co..

clone 메서드를 잘 동작하게 해주는 구현 방법과 주의할 점들에 대해 알아보자. Cloneable Cloneable은 복제해도 되는 클래스임을 명시하는 용도의 믹스인 인터페이스이다. 하지만 이 인터페이스는 의도한 목적을 잘 이루지 못하였다. 가장 큰 문제는 clone 메서드가 선언된 곳이 Cloneable이 아닌 Object이고 그 마저도 protected이다. 그렇기에 Cloneable을 구현하는 것만으로는 외부에서 clone 객체를 호출할 수 없다. 그럼에도 불구하고 Cloneable 방식은 많이 사용되고 있기 때문에 알아둘 필요가 있다. Cloneable을 구현한 클래스의 인스턴스에서 clone을 호출하면 그 객체의 필드를 하나하나 복사흔 객체를 반환하며, 그렇지 않은 클래스의 인스턴스에서 호출하..

toString을 잘 구현한 클래스는 사용하기에 훨씬 즐겁고, 그 클래스를 사용한 시스템은 디버깅하기 쉽다. Object의 기본 toString 메서드는 우리에게 적합한 문자열을 잘 반환해주지 않기 때문에 toString의 일반 규약에 따라 간결하면서 사람이 읽기 쉬운 형태의 유익한 정보를 반환하도록 재정의할 필요가 있다. toString 규약 실전에서 toString은 그 객체가 가진 주요 정보 모두를 반환하는 게 좋다. 만약 객체가 거대하거나 객체의 상태가 문자열로 표현하기에 적합하지 않다면 요약 정보를 담아 전달해 줄 수 있어야 한다. toString 포맷 toString을 구현할 때면 반환 값의 포맷을 문서화할지 정해야 한다. 반환 값을 포맷을 문서화하였다면 그 객체는 표준적이고, 명확하게 사람이..