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

Java에서 스레드에 안전한(Thread-Safe) 컬렉션 클래스란?

스레드로부터 안전한(thread-safe) 클래스란, 여러 스레드가 동시에 해당 클래스의 메서드를 호출하더라도 클래스의 내부 상태와 메서드가 반환하는 값이 항상 올바르게 유지되는 것을 보장하는 클래스를 의미합니다.

Java에서 스레드 안전성을 제공하는 대표적인 컬렉션 클래스로는 Stack, Vector, Properties, Hashtable 등이 있습니다. 이들은 내부적으로 동기화(synchronization) 처리가 되어 있어 멀티스레드 환경에서도 데이터 일관성을 유지할 수 있습니다.

1. Stack 클래스

Java의 Stack 클래스는 LIFO(Last In First Out, 후입선출) 원리를 기반으로 하는 스택 자료구조를 구현한 클래스입니다. 이를 통해 push(삽입), pop(제거), peek(맨 위 요소 확인), search(검색), empty(비었는지 확인) 등 다양한 연산을 지원합니다.

예제 코드

import java.util.*;
public class StackTest {
    public static void main(String[] args) {
        Stack<Integer> stack = new Stack<Integer>();
        stack.push(5);
        stack.push(7);
        stack.push(9);
        Integer num1 = (Integer)stack.pop();
        System.out.println("꺼낸 요소는: " + num1);
        Integer num2 = (Integer)stack.peek();
        System.out.println(" 스택 맨 위의 요소는: " + num2);
    }
}

실행 결과

꺼낸 요소는: 9
 스택 맨 위의 요소는: 7

위 예제에서 가장 마지막에 삽입된 값 9가 먼저 꺼내지는 것을 통해 LIFO 방식이 어떻게 동작하는지 확인할 수 있습니다.

2. Vector 클래스

Vector 클래스는 저장 용량이 부족해질 때 필요에 따라 자동으로 크기가 늘어나는 객체 배열을 구현합니다. 일반 배열과 달리 크기를 미리 지정하지 않아도 되며, add(), remove(), get(), elementAt(), size() 등의 메서드를 지원합니다.

예제 코드

import java.util.*;
public class VectorTest {
    public static void main(String[] arg) {
        Vector vector = new Vector();
        vector.add(9);
        vector.add(3);
        vector.add("ABC");
        vector.add(1);
        vector.add("DEF");
        System.out.println("벡터의 내용은: " + vector);
        vector.remove(1);
        System.out.println("요소 삭제 후 벡터의 내용은: " + vector);
    }
}

실행 결과

벡터의 내용은: [9, 3, ABC, 1, DEF]
요소 삭제 후 벡터의 내용은: [9, ABC, 1, DEF]

참고: 현대적인 대안

Stack과 Vector는 Java 초기 버전부터 존재해 온 레거시(legacy) 클래스로, 모든 메서드에 동기화가 적용되어 있어 단일 스레드 환경에서는 불필요한 성능 저하가 발생할 수 있습니다. 최신 Java 개발에서는 성능과 확장성이 개선된 ConcurrentHashMap, CopyOnWriteArrayList, BlockingQueue 등 java.util.concurrent 패키지의 동시성 컬렉션을 사용하는 것이 권장됩니다.