🔍 Hash Table (또는 Hash Map)
해시 테이블은 키를 값에 매핑하는 효율적인 데이터 구조로, 해시 함수를 사용하여 데이터를 빠르게 검색하고 저장할 수 있습니다.
📌 주요 구성 요소:
1. 해시 함수(Hash Function):
• 키를 배열의 인덱스로 변환합니다.
• 좋은 해시 함수는 충돌을 최소화하고 키를 고르게 분포시킵니다.
2. 버킷(Bucket) 또는 슬롯(Slot):
• 배열의 각 요소로, 각 버킷에는 키-값 쌍이 저장됩니다.
3. 충돌 처리(Collision Handling):
• 충돌이 발생하면 다른 위치에 데이터를 저장하는 방법입니다.
• **체이닝(Chaining)**과 **개방 주소법(Open Addressing)**이 대표적인 방법입니다.
🔄 충돌 처리 방법:
1. 체이닝(Chaining):
• 충돌된 데이터를 링크드 리스트로 연결하여 같은 버킷에 저장합니다.
2. 개방 주소법(Open Addressing):
• 충돌이 발생하면 다른 빈 슬롯을 찾아 저장합니다.
• 선형 탐사(Linear Probing), 이차 탐사(Quadratic Probing), 이중 해싱(Double Hashing) 등이 있습니다.
🎯 해시 테이블의 장점:
• 빠른 검색: 평균적으로 O(1) 시간 복잡도로 검색, 삽입, 삭제가 가능합니다.
• 효율적인 메모리 사용: 배열 기반으로 메모리를 효율적으로 사용합니다.
⚠️ 해시 테이블의 단점:
• 충돌 문제: 충돌이 많아지면 성능이 저하될 수 있습니다.
• 해시 함수 설계의 어려움: 좋은 해시 함수를 설계하는 것은 어렵습니다.
• 메모리 사용의 비효율성: 메모리를 너무 많이 할당하면 공간 낭비가 될 수 있습니다.
🧬 Inheritance in Java
상속은 자바에서 클래스 간의 관계를 설정하는 중요한 메커니즘으로, 코드 재사용을 용이하게 합니다. 하지만 **생성자(Constructor)**는 상속되지 않으며, super 키워드를 통해 상위 클래스의 생성자를 호출할 수 있습니다.
📌 상속된 멤버에 대한 접근:
• public 및 protected 멤버는 서브클래스에서 상속됩니다.
• private 멤버는 상속되지 않으며, 서브클래스에서 접근할 수 없습니다.
🎯 서브클래스에서 멤버 숨기기(Hiding)와 섀도잉(Shadowing):
• 하이딩(Hiding): 서브클래스가 상위 클래스의 정적 변수 또는 정적 메서드를 다시 정의할 때 발생합니다.
• 섀도잉(Shadowing): 서브클래스가 상위 클래스의 인스턴스 변수와 동일한 이름의 변수를 선언할 때 발생합니다.
⚠️ 자바에서 다중 상속을 지원하지 않는 이유:
• **다이아몬드 문제(Diamond Problem)**를 방지하기 위해 자바는 다중 상속을 지원하지 않습니다.
• 다중 상속으로 인한 복잡성을 줄이고, 코드의 명확성을 유지하기 위함입니다.
🛠️ Deep Copy vs Shallow Copy
객체를 복사하는 방법에는 **딥 카피(Deep Copy)**와 **셸로우 카피(Shallow Copy)**가 있습니다. 이 두 가지 방법은 객체의 복사 방식과 결과에서 차이를 보입니다.
📌 셸로우 카피 (Shallow Copy):
• 모든 필드 값을 복사하지만, 참조 타입 필드는 동일한 객체를 참조하게 됩니다.
• 기본 제공 메서드 **Object.clone()**을 사용하면 셸로우 카피가 수행됩니다.
📌 딥 카피 (Deep Copy):
• 모든 필드 값을 복사하고, 참조 타입 필드도 재귀적으로 복사하여 독립적인 객체를 생성합니다.
• 딥 카피를 수행하려면 모든 참조 타입 필드에 대해 수동으로 복사를 구현해야 합니다.
⚖️ 어느 것을 사용할지 고민되나요?
• 객체의 독립성을 유지해야 한다면 딥 카피를 사용하세요.
• 그렇지 않다면 셸로우 카피로 충분할 수 있습니다.
이제 자바에서 해시 테이블, 상속, 객체 복사에 대한 이해도가 한층 깊어졌기를 바랍니다. 자바 마스터로 가는 길에 이 내용이 도움이 되기를 바라며, 다음 코딩에서 멋지게 활용해보세요! 💻🚀
'Java' 카테고리의 다른 글
리팩토링: 코드 최적화의 기술, 소수 구하기 (0) | 2024.07.10 |
---|---|
자바 인터페이스의 확장: 다재다능한 API 설계를 위한 디폴트 및 정적 메서드 활용 (0) | 2024.07.09 |
Interface, Type Casting, and the Power of hashCode & equals (0) | 2024.07.05 |
Nested Classes, Local Classes, Anonymous Classes, and Lambda Expressions (0) | 2024.07.04 |
Access Modifiers, Reference Types, and Abstract Classes (0) | 2024.07.03 |