본문 바로가기

프로그래밍 언어 (プログラミング言語)/JAVA

Vector vs ArrayList vs Linkedlist의 차이점!!!

Vector란 무엇인가?

 

Vector 클래스 

  • java.util.Vector
  • List 인터페이스를 구현한 클래스
  • 객체들을 삽입삭제검색   있는 콘테이너 클래스
  • 배열의 길이 제한 단점을 극복
  • 아이템을  마지막이나 중간에 삽입할  있음
  • 객체수가 많아지면 자동으로 크기 조절

 

Vector 내부구조

  • add() 메소드로 요소 삽입
  • get() 메소드로 요소 검색
  • String, Integer, Person  다양한 타입의 객체 삽입 가능
  • 요소들은 인덱스로 관리 (0부터 시작) -> 배열로 구현

 

Vector 주요 메소드

  • add(E e) 벡터  뒤에 요소추가
  • add(int index, E e) : 지정된 인덱스에 지정된 객체 추가
  • capacity() : 벡터 현재 용량 반환
  • addAll(c) : c 지정하는 모든 요소 벡터  뒤에 추가
  • clear() : 벡터 모든 요소 삭제  
  • contains(Object o) : 벡터가 지정된 객체를 포함하고 있으면 true
  • elementAt(int index) : 지정된 인덱스 요소 반환
  • get(int index) : 지정된 인덱스 요소 반환
  • indexOf(Object o) : 지정된 객체와 같은  번째 요소 인스 반환없으면 -1 반ㄴ
  • isEmpty() : 벡터가 비어있으면 true
  • remove(int index) : 지정된 인덱스 요소 삭제
  • remove(Objcect o) : 지정된 객체와 같은 첫째 요소 벡터에서 삭제
  • removeAllElements() : 모돈 요소 삭제하고 크기를 0으로 만듬
  • size() : 벡터가 포함하는 요소의 개수 반환
  • toArray() : 벡터의 모든 요소를 포함하는 배열 반환
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// Integer 를 담는 Vector
Vector<Integer> integerVector = new Vector<Integer>();
integerVector.add(1); // 맨뒤에 요소 추가
integerVector.add(2);
integerVector.add(3);
integerVector.add(3,4); // 지정된 위치에 요소추가
System.out.println(integerVector); // [1, 2, 3, 4]
System.out.println(integerVector); // [1, 3, 4]
System.out.println(integerVector.capacity()); // 10 --> 벡터의 현재 용량 반환
integerVector.removeAllElements(); // 벡터의 모든요소 삭제 후 크기 0
System.out.println(integerVector); // []
System.out.println(integerVector.isEmpty()); // true
// String 을 담는 Vector
Vector<String> stringVector = new Vector<String>();
stringVector.add("Hello");stringVector.add("World");
stringVector.add(0,"Vector");
System.out.println(stringVector); // [Vector, Hello, World]
System.out.println(stringVector.get(j)); // Vector.get()}
 

 

 

 

ArrayList 란 무엇인가?

 

ArrayList 클래스

  • java.util.ArrayList<E>
  • 객체들을 삽입삭제검색할  있는 컨테이너 클래스.
  • 배열 길이 제한단점을 극복할  있다.
  • 객체수가 많아지면 자동으로 크기조절
  • 아이템을 벡터의 마지막이나 중간에 삽입할  있다.

 

ArrayList 내부구조

  • add() 메소드로 요소 삽입
  • get() 메소드로 요소 검색
  • String, Integer, Person  다양한 타입의 객체 삽입 가능
  • 요소들은 인덱스로 관리 (0부터 시작) -> 배열로 구현

 

 

ArrayList 주요 메소드 

 

  • aad(E e)  뒤에 요소추가
  • add(int index, E e) : 지정된 인덱스에 지정된 객체 추가
  • addAll(c) : c 지정하는 모든 요소 벡터  뒤에 추가
  • clear() : 모든 요소 삭제  
  • contains(Object o) : 지정된 객체를 포함하고 있으면 true
  • elementAt(int index) : 지정된 인덱스 요소 반환
  • get(int index) : 지정된 인덱스 요소 반환
  • indexOf(Object o) : 지정된 객체와 같은  번째 요소 인스 반환없으면 -1 
  • isEmpty() : 비어있으면 true
  • remove(int index) : 지정된 인덱스 요소 삭제
  • remove(Objcect o) : 지정된 객체와 같은 첫째 요소 벡터에서 삭제
  • size() : 포함하는 요소의 개수 반환
  • toArray() : 모든 요소를 포함하는 배열 반환
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Integer 를 담는 ArrayList
ArrayList<Integer> integerArrayList = new ArrayList<Integer>();
integerArrayList.add(1); // 맨뒤에 요소추가
integerArrayList.add(2); // 맨뒤에 요소추가
integerArrayList.add(3); // 맨뒤에 요소추가
integerArrayList.add(3,4); // 지정된 위치에 요소추가
System.out.println(integerArrayList); // [1, 2, 3 ,4]
for(int k=0; k<integerArrayList.size(); k++) { // Vector.size()
    System.out.println(integerArrayList.get(k)); // Vector.get()
}
System.out.println(integerArrayList); // [1, 3, 4]
System.out.println(integerArrayList); // []
System.out.println(integerArrayList.isEmpty()); // true
 

 

Vector 와 ArrayList의 설명이나 주요 메소드 그리고 동작 결과를 보았을 때 큰 차이를 느낄 수 없을 정도로 비슷했다.  생각해보면 ArrayList를 사용하는 것은 굉장히 많이 봤는데 Vector를 사용하는 경우는 거의 본적이 없는 것 같다.  둘은 왜 비슷한지.. 그리고 왜 ArrayList가 많이 사용되어 지는지를 알아보도록 하자.


