C++ 환경에서 프로그래밍할 때, 자료구조는
보통 STL를 많이 활용하는데요
vector와 list 활용시 모두 사이즈를 유연하게 할당 할 수 있다는 장점 때문에
item들을 담을 때, 동적인 할당이 요구되는 상황에서 많이 사용하죠.
하지만 이 둘은 분명 차이가 있습니다.
vector 부터 설명드리면,
vector는 내부적으로 배열의 구조를 지니고 있습니다.
그래서 인덱스로 요소에 접근할 경우 상수시간으로 접근 할 수 있죠.
하지만, item들이 추가되거나 삭제를 할 때는
내부적으로 임시 배열을 생성해서 복사한다음
item들을 이동시키게 됩니다. 이런 경우, 비용이 많이 들게 되고 성능이 떨어지죠.
반면, list에서는
item들과의 연결이 포인터로 되어 있어
item의 추가와 삭제가 빠릅니다.
하지만, item들을 검색하는 시간은 o(n)의 비용이 발생하게 됩니다.
vector의 경우는 item들을 저장한 이후 변동이 별로 없다면 효과적이고
list의 경우 item의 추가 삭제가 많을 경우 유용하다고 할 수 있겠습니다.
Java에서도 둘의 자료구조는 동일하게 적용됩니다.
Vector와 LinkedList가 위의 경우와 같다고 생각할 수 있습니다.
단 , ArrayList는 LinkedList와 다르다는 점을 인식하셔야 합니다.
ArrayList는 Vector와 동일한 내부구조를 지니고 있고 다른 점은 멀티쓰레드로
공유자원으로 활용시 Vector는 한 쓰레드가 끝날 때까지 다른 쓰레드의 접근을 막는 동기화의 과정을 철저히 준수합니다.
ArrayList를 활용시 다른 쓰레드의 접근을 허용하지요.
성능을 생각하면 ArrayList이고
동기화의 과정이 준수되어야 하는 상황에서도 사실 ArrayList입니다 - _ -ㅋ;;
왜냐하면, Collection.synchronizedCollection(Collection c)로 동기화 옵션을 설정해줄 수 있기 때문입니다.
Vector는 자바 컬렉션 모델에서 초창기 모델이고 ArrayList는 wrapping된 버젼업 모델이기 때문에
Java에서는 Vector를 잘 사용하지 않는 상황입니다
'0x0001 > C, C++' 카테고리의 다른 글
[C언어] 주석 TIP (0) | 2019.02.09 |
---|---|
[C언어] n 에서 m 까지의 합을 재귀로 작정 (0) | 2019.02.09 |
[C++] 함수객체 ( Functor ) (0) | 2019.02.08 |
[C++] 콜백함수( CallBack Function ) (0) | 2019.02.08 |
[C++] 정적함수포인터, 멤버함수포인터 (0) | 2019.02.08 |