이 책의 핵심적인 기본 원칙
- 명료성(clarity)
- 단순성(simplicity)
컴포넌트
컴포넌트: 개별 메서드부터 여러 패키지로 이뤄진 복잡한 프레임워크까지 재사용 가능한 모든 소프트웨어 요소
컴포넌트는 정해진 동작이나 예측할 수 있는 동작만 수행해야 한다.
컴포넌트는 가능한 작되, 그렇다고 너무 작아서는 안된다.
컴포넌트 사이의 의존성은 최소로 유지해야 한다.
오류는 만들어지자마자 가능한 빨리 (되도록 컴파일타임에) 잡아야 한다.
위 규칙이 100% 옳을 순 없지만, 대부분의 적용되는 모범 사례일 것이다.
이 규칙을 생각없이 맹종하지 말고, 합당한 이유가 존재하면 어길 것
정석이 되는 규칙들을 마스터 한 후에 규칙을 어겨도 되는 경우를 다뤄야 한다.
기술 용어
위 책에서 기술 용어는 대부분 자바8용 언어 명세를 따른다.
자바가 지원하는 타입
- 인터페이스(interface)
- 클래스(class)
- 배열(array)
- 기본 타입(primitive type)
- 애너테이션(annotation)은 인터페이스의 일종
- 열거 타입(enum)은 클래스의 일종
- 1,2,3은 참조 타입(reference type)
클래스 멤버
- 필드(field)
- 메서드(method)
- 멤버 클래스
- 멤버 인터페이스
메서드 시그니처: 메서드 이름 + 입력 매개변수(parameter) -> 반환값의 타입은 시그니처에 포함 X
일부 용어는 자바 언어 명세와 다르게 사용
- 상속(inheritance) <- 동의어 -> 서브클래싱(subclassing)
- 인터페이스 상속 -> 클래스가 인터페이스 구현(implement)
- 인터페이스가 다른 인터페이스를 확장(extend)
- 접근 수준(access level): 패키지 접근(pacakge access) -> 패키지-프라이빗(package-private) 사용
자바 언어 명세가 정의하지 않는 기술 용어
- 공개 API(exported API -> 줄여서 API(Application Programming Interface)
- API: 프로그래머가 클래스, 인터페이스, 패키지를 통해 접근할 수 있는 모든 클래스, 인터페이스, 생성자, 멤버, 직렬화된 형태(serialized form)를 칭함
- 사용자(user): API를 사용하는 프로그램 작성자(사람)
- 클라이언트(client): API를 사용하는 클래스(코드)
- API 요소(API element): 클래스, 인터페이스, 생성자, 멤버, 직렬화된 형태를 총칭함
- 공개 API: 그 API를 정의한 패키지의 밖에서 접근할 수 있는 API요소로 이루어짐
- 모든 클라이언트가 접근할 수 있고, API 작성자가 지원하기로 약속한 API 요소
자바 9의 모듈 시스템
- 모듈 개념 적용하면 -> 공개 API는 ‘해당 라이브러리의 모듈 선언(module declaration)에서 공개하겠다고 한’ 패키지들의 공개 API만으로 이뤄짐
- 즉, 공개할 패키지를 선택 가능