명료성과 단순성코드는 복사되는 게 아니라 재사용되어야 한다.컴포넌트 사이의 의존성은 최소로 유지해야 한다.인터페이스클래스배열기본 타입 ( Primitive type ): 프로그래머가 클래스, 인터페이스, 패키지를 통해 접근할 수 있는 모든 클래스, 인터페이스, 생성자,
잘 설계된 컴포넌트는 모든 내부 구현을 완벽히 숨겨, 구현과 API 를 깔끔히 분리한다. ⇒ 정보 은닉, 혹은 캡슐화라고 하는 이 개념은 소프트웨어 설계의 근간이 되는 원리다. 정보 은닉의 장점시스템 개발 속도를 높인다. 여러 컴포넌트를 병렬로 개발할 수 있기 때문이다
클래스와 인터페이스 선언에 타입 매개변수가 쓰이면, 이를 제네릭 클래스 혹은 제네릭 인터페이스라 한다. 로 타입이란 제네릭 타입에서 타입 매개변수를 전혀 사용하지 않을 때를 말한다. ex) List<E> 의 로 타입은 List 이다. 로 타입을 쓰면 제네릭이 안겨
아이템 10. equals 는 일반 규약을 지켜 재정의하라 각 인스턴스가 본질적으로 고유하다 인스턴스의 ‘논리적 동치성' 을 검사할 일이 없다. 상위 클래스에서 재정의한 equals 가 하위 클래스에도 딱 들어맞는다. 클래스가 private 이거나 packag
열거 타입은 일정 개수의 상수 값을 정의한 다음, 그 외의 값은 허용하지 않는 타입이다. 자바 열거 타입을 뒷받침하는 아이디어는 단순하다. 열거 타입 자체는 클래스이며, 상수 하나당 자신의 인스턴스를 하나씩 만들어 public static final 필드로 공개한다.
아이템 42. 익명 클래스보다는 람다를 사용하라 예전에는 자바에서 함수 타입을 표현할 떄 추상 메서드를 하나만 담은 인터페이스( 드물게는 추상 클래스 ) 를 사용했다. 자바 8에 와서 추상 메서드 하나짜리 인터페이스는 특별한 의미를 인정받아 특별한 대우를 받게 되
메서드와 생성자 대부분은 입력 매개변수의 값이 특정 조건을 만족하기를 바란다. ex) 인텍스 값은 음수이면 안된다, 객체 참조는 null 이 아니어야 한다. 자바 7에 추가된 java.util.Objects.requireNonNull 메서드는 유연하고 사용하기도 편하니
지역변수의 범위를 줄이는 가장 강력한 기법은 역시 ‘가장 처음 쓰일 때 선언하기’ 다.거의 모든 지역변수는 선언과 동시에 초기화해야 한다.초기화에 필요한 정보가 충분하지 않다면 충분해질 때까지 선언을 미뤄야 한다. 반복문은 독특한 방식으로 변수 범위를 최소화해준다. 예
예외는 오직 예외 상황에서만 써야 한다. 절대로 일상적인 제어 흐름용으로 쓰여선 안 된다.또한, 잘 설계된 API 라면 클라이언트가 정상적인 제어 흐름에서 예외를 사용할 일이 없게 해야 한다.상태 검사 메서드, 옵셔널, 특정 값 중 하나를 선택하는 지침외부 동기화 없이
synchronized 키워드는 해당 메서드나 블록을 한번에 한 스레드씩 수행하도록 보장한다. 동기화를 제대로 사용하면 어떤 메서드도 이 객체의 상태가 일관되지 않은 순간을 볼 수 없을 것이다. 동기화에는 중요한 기능이 하나 더 있다. 동기화는 일관성이 깨진 상태를 볼
객체 직렬화란 자바가 객체를 바이트 스트림으로 인코딩( 직렬화 )하고 그 바이트 스트림으로부터 다시 객체를 재구성( 역직렬화 )하는 메커니즘이다자바 직렬화의 근본적인 문제는 공격 범위가 너무 넓고 지속적으로 더 넓어져 방어하기 어렵다는 점이다. 역직렬화 과정에서 호출되