전체 글
-
Item 22. 인터페이스는 타입을 정의하는 용도로만 사용하라Book/Effective Java 3E 2022. 11. 2. 21:00
인터페이스는 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할을 합니다. 인터페이스는 오직 이 용도로만 사용해야 합니다. 아래 상수 인터페이스 안티패턴은 인터페이스를 잘못 사용한 예입니다. package effectivejava.chapter4.item22.constantinterface; // 코드 22-1 상수 인터페이스 안티패턴 - 사용금지! public interface PhysicalConstants { // 아보가드로 수 (1/몰) static final double AVOGADROS_NUMBER = 6.022_140_857e23; // 볼츠만 상수 (J/K) static final double BOLTZMANN_CONSTANT = 1.380_648_52e-23; // 전자 질량 (..
-
Item 21. 인터페이스는 구현하는 쪽을 생각해 설계하라Book/Effective Java 3E 2022. 10. 29. 09:30
자바 8에서는 핵심 컬렉션 인터페이스들에 다수의 디폴트 메서드가 추가되었습니다. 주로 람다(7장 참조)를 활용하기 위해서입니다. 자바 라이브러리의 디폴트 메서드는 코드 품질이 높고 범용적이라 대부분 상황에서 잘 작동합니다. 하지만 생각할 수 있는 모든 상황에서 불변식을 해치지 않는 디폴트 메서드를 작성하기란 어려운 법입니다. // 코드 21-1 자바8의 Collection 인터페이스에 추가된 디폴트 메서드 default boolean removeIf(Predicate
-
Item 20. 추상 클래스보다는 인터페이스를 우선하라Book/Effective Java 3E 2022. 10. 29. 08:46
자바가 제공하는 다중 구현 메커니즘은 인터페이스와 추상 클래스, 이렇게 두가지입니다. 자바8부터 인터페이스도 디폴트 메서드(default method)를 제공할 수 있게 되어, 이제는 두 메커니즘 모두 인스턴스 메서드를 구현 형태로 제공할 수 있습니다. 인터페이스는 믹스인(mixin) 정의에 안성맞춤입니다. 믹스인이란 클래스가 구현할 수 있는 타입으로, 믹스인을 구현한 클래스에 원래의 '주된 타입' 외에도 특정 선택적 행위를 제공한다고 선언하는 효과를 줍니다. 예컨대 Comparable은 자신을 구현한 클래스의 인스턴스들끼리는 순서를 정할 수 있다고 선언하는 믹스인 인터페이스입니다. 추상 클래스로는 믹스인을 정의할 수 없습니다. 자바는 단일 상속만 지원하니, 클래스 계층구조에는 믹스인을 삽입하기에 합리적..
-
Item 19. 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라Book/Effective Java 3E 2022. 10. 26. 22:20
상속용 클래스는 재정의할 수 있는 메서드들을 내부적으로 어떻게 이용하는지(자기사용) 문서로 남겨야 합니다. '재정의 가능'이란 public과 protected 메서드 중 final이 아닌 모든 메서드를 뜻합니다. API 문서의 메서드 설명 끝에서 종종 "Implementation Requirements"로 시작하는 절을 볼 수 있는데, 그 메서드의 내부 동작 방식을 설명하는 곳입니다. 이 절은 메서드 주석에 @implSpec 태그를 붙여주면 자바독 도구가 생성해줍니다. @implSpec 태그는 자바 8에서 처음 도입되어 자바 9부터 본격적으로 사용되기 시작했습니다. 이 태그를 활성화하려면 명령줄 매개변수로 -tag "impleSpec:a:Implementation Requirements"를 지정해주면 됩..
-
Item 18. 상속보다는 컴포지션을 사용하라Book/Effective Java 3E 2022. 10. 22. 09:40
상속은 코드를 재사용하는 강력한 수단이지만, 항상 최선은 아닙니다. 이 책에서의 '상속'은 클래스가 다른 클래스를 확장하는 구현 상속을 말합니다. 메서드 호출과는 달리 상속은 캡슐화를 깨뜨립니다. 다르게 말하면, 상위 클래스가 어떻게 구현되느냐에 따라 하위 클래스의 동작에 이상이 생길 수 있습니다. 상위 클래스는 릴리스마다 내부 구현이 달라질 수 있으며, 그 여파로 코드 한 줄 건드리지 않은 하위 클래스가 오동작할 수 있다는 말입니다. 상위 클래스와 하위 클래스를 모두 같은 프로그래머가 통제하는 패키지 안에서라면 상속도 안전한 방법입니다. 확장할 목적으로 설계되었고 문서화도 잘 된 클래스(Item 19)도 마찬가지로 안전합니다. 하지만 일반적인 구체 클래스를 패키지 경계를 넘어, 즉 다른 패키지의 구체 ..
-
Item 17. 변경 가능성을 최소화하라Book/Effective Java 3E 2022. 10. 22. 08:30
불변 클래스란 간단히 말해 그 인스턴스의 내부 값을 수정할 수 없는 클래스입니다. 불변 인스턴스에 간직된 정보는 고정되어 객체가 파괴되는 순간까지 절대 달라지지 않습니다. 자바 플랫폼 라이브러리에도 다양한 불변 클래스가 있습니다. String, 기본 타입의 박싱된 클래스들, BigInteger, BigDecimal이 여기 속합니다. 불변 클래스는 가변 클래스보다 설계하고 구현하고 사용하기 쉬우며, 오류가 생길 여지도 적고 훨씬 안전합니다. 불변 클래스 작성 규칙 객체의 상태를 변경하는 메서드(변경자)를 제공하지 않는다. 클래스를 확장할 수 없도록 한다. 모든 필드를 final로 선언한다. 모든 필드를 private으로 선언한다. 자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 한다. 아래 클래스는 ..
-
Item 16. public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라Book/Effective Java 3E 2022. 10. 21. 21:30
아래 클래스는 데이터 필드에 직접 접근할 수 있으니 캡슐화의 이점을 제공하지 못합니다. class Point { public double x; public double y; } public 클래스라면 아래 방식이 확실히 맞습니다. 패키지 바깥에서 접근할 수 있는 클래스라면 접근자를 제공함으로써 클래스 내부 표현 방식을 언제든 바꿀 수 있는 유연성을 얻을 수 있습니다. package effectivejava.chapter4.item16; // 코드 16-2 접근자와 변경자(mutator) 메서드를 활용해 데이터를 캡슐화한다. class Point { private double x; private double y; public Point(double x, double y) { this.x = x; this...
-
Item 15. 클래스와 멤버의 접근 권한을 최소화하라Book/Effective Java 3E 2022. 10. 21. 21:00
잘 설계된 컴포넌트는 모든 내부 구현을 완벽히 숨겨, 구현과 API를 깔끔히 분리합니다. 오직 API를 통해서만 다른 컴포넌트와 소통하며 서로의 내부 동작 방식에는 전혀 개의치 않습니다. 정보 은닉, 혹은 캡슐화라고 하는 이 개념은 소프트웨어의 설계의 근간이 되는 원리입니다.[Parnas72] 정보 은닉의 장점 시스템 개발 속도를 높인다. 여러 컴포넌트를 병렬로 개발할 수 있기 때문이다. 시스템 관리 비용을 낮춘다. 각 컴포넌트를 더 빨리 파악하여 디버깅할 수 있고, 다른 컴포넌트로 교체하는 부담도 적기 때문이다. 정보 은닉 자체가 성능을 높여주지는 않지만, 성능 최적화에 도움을 준다. 완성된 시스템을 프로파일링해 최적화할 컴포넌트를 정한 다음, 다른 컴포넌트에 영향을 주지 않고 해당 컴포넌트만 최적화할..