정적 멤버 클래스- 바깥 클래스와 함께 쓰일 때만 유용한 public 도우미 클래스- ex) Calculator.Operation.PLUS, Calculator.Operation.MINUS 비정적 멤버 클래스- 바깥 클래스의 인스턴스와 암묵적으로 연결된다 (정규화된 this, 클래스명.this 형태)- 어댑터를 정의할 때 자주 쓰인다 - Map 인터페이스의 구현체들은 보통 (keySet, entrySet, values 메서드가 반환하는) 자신의 컬렉션 뷰를 구현할 때 비정적 멤버 클래스를 사용한다 - Set과 List 같은 다른 컬렉션 인터페이스 구현들도 자신의 반복자를 구현할 때 비정적 멤버 클래스를 주로 사용한다- 멤버 클래스에서 바깥 인스턴스를 참조할 필요가 없다면 무조건 static을 붙여서 ..
상수를 정의하는 용도로 인터페이스를 사용하지 말 것- 클래스 내부에서 사용할 상수는 내부 구현에 해당- 내부 구현을 클래스의 API로 노출하는 행위가 된다- 클라이언트에 혼란을 준다 - 다음 릴리스에서 이 상수들을 더는 쓰지 않게 되더라도 바이너리 호환성을 위해 여전히 상수 인터페이스를 구현해야한다- ex) java.io.ObjectStreamConstants 등, 자바 플랫폼 라이브러리에도 상수 인터페이스가 몇 개 있으나, 따라해서는 안된다public interface PhysicalConstants { // 아보가드로 수 (1/몰) static final double AVOGADROS_NUMBER = 6.02214076e23; // 볼츠만 상수 (J/K) static final double BOL..
핵심 정리- 기존 인터페이스에 디폴트 메서드 구현을 추가하는 것은 위험한 일이다. - 디폴트 메서드는 구현 클래스에 대해 아무것도 모른 채 합의 없이 무작정 “삽입”될 뿐이다. - ex) 자바 8 Collection 인터페이스의 removeIf() 메서드를 재정의하지 않은 아파치의 SynchronizedCollection - SynchronizedCollection 인스턴스에서 removeIf()를 호출할 경우 ConcurrentModificationException이 발생하거나 다른 예기치 못한 결과로 이어질 수 있다default boolean removeIf(Predicate filter) { Objects.requireNonNull(filter); boolean removed = f..
인터페이스의 장점- 자바 8부터 인터페이스도 디폴트 메서드를 제공할 수 있다- 기존 클래스도 손쉽게 새로운 인터페이스를 구현해 넣을 수 있다- 인터페이스는 믹스인(mixin) 정의에 안성맞춤이다 - ex) Comparable, AutoCloseable, ...- 계층 구조가 없는 타입 프레임워크를 만들 수 있다 - ex) Singer, SongWriter 인터페이스를 상속받은 SingerSongWriter 인터페이스- 래퍼 클래스와 함께 사용하면 인터페이스는 기능을 향상시키는 안전하고 강력한 수단이 된다 (아이템 18)- 구현이 명백한 것은 인터페이스의 디폴트 메서드를 사용해 프로그래머의 일감을 덜어 줄 수 있다 인터페이스와 추상 골격(skeleton) 클래스- 인터페이스와 추상 클래스의 장점을 모두..
병행(Concurrency)과 병렬(Parallelism)의 차이- 병행은 여러 작업을 번갈아가며 실행해 마치 동시에 여러 작업을 동시에 처리하듯 보이지만, 실제로는 한 번에 오직 한 작업만 실행한다 (CPU가 1개여도 가능)- 병렬은 여러 작업을 동시에 처리한다 (CPU가 여러개 있어야 가능) java.util.concurrent 패키지- 병행(concurreny) 프로그래밍에 유용하게 사용할 수 있는 유틸리티 모음- 자바의 concurrent 패키지는 병행 애플리케이션에 유용한 다양한 툴을 제공한다 - BlockingQueue, Callable, ConccurentMap, Executor, ExecutorService, Future, ... CountDownLatch- 하나 이상의 스레드가 다른 스..
필요성불변 클래스는 가변 클래스보다 설계하고 구현하고 사용하기 쉬우며, 오류가 생길 여지도 적고 훨씬 안전하다 불변 클래스를 만드는 다섯 가지 규칙1. 객체의 상태를 변경하는 메서드를 제공하지 않는다2. 클래스를 확장할 수 없도록 한다 (final class)3. 모든 필드를 final로 선언한다 (JLS 17.5)4. 모든 필드를 private으로 선언한다5. 자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 한다 - 만약 제공해야 한다면 방어적인 복사 사용 불변 클래스의 장점과 단점- 함수형 프로그래밍에 적합하다 - 피연산자에 함수를 적용한 결과를 반환하지만 피연산자가 바뀌지는 않는다- 불변 객체는 단순하다- 불변 객체는 근본적으로 스레드 안전하여 따로 동기화할 필요 없다- 불변 객체는 안심하..

