분류 전체보기
-
아이템 57. 지역변수의 범위를 최소화하라책/이펙티브자바 2021. 9. 15. 22:01
"클래스와 멤버의 접근 권한을 최소화하라"의 취지와 비슷하다. 지역변수의 유효 범위를 최소로 줄이면 코드 가독성과 유지보수성이 높아지고 오류 가능성은 낮아진다. 지역변수 범위를 줄이는 방법 지역변수의 범위를 줄이는 가장 강력한 기법은 '가장 처음 쓰일 때 선언하기' 이다. 미리 선언해두면 가독성이 떨어지고, 실제 사용하는 시점엔 타입과 초깃값이 기억나지 않을 수도 있다. 범위를 제대로 제한하지 않으면 사용된 뒤에도 할당해제가 되지 않고 계속 메모리에 유지되어 GC가 변수를 수거하지 못하게 된다. 거의 모든 지역변수는 선언과 동시에 초기화해야 한다. 초기화에 필요한 정보가 충분하지 않다면 충분해질 때 까지 선언을 미뤄야 한다. try-catch문은 예외이다. 변수를 초기화하는 표현식에서 검사 예외를 던질 ..
-
아이템29. 이왕이면 제네릭 타입으로 만들라책/이펙티브자바 2021. 9. 1. 17:22
제네릭 타입을 새로 만드는걸 배워보자. 예시로 아이템 7에서 다룬 스택코드를 가져왔다. public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Object e) { ensureCapacity(); elements[size++] = e; } public Object pop() { if (size == 0) { throw new EmptyStackException(); } Object res..
-
아이템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 메서드는 (접근이 쉬운 편)..