책
-
아이템35. ordinal 메서드 대신 인스턴스 필드를 사용하라책/이펙티브자바 2021. 8. 28. 17:35
// 35-1. oridinal() 의 잘못된 사용 예 public enum Ensemble { SOLO, DUET, TRIO, QUARTET, QUINTET, SEXTET, SEPTET, OCTET, NONET, DECTET, ; public int numberOfMusicians() { return ordinal() + 1; } } 상수 선언 순서를 바꾸는 순간 메소드가 오작동한다. 이미 사용 중인 정수와 값이 같은 상수는 추가할 방법이 없다. 열거 타입 상수에 연결된 값은 oridinal() 로 얻지 말고, 인스턴스 필드에 저장하자. public enum Ensemble { SOLO(1), DUET(2), TRIO(3), QUARTET(4), QUINTET(5), SEXTET(6), SEPTET(7..
-
아이템34. int 상수 대신 열거 타입을 사용하라책/이펙티브자바 2021. 8. 28. 17:34
기존의 방식 타입 안전을 보장할 방법이 없다. 표현력이 좋지 않다. 동등 연산자 == 로 비교하더라도 아무런 경고가 없다. 문자열로 출력하기가 까다롭다. // 34-1. 정수 열거 패턴 public static final int APPLE_FUJI = 0; public static final int APPLE_PIPPIN = 1; public static final int APPLE_GRANNY_SMITH = 2; public static final int ORANGE_NAVEL = 0; public static final int ORANGE_TEMPLE = 1; public static final int ORANGE_BLOOD = 2; // 문자열 열거 패턴 public static final Stri..
-
아이템27. 비검사 경고를 제거하라책/이펙티브자바 2021. 8. 24. 11:53
비검사 경고 unchecked warning을 비검사 경고라고 하며 컴파일러 경고 정도라고 생각하면 된다. 대부분의 비검사 경고는 쉽게 제거할 수 있다. // ex.1 Set exaltation = new HashSet(); HashSet exaltation = new HashSet(); // ex.2 Set exaltation = new HashSet(); ex.1의 경우 컴파일러가 무엇이 잘못됐는지 알려주고 알려준 대로 수정하면 경고가 사라진다. ex.2를 보면컴파일러가 알려준 타입 매개변수를 명시하지않고, 자바 7부터 지원하는 다이아몬드 연산자()만으로 해결할 수 있다. 여기서 은 컴파일러가 올바른 실제 타입 매개변수(이 경우는 Lark) 를 추론해준다. 경고 제거하기 곧바로 해결되지 않는 경고가 ..
-
아이템26. 로 타입은 사용하지 말라책/이펙티브자바 2021. 8. 24. 11:52
제네릭 클래스와 인터페이스 선언에 타입 매개변수가 쓰이면, 이를 제네릭 클래스 혹은 제네릭 인터페이스라 한다. 제네릭 클래스와 제네릭 인터페이스를 통틀어 제네릭 타입(generic type) 이라 한다. 각각의 제네릭 타입은 일련의 매개변수화 타입(parameterized type) 을 정의한다. 예를들어, List은 원소의 타입이 String인 리스트를 뜻하는 매개변수화 타입이다. List, 여기서 String 이 정규(formal) 타입 매개변수 E 에 해당하는 실제(actual) 타입 매개변수이다. 로 타입의 단점 제네릭 타입을 하나 정의하면 그에 딸린 로 타입(raw type) 도 함께 정의된다. 로 타입이란 제네릭 타입에서 타입 매개변수를 전혀 사용하지 않을 때를 말한다. 예를들어, List 의..
-
아이템25. 톱레벨 클래스는 한 파일에 하나만 담으라책/이펙티브자바 2021. 8. 24. 11:52
소스 파일 하나에 톱레벨 클래스를 여러 개 선언하더라도 컴파일러는 불평하지 않지만 아무런 득이 없을 뿐더러 심각한 위험을 감수하는 행위다. 한 클래스를 여러가지로 정의할 수 있으며, 그 중 어느것을 사용할지는 어느 소스 파일을 먼저 컴파일 하느냐에 따라 달라지기 때문이다. 컴파일러에 어느 소스 파일을 먼저 건네느냐에 따라 동작이 달라진다. 결론 소스 파일 하나에는 반드시 톱레벨 클래스를 하나만 담자. 굳이 한 파일에 담고 싶다면 정적 멤버 클래스를 사용하자. (Item24)
-
아이템23. 태그 달린 클래스보다는 클래스 계층구조를 활용하라책/이펙티브자바 2021. 8. 24. 11:51
태그 달린 클래스 두 가지 이상의 의미를 표현할 수 있으며, 그 중 현재 표현하는 의미를 태그 값으로 알려주는 클래스를 태그 달린 클래스라고 한다. // 23-1. 태그 달린 클래스 public class Figure { enum Shape { RECTANGLE, CIRCLE }; // 태그 필드 - 현재 모양을 나타낸다. final Shape shape; // RECTANGLE 일때만 쓰인다. double length; double width; // CIRCLE 일때만 쓰인다. double radius; // 원용 생성자 Figure(double radius) { shape = Shape.CIRCLE; this.radius = radius; } // 사각형용 생성자 Figure(double length..
-
아이템22. 인터페이스는 타입을 정의하는 용도로만 사용하라책/이펙티브자바 2021. 8. 24. 11:50
클래스가 어떤 인터페이스를 구현한다 → 자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에 얘기해준다. 인터페이스는 오직 이 용도로만 사용해야 한다. 안티패턴 이 사용 용도에 맞지 않는 잘못된 예로 상수 인터페이스라는 것이 있다. public interface PhysicalConstants { static final double AVOGADROS_NUMBER = 6.022_140_857e23; static final double BOLTZMANN_CONSTANT = 1.380_648_52e-23; static final double ELECTRON_MASS = 9.109_383_56e-31; } 클래스 내부에서 사용하는 상수는 외부 인터페이스가 아니라 내부 구현에 해당하는데 상수 인터페이스를 구현하는..
-
아이템21. 인터페이스는 구현하는 쪽을 생각해 설계하라책/이펙티브자바 2021. 8. 24. 11:50
인터페이스에 새로운 메서드를 추가하는 방법 자바 8 이전 기존 구현체를 깨뜨리지 않고는 인터페이스에 메서드 추가할 방법이 없다. 자바 8 이후 디폴트 메서드가 추가되어 기존 인터페이스에 메서드 추가할 방법이 생겼다. 하지만 생각할 수 있는 모든 상황에서 불변식을 해치지 않는 디폴트 메서드를 작성하기란 어렵다. 디폴트 메서드의 문제점 디폴트 메서드는 (컴파일에 성공하더라도) 기존 구현체에 런타임 오류를 일으킬 수 있다. 디폴트 메서드는 인터페이스로부터 메서드를 제거하거나 기존 메서드의 시그니처를 수정하는 용도로 사용한다면 반드시 기존 클라이언트를 망가뜨리게 된다. 결론 기존 인터페이스에 디폴트 메서드로 새 메서드를 추가하는 일은 꼭 필요한 경우가 아니면 피해야 한다. 디폴트 메서드라는 도구가 생겼더라도 인..