http://tcpschool.com/java/java_collectionFramework_list

 

해당 링크의 Vector 에 관한 설명을 보도록 하자. 

 

Vector 클래스

  • JDK 1.0 부터 사용해왔다.
  • ArrayList 클래스와 같은 동작을 수행하는 클래스이다
  • ArrayList 마찬가지로 List 인터페이스를 상속받는다.

 

Vector 클래스에서 사용할  있는 메소드는 ArrayList 클래스에서 사용할  있는 메소드와 거의 같다하지만 Vector 클래스는 기존 코드와의 호환성을 위해서만 남아있으므로Vector 클래스 보다는 ArrayList 클래스를 사용하는 것이좋다

 

기억해 둘 것 

- Vector 와 ArrayList는 List 인터페이스를 상속받는다.

- 둘은 같은 동작을 수행하는 클래스이다.

- 사용하는 메소드가 거의 비슷하다. 

- Vector는 기존 코드와의 호환성을 위해 남아있다. 

- ArrayList 클래스를 사용하는 것이 좋다.

 

 

 

https://yeolco.tistory.com/94

해당 링크의 Vector 와 ArrayList 주요 차이점을 설명을 보도록 하자. 

 

  1. 동기화(Synchronize)
  • Vector  한번에 하나의 스레드만 접근 가능하다.
  • ArrayList 동시에 여러 스레드가 작업할  있다.
  1. 스레드 안전(Thread Safe)
  • 멀티 스레드 프로그래밍에서 여러 스레드가 동시에 접근이 이루어져도 프로그램 실행에 문제가 없음을 의미
  • Vector  동기화 되어있기 때문에 한번에 하나의 스레드만 접근할  있으므로 Thread Safe 하다.
  • ArrayList 동기화 되지 않았기 때문에 명시적으로 동기화  필요가 있다.
  1. 성능
  • ArrayList는 동기화 되지 않았기 때문에 Vector보다 빠르다.
  1. 크기증가
  • Vector 현재 배열의 크기의 100% 증가
  • ArrayList 현재 배열의 크기의 50% 증가

 

*멀티 스레드 환경이 아닌경우 ArrayList사용이 바람직하다.

 

Vector가 동기화 한다는 것은 복수의 스레드로부터 추가/삭제가 이루어져도 내부의 데이터 처리는 안전하게 한번에 하나의 스레드만 처리되도록 보장한다는 의미이다. 데이터 처리가 안정적으로 이루어지도록 보장하는 것이다. 

단일 스레드의 경우 자동으로 동기화를 보장하는 것이 오히려 성능 저하를 일으킬 수 있기 때문에 동기화를 진행하지 않는 ArrayList가 더 효율적인 성능을 보장한다고 할 수 있다. 

 

 

 

 

LinkedList 란 무엇인가?

LinkedList 클래스 

 

  • java.util.LinkedList<E> 
  • ArrayList  단점을 극복하기 위해 고안되었다.
  • 내부적으로 연결리스트 이용하여 요소를 저장한다.
  • List 인터페이스를 상속받기 때문에 ArrayList 메소드와 거의 같은 메소드를 사용할  있다.
  • 단일 연결 리스트(singly linked list) 
  • 이중 연결 리스트(doubly linked list)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Integer 를 담는 LinkedList
LinkedList<Integer> integerLinkedList = new LinkedList<Integer>();
integerLinkedList.add(1); // 맨뒤에 요소추가
integerLinkedList.add(2); // 맨뒤에 요소추가
integerLinkedList.add(3); // 맨뒤에 요소추가
integerLinkedList.add(3,4); // 지정된 위치 요소추가
System.out.println(integerLinkedList); // [1, 2, 3 ,4]
for(Integer e : integerLinkedList){
    System.out.println(e);
}
System.out.println(integerLinkedList); // [1, 3, 4]
System.out.println(integerLinkedList); // []
System.out.println(integerLinkedList.isEmpty()); // true
 

Vector - ArrayList - LinkedList는 사용방법이나 동작 결과에 큰 차이는 없다. 내부적으로 저장하는 방법이 다른것이고 그것을 구분하여 설명할 줄 아는것이 중요한 것 같다. 

 

 

 

정리 -

 


Vector와 ArrayList 그리고 LinkedList는 모두 같은 동작을 구현하는 클래스이며 List 인터페이스를 상속 받으므로 거의 비슷한 메소드를 사용한다. 사용방법과 동작 결과의 큰 차이는 없지만 내부 동작이 다르다. 

Vector와 ArrayList의 주요 차이점중 하나는 동기화이다. 
Vector는 내부적으로 여러개의 스레드가 접근 할 때 데이터 안정성을 위해 한개의 스레드씩 순차적으로처리할 수 있도록 동기화 되어있다. 안정성을 보장하는 만큼 일을 많이 처리한다는 의미이고 메모리를 많이 사용한다고 볼 수 있다. 
ArrayList는 동기화되어있지 않기때문에 여러개의 스레드에서 접근 할 때 필요에 따라 동기화 처리를 해주어야 한다. 

단일 스레드 작업시 동기화가 필요 없으므로 같은 동작을 하는 ArrayList를 사용하는 것이 성능적인 면에서 용이하다. 

현재 Vector는 기존 코드와의 호환성을 위해 남아있다는 이야기가 있다. 
Vector에서 자동으로 해주는 동기화 보다 ArrayList로 동기화를 직접 구현하는 것이 더 바람직하다는 의견도 있다. 
이부분에 대해서는 따로 동기화 관련된 부분을 공부해보면서 다시한번 정리해야겠다.

ArrayList 와 LinkedList의 내부 구조에 관련하여 다음 포스트에서 다시한번 정리해보도록 하겠다.