본문 바로가기

백엔드 면접준비/Java

3. Java Collection Framework(JCF)

Java에서 Collection이란 데이터의 집합, 그룹을 의미하며 데이터 자료구조인 컬랙션과 이를 구현하는 클래스를 정의하는 인터페이스를 제공한다.

 

왜 Collection을 사용하는 것일까?
- 다수의 Data를 다루는데 표준화된 클래스를 제공해준다. 그래서 DataStructure(자료구조)를 직접 구현하지 않고 편하게 사용할 수 있다.
- 배열과 다르게 객체를 보관하기 위한 공간을 미리 정하지 않아도 되므로, 객체의 수를 동적으로 정할 수 있다.

 

JCF 상속구조

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. 

 

 

※ 자바 멀티 스레드 환경에서 컬렉션 활용할 때 스레드 세이프티한 방식으로 사용하게 하려면 어떤 식으로 사용해야하나요?

자바에서 멀티 스레드 환경에서 컬렉션을 안전하게 사용하는 방법은 여러 가지가 있으며, 상황에 따라 적합한 방법을 선택해야 합니다.

  1. Collections.synchronizedXXX(): 비스레드 안전 컬렉션을 동기화된 컬렉션으로 변환합니다.
  2. CopyOnWrite 계열 컬렉션: 읽기 작업이 빈번한 환경에서 유용합니다.
  3. Concurrent 컬렉션 (ConcurrentHashMap, CopyOnWriteArrayList, BlockingQueue 등): 멀티 스레드 환경에서 동시성이 필요한 작업에 적합합니다.

 

 

'백엔드 면접준비 > Java' 카테고리의 다른 글

2. Java 멀티쓰레드 환경(volatile, synchronized, atomic)  (1) 2025.02.02
1.JVM  (0) 2025.02.02