책
-
아이템28. 배열보다는 리스트를 사용하라책/이펙티브자바 2021. 9. 1. 17:21
배열과 리스트의 차이점 1 배열은 공변(covariant)이다. (함께 변한다.) Sub가 Super의 하위 타입이라면 Sub[]는 Super[]의 하위 타입이 된다. 제네릭은 불공변(invariant)이다. (함께 변하지 않는다.) 서로 다른 타입 Type1, Type2가 있을 때, List은 List의 하위타입도 상위타입도 아니다. // 런타임에 실패한다. Object[] objectArray = new Long[1]; objectArray[0] = "타입이 달라 넣을 수 없다."; // ArrayStoreException을 던진다. // 컴파일에 실패한다. List ol = new ArrayList(); // 호환되지 않는 타입이다. ol.add("타입이 달라 넣을 수 없다."); 두 가지 방법 모..
-
아이템41. 정의하려는 것이 타입이라면 마커 인터페이스를 사용하라책/이펙티브자바 2021. 8. 31. 13:59
아무 메서드도 담고 있지 않고, 단지 자신을 구현하는 클래스가 특정 속성을 가짐을 표시해주는 인터페이스를 마커 인터페이스 (marker interface)라 한다. ex. Cloneable, Serializable // 그냥 비어있음. public interface Serializable { } 마커 애너테이션의 예 ex. @Override, @FunctionalInterface, @SafeVarargs, @Native Serializable 은 자신을 구현한 클래스의 인스턴스는 ObjectOutputStream 을 통해 쓸수(write) 있다고, 즉 직렬화(serialization) 할 수 있다고 알려준다. 마커 인터페이스는 두 가지 면에서 마커 애너테이션보다 낫다. 마커 인터페이스는 이를 구현한 클래..
-
아이템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..