Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

자바 기존 컬렉션 vs 동시성(Concurrent) 컬렉션: 핵심 차이점 완벽 정리

자바 컬렉션이란?

자바에서 컬렉션(Collection)은 가장 중요한 개념 중 하나로, 자바가 강력한 언어로 자리 잡는 데 결정적인 역할을 했습니다. 컬렉션 프레임워크 덕분에 자바는 다양한 타입의 데이터를 편리하고 효율적으로 다룰 수 있으며, 생성·조회·수정·삭제(CRUD) 연산도 손쉽게 처리할 수 있습니다.

그러나 컬렉션이 멀티스레딩(multi-threading) 환경에 노출되면 성능이 저하되는 문제가 발생합니다. 전통적인 컬렉션은 멀티스레드 환경에 대한 지원이 부족하기 때문입니다. 이러한 한계를 극복하기 위해 자바는 동시성 컬렉션(Concurrent Collections)을 도입했으며, 이는 멀티스레딩 환경의 제약을 해소할 뿐만 아니라 여러 스레드가 데이터를 동시에 처리할 때의 성능까지 크게 향상시켰습니다.

기존 컬렉션과 동시성 컬렉션의 주요 차이점

다음은 전통적인 컬렉션(Traditional Collections)과 동시성 컬렉션(Concurrent Collections)의 핵심적인 차이점을 정리한 표입니다.

번호구분 기준기존 컬렉션 (Traditional)동시성 컬렉션 (Concurrent)
1스레드 안전성ArrayList, LinkedList, HashMap 등 자바 컬렉션의 대표적인 클래스들은 대부분 동기화(synchronized)되어 있지 않아, 멀티스레딩 환경에서 스레드 세이프(thread-safe)하지 않습니다.반면 동시성 컬렉션은 동일한 목적의 클래스들에 내부적으로 동기화를 구현하여, 해당 클래스들이 동기화될 뿐만 아니라 본질적으로 스레드 세이프하도록 설계되었습니다.
2락(Lock) 메커니즘Vector와 Stack처럼 기존 컬렉션에도 동기화된 클래스가 일부 존재하지만, 이들은 컬렉션 전체에 락을 걸기 때문에 성능과 실행 속도가 크게 저하됩니다.반면 동시성 컬렉션은 부분 락(partial locking) 개념을 도입하여, 멀티스레딩 환경에서 컬렉션의 일부 영역에만 락을 겁니다. 이를 통해 해당 환경에서의 성능과 실행 속도가 크게 향상됩니다.
3런타임 예외기존 컬렉션의 경우, 컬렉션을 순회(iteration)하는 도중 다른 스레드에서 해당 컬렉션을 수정하려고 하면 런타임 예외인 ConcurrentModificationException이 발생합니다.반면 동시성 컬렉션은 이러한 예외가 발생하지 않습니다. 즉, 동시성 컬렉션은 순회 중에도 컬렉션의 수정을 허용합니다.
4선호도위에서 언급한 이유들로 인해 기존 컬렉션은 멀티스레딩 환경에서 권장되지 않습니다.반면 동시성 컬렉션은 멀티스레딩 환경에서 우선적으로 선택되는 방식입니다.
5도입 시기기존 컬렉션은 자바의 레거시(legacy) 컬렉션 유형으로, 동시성 컬렉션보다 먼저 도입되었습니다.동시성 컬렉션은 JDK 1.5에서 java.util.concurrent 패키지와 함께 도입되었으며, 즉 기존 컬렉션보다 나중에 등장했습니다.

대표적인 동시성 컬렉션 클래스

JDK 1.5부터 제공되는 java.util.concurrent 패키지에는 다양한 동시성 컬렉션이 포함되어 있습니다.

  • ConcurrentHashMap: HashMap의 대체제로, 세그먼트 단위의 부분 락을 사용해 높은 동시성을 제공합니다.
  • CopyOnWriteArrayList: 수정 시 내부 배열을 복사하여 순회 중 변경 문제 없이 안전하게 사용할 수 있습니다.
  • BlockingQueue 계열(ArrayBlockingQueue, LinkedBlockingQueue 등): 생산자-소비자 패턴 구현에 적합하며, 요소가 없거나 가득 찼을 때 스레드를 대기 상태로 만듭니다.
  • ConcurrentLinkedQueue: 락을 거의 사용하지 않는 논블로킹(non-blocking) 알고리즘 기반의 큐입니다.

결론

단일 스레드 환경이라면 ArrayList, HashMap과 같은 기존 컬렉션으로도 충분히 효율적입니다. 하지만 여러 스레드가 동시에 데이터에 접근하는 환경이라면, 컬렉션 전체에 락을 거는 Vector나 Stack보다는 부분 락과 고도의 동시성 제어를 활용하는 동시성 컬렉션을 사용하는 것이 안전성과 성능 모두에서 훨씬 유리합니다. 따라서 애플리케이션의 스레드 환경을 정확히 파악하고, 그에 맞는 컬렉션을 선택하는 것이 중요합니다.