Java에서 Collection이란 데이터의 집합, 그룹을 의미하며 데이터 자료구조인 컬랙션과 이를 구현하는 클래스를 정의하는 인터페이스를 제공한다.
왜 Collection을 사용하는 것일까?
- 다수의 Data를 다루는데 표준화된 클래스를 제공해준다. 그래서 DataStructure(자료구조)를 직접 구현하지 않고 편하게 사용할 수 있다.
- 배열과 다르게 객체를 보관하기 위한 공간을 미리 정하지 않아도 되므로, 객체의 수를 동적으로 정할 수 있다.
1. List
List 인터페이스를 직접 @Override(오버라이드)를 통해 재정의할 수도 있다.
대표적인 구현체는 ArrayList, LinkedList가 있다.
※ 순서가 있는 데이터 집합으로 데이터의 중복을 허용
- ArrayList
- 각 데이터에 대한 인덱스(Index)를 가지고 있어 조회성능이 뛰어나다.
- LinkedList
- 다음 노드의 주소를 기억하고 있는 List로, 배열에 비해 삽입과 삭제가 빠르다.
- 하지만 검색의 경우 첫 번째 노드부터 탐색하기 때문에 속도가 느리다.
2. Map
Key(키) - Value(값)의 쌍으로 이루어진 데이터릐 집합으로, 데이터의 순서를 보장하지 않으며 Key(키)의 중복을 허용하지 않는다.
Value(값)의 중복은 허용한다.
※ Key에 대한 순서를 보장하기 위해서는 LinkedHashMap을 사용
- HashMap
- Key에 해시 함수를 적용하여 나온 Index에 Value를 저장한다.
- Key값에 중복과 순서가 보장되지 않으며 null값이 올 수 있다.
- HashTable
- HashMap보다는 느리지만 동기화를 지원한다.
- Key, Value값에 null을 넣으면 컴파일 에러가 발생한다.
- TreeMap
- Red-Black Tree 자료구조를 이용한 Map이다.
- Tree 구조이기 때문에 어느 정도 순서를 보장한다.
- 정렬된 순서대로 Key, Value를 저장하여 검색이 빠르다.
3. Set
value(값)에 대해서 중복된 값을 저장하지 않는다. 순서를 보장하지 않으며
순서를 보장하지 위해서는 LinkedHashSet을 사용한다.
※ 순서를 유지하지 않는 데이터 집합으로 데이터의 중복을 허용하지 않는다.
- HashSet
- 순서를 보장하지 않으며, 중복 값을 허용하지 않는다.
- 가장 빠른 임의접근 속도이고, 순서를 예측할 수 없다.
- TreeSet
- Red-Black Tree 자료구조를 사용한 Set이다.
- 정렬방법을 지정할 수 있다.
4. Stack & Queue (스택, 큐)
- Stack
- LIFO 방식: 가장 마지막에 추가된 요소가 가장 먼저 나온다.
- Queue
- FIFO 방식: 가장 먼저 추가된 요소가 가장 먼저 나온다.
※ HashMap<Key, Value>에서 Key값이 int, stream 등의 기본 타입이 아니라 특정 오브젝트 타입(ex. Dto)를 키로 넣을 대 주의해야할 점
1) hashCode()와 equals() 메소드 구현
해시 맵의 핵심 원리는 키에 대한 해시 값을 계산하고 이를 바탕으로 값을 빠르게 찾는 것입니다. 이때 키 객체의 hashCode()와 equals() 메소드가 중요합니다.
- hashCode(): 객체의 해시 코드 값을 계산합니다. 이 값은 객체를 해시 테이블에서 빠르게 찾는 데 사용됩니다. 같은 키를 사용하는 경우, hashCode() 값이 같아야 합니다.
- equals(): hashCode() 값이 같은 두 객체를 비교할 때 사용됩니다. hashCode()가 같더라도 equals()가 다르면 같은 키로 인식되지 않게 됩니다.
이 두 메소드를 잘못 구현하면 해시 맵이 예상대로 동작하지 않을 수 있습니다. 예를 들어, 두 객체가 동일한 내용이라도 equals()를 잘못 구현하면 두 객체가 동일한 키로 인식되지 않습니다.
2) 불변 클래스로 설계
객체가 변경 가능한(mutable) 상태일 때, 해시 맵에서 키로 사용하는 것은 위험할 수 있습니다.
예를 들어, 객체의 필드 값이 변경되면 hashCode() 값도 달라질 수 있습니다. 이럴 경우, 해시 맵 내부에서 해당 객체를 찾을 수 없거나 잘못된 버킷에 저장될 위험이 있습니다.
따라서, 키 객체는 불변(immutable)이어야 하는 것이 일반적인 권장 사항입니다.
ex.
※ 자바 멀티 스레드 환경에서 컬렉션 활용할 때 스레드 세이프티한 방식으로 사용하게 하려면 어떤 식으로 사용해야하나요?
자바에서 멀티 스레드 환경에서 컬렉션을 안전하게 사용하는 방법은 여러 가지가 있으며, 상황에 따라 적합한 방법을 선택해야 합니다.
- Collections.synchronizedXXX(): 비스레드 안전 컬렉션을 동기화된 컬렉션으로 변환합니다.
- CopyOnWrite 계열 컬렉션: 읽기 작업이 빈번한 환경에서 유용합니다.
- Concurrent 컬렉션 (ConcurrentHashMap, CopyOnWriteArrayList, BlockingQueue 등): 멀티 스레드 환경에서 동시성이 필요한 작업에 적합합니다.
'백엔드 면접준비 > Java' 카테고리의 다른 글
2. Java 멀티쓰레드 환경(volatile, synchronized, atomic) (1) | 2025.02.02 |
---|---|
1.JVM (0) | 2025.02.02 |