본문 바로가기

Java76

[이펙티브자바 3판] ITEM23. 태그 달린 클래스보다는 클래스 계층 구조를 활용하라 이번장의 핵심은... 태그 달린 클래스를 써야 하는 상황은 거의 없다 새로운 클래스를 작성하는 데 태그 필드가 등장한다면 태그를 없애고 계층 구조를 대체하는 방법을 생각해보자 기존 클래스가 태그 필드를 사용하고 있다면 계층 구조로 리팩터링하는 걸 고민해보자 태그 달린 클래스? 태그 달린 클래스가 뭔지 예제를 보자 // 태그 달린 클래스 - 클래스 계층 구조보다 훨씬 나쁘다! class Figure { enum Shape {RECTANGLE, CIRCLE}; // 태그 필드 - 현재 모양을 나타낸다 final Shape shape; // 사각형일 때만 쓰임 double length; double width; // 원일 때만 쓰임 double radius; // 원용 생성자 Figure(double radi.. 2020. 9. 30.
[이펙티브자바 3판] ITEM22. 인터페이스는 타입을 정의하는 용도로만 사용하라 이번장의 핵심은... 인터페이스는 타입을 정의하는 용도로만 사용하자 상수 공개용 수단으로 사용하지 말자 타입 역할 인터페이스는 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할이다 자신의 인스턴스로 무엇을 할 수 있는지 클라이언트에 얘기해주는 것이다 인터페이스는 오직 이 용도로만 사용해야 한다 상수 인터페이스 메서드 없이, 상수를 뜻하는 static final 필드로만 가득 찬 인터페이스를 말한다 이 상수들을 사용하려는 클래스에서는 정규화된 이름을 쓰는 걸 피하고자 그 인터페이스를 구현한다 인터페이스를 잘못 사용한 예를 보자 (상수 인터페이스 안티 패턴) // 상수 인터페이스 안티패턴 - 사용금지! public interface PhysicalConstants { static final dou.. 2020. 9. 28.
[이펙티브자바 3판] ITEM21. 인터페이스는 구현하는 쪽을 생각해 설계하라 이번장의 핵심은... 인터페이스를 설계할 때 세심한 주의를 기울여야 한다 디폴트 메서드 자바 8에 와서 기존 인터페이스에 메서드를 추가할 수 있도록 추가되었다 자바 8에서 람다를 활용하기 위해서 핵심 인터페이스들에 다수의 디폴트 메서드가 추가되었다 하지만 생각할 수 있는 모든 상황에서 불변식을 해치지 않는 디폴트 메서드를 작성하기란 어렵다 Collection 인터페이스의 removeIf default boolean removeIf(Predicate 2020. 9. 27.
[이펙티브자바 3판] ITEM20. 추상 클래스보다는 인터페이스를 우선하라 이번장의 핵심은... 일반적으로 다중 구현용 타입으로는 인터페이스가 가장 적합하다 복잡한 인터페이스라면 구현하는 수고를 덜어주는 골격 구현을 함께 제공하는 방법을 꼭 고려해보자 골격 구현은 '가능한 한' 인터페이스의 디폴트 메서드로 제공하여 그 인터페이스를 구현한 모든 곳에서 활용하도록 하는 것이 좋다 '가능한 한'의 이유는 인터페이스에 걸려 있는 구현상의 제약 때문에 골격 구현을 추상 클래스로 제공하는 경우가 더 흔하기 때문이다 추상 클래스가 정의한 타입을 구현하는 클래스는 반드시 추상 클래스의 하위 클래스가 되어야 한다 자바는 단일 상속만 지원하니, 추상 클래스 방식은 새로운 타입을 정의하는 데 커다란 제약을 가진다 반면, 인터페이스가 선언한 메서드를 모두 정의하고 그 일반 규약을 잘 지킨 클래스라면.. 2020. 9. 26.
[이펙티브자바 3판] ITEM19. 상속을 고려해 설계하고 문서화하라. 그러지 않았으면 상속을 금지하라 이번장의 핵심은... 상속용 클래스를 설계하는 것은 굉장히 어렵다 클래스 내부에서 스스로를 어떻게 사용하는지 문서화해야 하며, 문서화한 것은 그 클래스가 쓰이는 한 반드시 지켜야 한다 다른 이가 효율 좋은 하위 클래스를 만들 수 있도록 일부 메서드를 protected로 제공해야 할 수 있다 그러나 명확한 이유가 없다면 상속을 금지하는 것이 좋을 수 있다 상속을 금지하기 위해서 클래스를 final로 선언하거나, 생성자 모두 private 또는 package-private로 선언해 외부 접근을 제한해라 문서화 상속용 클래스는 재정의할 수 있는 메서드들을 내부적으로 어떻게 이용하는지 문서로 남겨야 한다 클래스 API로 공개된 메서드에서 클래스 자신의 또 다른 메서드를 호출할 수도 있다 호출되는 메서드가 재정의.. 2020. 9. 23.
[이펙티브자바 3판] ITEM18. 상속보다는 컴포지션을 사용하라 이번장의 핵심은... 상속은 코드를 재사용하는 강력한 수단이지만, 항상 최선은 아니다 잘못 사용하면 오류를 내기 쉬운 소프트웨어를 만들게 된다 안전한 상속과 위험한 상속이란? 안전한 상속 상위 클래스와 하위 클래스를 모두 같은 프로그래머가 통제하는 패키지 안에서 상속을 뜻한다 확장할 목적으로 설계되었고 문서화도 잘 된 클래스이다 위험한 상속 일반적인 구체 클래스를 패키지 경계를 넘어, 즉 다른 패키지의 구체 클래스를 상속하는 일을 뜻한다 메서드 호출과 달리 상속은 캡슐화를 깨뜨린다 상위 클래스가 어떻게 구현되느냐에 따라 하위 클래스의 동작에 이상이 생길 수 있다 확장을 충분히 고려하지 않으면 하위 클래스는 상위 클래스의 변화에 발맞춰 수정돼야만 한다 예제) HashSet을 만들어 추가된 원소의 수를 저장.. 2020. 9. 20.
[이펙티브자바 3판] ITEM17. 변경 가능성을 최소화하라 이번장의 핵심은... Getter가 있다고 무조건 Setter를 만들지 말자 클래스는 꼭 필요한 경우가 아니라면 불변이어야 한다 불변으로 만들 수 없는 클래스라도 변경할 수 있는 부분을 최소한으로 줄이자 다른 합당한 이유가 없다면 모든 필드는 private final 이어야 한다 생성자는 불변식 설정이 모두 완료된, 초기화가 완벽히 끝난 상태의 객체를 생성해야 한다 확실한 이유가 없다면 생성자와 정적 팩토리 외에는 그 어떤 초기화 메서드도 public으로 제공해서는 안 된다 객체를 재활용할 목적으로 상태를 다시 초기화하는 메서드도 안 된다 불변 클래스? 불변 클래스란 그 인스턴스 내부 값을 수정할 수 없는 클래스이다 (간직된 정보는 고정되어 객체가 파괴되는 순간까지 절대 달라지지 않는다) 자바 플랫폼 라.. 2020. 9. 19.