이펙티브 자바 28

아이템 64 객체는 인터페이스를 사용해 참조하라

- 적합한 인터페이스가 있다면 매개변수, 반환값, 변수, 필드 전부 인터페이스 타입으로 선언하라. - 적합한 인터페이스가 없다면 클래스로 참조해야 한다. String, BigInteger 같은 값 클래스. 값 클래스를 여러 가지로 구현될 수 있다고 생각하고 설계하는 일은 거의 없다. 클래스 기반으로 작성된 프레임워크가 제공하는 객체들. (ex: OutputStream 등 java.io 패키지의 여러 클래스) 인터페이스에는 없는 특별한 메서드를 제공하는 클래스들. (ex: PirorityQueue) - 실전에서는 주어진 객체를 표현할 적절한 인터페이스가 있는지 찾아서 그 인터페이스로 참조하면 된다. - 인터페이스가 없다면 필요한 기능을 만족하는 가장 덜 구체적인(상위의)클래스를 타입으로 사용하자.

아이템 62 다른 타입이 적절하다면 문자열 사용을 피하라

- 문자열은 다른 값 타입을 대신하기에 적합하지 않다. - 열거타입(enum), 혼합타입(EX: String key = goodsNo + "#" + itmNo), 권한(capacity)은 문자열로 표현하기에 적합하지 않다. - 권한(capacity)에 적합한 방법 중 하나는 java의 ThreadLocal의 내부처럼 ThreadLocal 클래스 자체를 고유 key로 해서 클라이언트의 중복을 피하는 방법이 있다.

아이템 61 박싱된 기본 타입보다는 기본 타입을 사용하라

- 기본 타입과 박싱된 기본 타입의 주된 차이 세 가지 1. 기본 타입은 값만 가지고 있으나, 박싱된 기본 타입은 값에 더해 식별성(identity)이란 속성을 갖는다. 즉, 값이 같아도 서로 다르다고 식별될 수 있다. 2. 기본 타입의 값은 언제나 유효하나, 박싱된 기본 타입은 유효하지 않은 값, 즉 null을 가질 수 있다. 3. 기본 타입이 박싱된 기본 타입보다 시간과 메모리 사용면에서 더 효율적이다. - 박싱된 기본 타입이 적절하게 쓰이는 경우 컬렉션의 원소, 키, 값. 컬렉션은 기본 타입을 담을 수 없으므로 어쩔 수 없다.

아이템 58 전통적인 for 문보다는 for-each 문을 사용하라

- 무언가를 할 때 필요한 것이 원소 뿐이라면 인덱스 변수나 반복자들은 기능하는 곳 없이 오류 가능성을 높일 뿐이다. 그럴 때는 for-each 문을 사용하는 편이 낫다. - 그러나 for-each 문을 사용할 수 없는 상황이 세 가지 존재한다. 파괴적인 필터링(destructive filtering) - 컬렉션을 순회하면서 그 컬렉션의 원소를 제거. => ConcurrentModificationException이 발생한다. => Collection의 removeIf 메서드를 사용 public boolean removeIf(Predicate

아이템57 지역변수의 범위를 최소화하라

- 지역변수의 범위를 줄이는 가장 강력한 기법은 역시 '가장 처음 쓰일 때 선언하기'다. - 거의 모든 지역변수는 선언과 동시에 초기화해야 한다. - 반복자를 사용해야 하는 상황이면 for-each문 대신 전통적인 for문을 쓰는 것이 낫다. for의 괄호 안에 자동으로 반복하는 로직을 작성할 수 있기 때문이다. for (초기화식; 조건식; 증감식) { // 반복할 코드 블록 } - 변수를 반복문 종료 후에도 사용해야 하는 상황이 아니라면 변수 범위에 제한이 없는 while문 보다는 변수 범위를 최소화해주는 for문이나 for-each 형태를 쓰는 편이 낫다. 오류 가능성이 낮아진다. 그리고 컴파일 시점에도 오류를 잡을 수 있다. - 지역변수 범위를 최소화하는 마지막 방법은 메서드를 작게 유지하고 한 가..