전체 글
-
아이템40. @Override 애너테이션을 일관되게 사용하라책/이펙티브자바 2021. 8. 31. 13:58
자바가 기본으로 제공하는 애너테이션 중 가장 중요한 것은 @Override 이다. @Override 는 메서드 선언에만 달 수 있으며, 이 애너테이션이 달렸다는 것은 상위 타입의 메서드를 재정의 했음을 뜻한다. // equals 메서드를 재정의 했다 ??? public boolean eqauls(Item40 item40) { return item40.x == x && item40.y == y; } 위 메서드는 equals() 를 재정의 한게 아니라 다중정의해버렸다. Objects.equals() 를 재정의 하기 위해선 매개변수 타입이 Object 여야 하는데 Item40 이다. 이러한 오류는 컴파일러가 찾아낼 수 있지만, 그러려면 Object.equals() 를 재정의한다는 의도를 명시해줘야한다. // ..
-
아이템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..