책/이펙티브자바
-
아이템39. 명명 패턴보다 애너테이션을 사용하라책/이펙티브자바 2021. 8. 31. 13:57
명명패턴 예전에 주로 사용하던 패턴인데 JUnit3 에서 사용되었는데 테스트 이름을 test... 로 시작하게끔 하는 방식이었다. 효과적인 방법이지만 단점도 크다. 오타가 나면 안된다. 오타가 났을때 JUnit이 이 메서드를 무시하고 지나치기 때문에 이 테스트가 통과했다고 오해할 수 있다. 올바른 프로그램 요소에서만 사용되리라 보증할 방법이 없다. 예를들어 메소드가 아닌 클래스 이름을 TestSafetyMechanisms 로 지어 JUnit 에게 줬다면 작성한 개발자는 이 클래스에 정의된 테스트 메서드들을 수행해주길 기대하지만 JUnit은 클래스 이름에 관심이 없다. 경고 메시시조차 출력하지 않지만 의도한 테스트는 전혀 수행되지 않는다. 프로그램 요소를 매개변수로 전달할 마땅한 방법이 없다. 예를들어 특..
-
아이템50. 적시에 방어적 복사본을 만들라책/이펙티브자바 2021. 8. 30. 19:44
클라이언트가 불변식을 깨뜨리려 혈안이 되어 있다고 가정하고 방어적으로 프로그래밍해야 한다. // 50-1. 불변 클래스인가 ?? public final class Period { private final Date start; private final Date end; public Period(Date start, Date end) { if (start.compareTo(end) > 0) { throw new IllegalArgumentException( "start가 end보다 늦다." ); } this.start = start; this.end = end; } public Date getStart() { return start; } public Date getEnd() { return end; } } ..
-
아이템49. 매개변수가 유효한지 검사하라책/이펙티브자바 2021. 8. 30. 19:40
메소드와 생성자 대부분은 입력 매개변수의 값이 특정 조건을 만족하길 바란다. 예를들어. 인덱스 값은 음수이면 안되며, 객체 참조는 Null이 아니길 기대한다. 이 책에서 계속 꾸준히 하는 말인데 "오류는 가능한 한 빨리 잡아야 한다". 말하자면 메서드 body가 시작하는 부분에서 먼저 검사하라 이 말이다. 검사를 제대로 하지 않는다면 1. 메서드 수행 중간에 모호한 예외를 던질 수 있고, 2. 메서드가 잘 수행되지만 잘못된 결과를 반환할수 있고, 3. 문제없이 수행 되지만 어떤 객체를 이상한 상태로 만들어 놓아 미래에 알 수 없는 시점에 메서드와 관련없는 오류를 낼때다. 즉, 매개변수 검사에 실패하면 실패 원자성을 어기는 결과를 낳을 수 있다. public, protected 메서드는 (접근이 쉬운 편)..
-
아이템38. 확장할 수 있는 열거 타입이 필요하면 인터페이스를 사용하라책/이펙티브자바 2021. 8. 29. 12:02
열거 타입은 거의 모든 상황에서 타입 안전 열거 패턴보다 우수하다. 타입 안전 열거 타입 // 이전에 쓰던 방식 public final class Season { public static final Season SPRING = new Direction("SPRING"); public static final Season SUMMER = new Direction("SUMMER"); public static final Season FALL = new Direction("FALL"); public static final Season WINTER = new Direction("WINTER"); // ... } 열거 타입의 단점 타입 안전 열거 패턴은 확장이 가능하지만 열거 타입은 확장할 수 없다. enum 은 j..
-
아이템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 의..