관련 github 코드객체를 만들어야 할 때와 만들지 말아야 할 때를 구분하는 법올바른 객체 생성 방법과 불필요한 생성을 피하는 방법제때 파괴됨을 보장하고 파괴 전에 수행해야 할 정리 작업을 관리하는 요령클라이언트가 클래스의 인스턴스를 얻는 전통적인 수단은 public
equals()를 재정의했다면 반드시 hashCode()도 함께 재정의해야 합니다. 그렇지 않으면 HashMap, HashSet, HashTable 같은 해시 기반 컬렉션에서 정상적으로 동작하지 않게 됩니다.equals 비교에 사용되는 정보(핵심 필드)가 변하지 않는다
예를 들어 아래와 같은 Point 클래스가 있다고 해볼게요.이 클래스는 필드를 직접 공개(public) 하고 있어서외부에서 바로 x, y 값을 마음대로 변경할 수 있습니다.👉 즉, 캡슐화(encapsulation) 가 전혀 안 되어 있어요.그래서 이런 문제가 생깁니다
💡 아이템 20 - 추상 클래스보다 인터페이스를 우선하라 ✅ 자바의 다중 구현 메커니즘 자바는 인터페이스와 추상 클래스 둘 다 제공함 자바 8부터 인터페이스도 디폴트 메서드(default method) 지원함 → 인스턴스 메서드 구현 가능 즉, 인터페이스도 일정
컴파일러가 타입 검사를 못 한다 → 런타임 ClassCastException 발생 위험제네릭의 핵심 장점(타입 안정성, 형변환 생략)을 잃는다.제네릭 이전 코드와의 호환성을 위해 존재 (erasure + raw type 지원)모든 타입을 다루되 타입 안전성을 유지하고
🎯 아이템 31: 한정적 와일드카드를 사용해 API 유연성을 높이라 제네릭을 쓰다 보면 “아니 Integer가 Number의 하위 타입인데 왜 안 들어가?” 같은 상황이 종종 터진다. 그 핵심은 제네릭은 불공변(invariant) 이라는 점 때문이다. 이 문제를 해결
자바 초창기엔 상수를 public static final int로 만들어 쓰는 정수 열거 패턴(int enum pattern)이 흔했음.하지만 이 방식엔 문제가 많다.타입 안전성 없음APPLE 용 변수에 ORANGE 값을 넣어도 컴파일러가 막지 못함.네임스페이스 부재
자바 8에서는 함수형 인터페이스, 람다, 메서드 참조라는 개념이 추가되면서 함수 객체를 더 쉽게 만들 수 있게 됨. 이와 함께 스트림 api까지 추가됨! 아이템 42 - 익명 클래스보다는 람다를 사용하라 자바 8에 와서 추상 메서드 하나짜리 인터페이스는 특별한 의미를
✅ Item 49. 매개변수가 유효한지 검사하라 1. 왜 매개변수 검사가 중요한가? ✔ 메서드는 잘못된 입력을 절대 받아들이면 안 된다. 매개변수가 유효하지 않으면 즉시(fail-fast) 예외를 던져야 한다. 유효성 검사를 하지 않으면 다음 문제가 발생할 수 있
아이템 57 - 지역변수의 범위를 최소화하라 지역변수의 유효 범위를 최소로 줄이면 코드 가독성과 유지보수성이 높아지고 오류 가능성은 낮아진다. 지역변수의 범위를 줄이는 가장 강력한 기법은 '가장 처음 쓰일 때 선언하기'다. 거의 모든 지역변수는 선언과 동시에 초기화해야

아이템 69 - 예외는 진짜 예외 상황에만 사용하라 예외는 오직 예외 상황에서만 써야 한다. 절대로 일상적인 제어 흐름용으로 쓰여선 안 된다. 잘 설계된 API라면 클라이언트가 정상적인 제어 흐름에서 예외를 사용할 일이 없게 해야 한다.
여러 스레드가 가변 데이터를 공유한다면 그 데이터를 읽고 쓰는 동작은 반드시 동기화 해야 한다.동기화하지 않는다면 한 스레드가 수행한 변경을 다른 스레드가 보지 못할 수도 있다.배타적 실행은 필요 없고 스레드끼리의 통신만 필요하다면 volatile 한정자만으로 동기화할
이펙티브 자바에서 말하는 직렬화(Serializable) 는객체의 상태를 바이트 스트림으로 변환하는 것을 의미한다.반대로 바이트 스트림을 다시 객체로 복원하는 과정은 역직렬화다.바이트 스트림을 사용하는 이유는네트워크, 파일, DB 등 출발지와 목적지 모두가 이해할 수