# ch1 들어가기

# 밀도 있게 다룬 새로운 기능들

기능 도입된 자바 버전
람다 자바 8
스트림 자바 8
옵셔널 자바 8
인터페이스의 디폴트 메서드 자바 8
try-with-resources 자바 7
@SafeVarargs 자바 7
모듈 자바 9

# 핵심 기본 원칙과 모범사례

명료성과 단순성

  1. 컴포넌트는 사용자를 놀라게 하는 동작을 해서는 절대 안된다.
    • 정해진 동작이나 예측할 수 있는 동작만 수행해야 한다.
  2. 컴포넌트는 가능한 작되, 그렇다고 너무 작아서는 안된다
    • 이 책에서 컴포넌트란, 개별 메서드부터 여러 패키지로 이뤄진 복합한 프레임워크까지 재사용 가능한 모든 소프트웨어 요소를 의미함
  3. 코드는 복사되는 것이 아니라 재사용 되어야 한다.
  4. 컴포넌트 사이의 의존성은 최소로 유지해야 한다.
  5. 오류는 만들어지자마자 가능한 한 빨리(되도록 컴파일 타임에) 잡아야 한다.

# 책에서의 목표

성능보다는 프로그램의 명확함, 유용함, 견고함, 유연함, 유지보수 에 집중한다. 이러한 목표를 만족하는 코드를 작성했다면 대부분의 상황에선 원하는 성능에 도달하기 어렵지 않을 것임

# 예제코드

https://git.io/fAm6s

# 기술 용어

대부분 자바 8용 언어 명세를 따름

# 타입 type 자료형

4가지가 존재함.

# 참조타입

  1. 인터페이스 interface

    annotation 은 인터페이스의 일종

  2. 클래스 class

    enum(열거타입) 은 클래스의 일종

  3. 배열 array

클래스의 인스턴스와 배열은 객체(Object) 이다.

# 값 타입

  1. 기본타입 primitive

Object 가 아니다.

# 클래스의 멤버

  • 필드 field
  • 메서드 method
  • 멤버 클래스
  • 멤버 인터페이스

# 메서드 시그니처

컴파일러가 메서드들을 구분하는 기준

  • 메서드 이름 + 입력 매개변수들의 타입들
  • 반환값의 타입은 시그니처에 포함되지 않는다.

# 자바 명세를 따르지 않는 용어

  • 상속 inheritance
    → 서브클래싱 subclassing

  • 인터페이스 상속
    → 클래스가 인터페이스를 구현한다 implement
    → 인터페이스가 다른 인터페이스를 확장한다 extend

  • 패키지 접근 package access (아무것도 명시하지 않은 접근 수준 access level)
    → 패키지-프라이빗 package-private

# 자바 명세가 정의하지 않는 용어

  • 공개 API exported API (shorted API)

    • 프로그래머가 (1) 클래스, 인터페이스, 패키지통해 접근할 수 있는 모든 (2) 클래스, 인터페이스, 생성자, 멤버, 직렬화된 형태 를 의미함.

    (1) 이 (2) 를 포함하는 상황에서, (1) 을 통해 (2) 로 접근할 수 있음을 의미함

    • 모든 클라이언트가 접근가능
    • API 작성자가 지원하기로 약속한 API 요소들
  • API 의 사용자 user → API 를 사용하는 프로그램 작성자

  • API 의 클라이언트 client → API 를 사용하는 클래스(코드)

  • API 요소 API element(2) 클래스, 인터페이스, 생성자, 멤버, 직렬화된 형태를 총칭

  • 패키지의 공개 API

    • 그 패키지의 모든 public 클래스와, 인터페이스의 public 혹은 protected 멤버와 생성자로 구성됨
    • 자바 9 의 모듈 시스템의 개념을 적용하면, 해당 라이브러리의 모듈 선언에서 공개할 패키지를 선택할 수 있다.