본문 바로가기

Programming/JAVA

컬렉션 프레임워크(2) - List 컬렉션 4 : Vector

JAVA logo image

 

 

 

 

Vector는 기본적으로 ArrayList와 동일한 구조를 갖고 있습니다. 그래서 생성, 사용 방식 자체는 ArrayList와 크게 다르지 않습니다. 

 

List<E> list = new Vector<E>();

 

 

그럼, ArrayList와 동일한 형태인데 굳이 Vector를 사용해야 하는 이유가 있을까요? 간단하게 요약하면, 이것은 Thread Safe -  즉, 스레드 상황에서 안전성을 보장하기 때문입니다. ArrayList와 다른 점은 Vector의 경우 동기화된(synchronized) 메서드로 구성되기 때문에 멀티 스레드일 경우, 동시에 이 메서드를 실행할 수 없다는 특징을 갖습니다.

 

즉, 하나의 스레드가 실행을 완료해야만 다른 스레드를 실행할 수 있다는 것이죠. 결국 멀티 스레드에서 안전하게 객체를 추가하거나 삭제할 수 있다는 장점을 갖게 됩니다. 하나 이상의 스레드가 동시에 접근하지 못하기 때문에, 멀티 스레드 상에서 안전한 객체 정보 처리가 필요할 경우에 사용하게 되지요.

 

아래의 예제를 통해서, [Board]라는 게시물에 대한 정보(게시물 1개) 객체가 있다고 가정하고, 이를 Vector를 통해서 관리하는 방법을 살펴보겠습니다.

 

 

 


 

 

 

public class Board {
	String subject;
	String content;
	String writer;
	
	public Board(String subject, String content, String writer) {
		this.subject = subject;
		this.content = content;
		this.writer = writer;
	}
}

 

 

import java.util.*;

public class ExampleMain {
	public static void main(String[] args) {
	
		List<Board> list = new Vector<Board>();
		
		list.add( new Board("제목1", "내용1", "글쓴이1") );
		list.add( new Board("제목2", "내용2", "글쓴이2") );
		list.add( new Board("제목3", "내용3", "글쓴이3") );
		list.add( new Board("제목4", "내용4", "글쓴이4") );
		list.add( new Board("제목5", "내용5", "글쓴이5") );
		
		list.remove(2);  // 제목3 삭제되고 뒤의 인덱스 하나씩 당겨짐
		list.remove(3);  // 3번 인덱스가 된 제목5 삭제
		
		for(int i = 0; i < list.size(); i++) {
			Board board = list.get(i);
			
			System.out.println(board.subject + "\t" + board.content + "\t" + board.writer);
		}
		
	}
}


/* 출력
제목1	내용1	글쓴이1
제목2	내용2	글쓴이2
제목4	내용4	글쓴이4
*/