High Level Programming Language/Learning the Java Language(39)
-
null은 왜 "모든 참조 타입의 하위"로 간주되는가?
자바에서 흔히 "null은 모든 참조 타입의 하위 타입(subtype)"이라고 표현하는 이유는, 타입 계층 상의 직접적인 '하위 클래스'라는 뜻이 아니라, 타입 시스템에서 null 값이 모든 참조형 변수에 대입될 수 있기 때문입니다.즉, null은 특별한 리터럴로, 참조형 타입의 모든 변수에 할당할 수 있는 공통의 "값"이기 때문입니다. ✅ null은 왜 "모든 참조 타입의 하위"로 간주되는가?🔹 자바 타입 시스템 관점에서자바에서는 기본 타입(primitive type)을 제외한 모든 클래스, 배열, 인터페이스는 참조 타입(reference type)입니다.null은 이들 모든 참조 타입 변수에 할당할 수 있는 유일한 값입니다.String s = null;Number n = null;List list ..
2025.04.30 -
Type Inference 알고리즘의 원칙: '후반부 결과'를 사용하지 않는 이유
"추론 알고리즘은 프로그램 후반부의 결과를 사용하지 않습니다"라는 의미는 타입 추론(Type Inference)의 작동 방식을 이해할 때 중요한 개념입니다. 🔍 의미 해석: "프로그램 후반부의 결과를 사용하지 않는다"자바 컴파일러의 타입 유추(type inference) 알고리즘은, 어떤 expression의 타입을 결정할 때 항상 그 시점의 "앞 정보"만 보고 판단합니다.즉, "미래에 어떤 값이 될 것이다", "결국 어떤 타입이 될 것이다" 같은 후속 정보(후반부 결과)는 사용하지 않습니다.✅ 예시:List list = new ArrayList();위 코드에서는 ArrayList()의 타입 아규먼트를 명시하지 않았지만, 좌변이 List이라는 걸 보고 컴파일러는 ArrayList으로 타입을 유추합니다...
2025.04.30 -
Prime Number 17
자바에서 hashCode() 메서드 오버라이딩 시 흔히 사용되는 초기값 17 역시 단순한 임의의 숫자가 아니라, 컴퓨터 과학적·실무적 맥락에서 깊은 의미와 역할을 갖습니다. 🎯 핵심 요약hashCode()의 초기값으로 17을 사용하는 이유는, 해시코드 조합의 출발점을 예측 불가능하게 만들고, 필드 해시코드들의 충돌 가능성을 낮추기 위한 시드(seed) 역할을 하기 때문입니다. 📌 1. 해시코드에서 초기값의 역할은 무엇인가?✅ 해시코드 누적 합산 방식자바에서 다중 필드를 해시코드로 조합할 때는 다음과 같은 방식이 일반적입니다:int result = INITIAL; // 초기값result = 31 * result + field1; // 누적result = 31 * result + fiel..
2025.04.23 -
Prime Number 31
🔬 자바에서 hashCode() 구현 시 사용되는 숫자 31의 의미와 이유1. 서론 – hashCode()는 왜 중요한가?자바의 hashCode()는 단순한 도우미 메서드가 아닙니다. 이는 HashMap, HashSet, Hashtable과 같은 해시 기반 컬렉션의 핵심 엔진으로, 객체의 논리적 동일성 여부를 빠르게 판단하고, 해시 버킷을 정확하게 분배하는 역할을 합니다."좋은 해시코드란, 같은 객체에 대해서는 항상 같은 값을 반환하고, 다른 객체에 대해서는 해시 충돌 없이 분산되는 값이어야 한다." 2. 해시코드 계산에 사용되는 상수 31의 정체🔹 기본 구현 형태@Overridepublic int hashCode() { int result = 17; result = 31 * result ..
2025.04.23 -
equals() 메서드의 5대 계약 원칙
자바에서 equals() 메서드를 오버라이딩할 때 반드시 따라야 하는 "5대 계약 원칙(5 contracts of equals method)"은 객체의 논리적 동등성을 안정적으로 비교하기 위한 필수 조건들입니다. 이 계약들은 자바 API 문서(java.lang.Object.equals)에 명시되어 있으며, 컬렉션이나 정렬, 캐시, ORM 등 다양한 컴포넌트에서 올바른 동작을 보장하기 위해 절대 위반해서는 안 되는 규칙들입니다. 📌 equals() 메서드의 5대 계약 원칙1. 반사성 (Reflexivity)어떤 객체 x에 대해, x.equals(x)는 항상 true여야 합니다.자신과의 비교는 항상 참이어야 하며, 이는 기본적인 자기동일성 원칙입니다.위반하면 자료구조에서 무한 루프가 발생할 수도 있음.Pe..
2025.04.23 -
Object.equals()
🔍 1. 객체의 동일성 vs 동등성 – JVM 메모리 관점✅ 객체의 동일성 (Identity)== 연산자는 두 레퍼런스가 같은 힙 객체를 가리키는지를 비교합니다.즉, System.identityHashCode()가 같을 가능성이 높고, 힙 메모리 상의 주소가 동일하다는 것을 의미합니다.JVM 수준에서 동일한 object header를 공유하게 됩니다.A a1 = new A();A a2 = a1;System.out.println(a1 == a2); // true ✅ 객체의 동등성 (Equality)equals()는 논리적으로 같은지(동등한 값인지)를 비교합니다.두 객체가 서로 다른 힙 주소를 갖고 있어도, 논리적으로 같다고 판단할 수 있습니다.이 비교는 대부분 객체 내부의 필드 상태를 기준으로 수행됩니다..
2025.04.23