티스토리 뷰
Vector & ArrayList
Vector 와 ArrayList는 배열을 클래스로 구현하여 데이터를 추가하면 자동으로 메모리 공간이 늘어나는 장점이 있다.
배열의 특징을 가지고 있기 때문에 인덱스를 이용해서 데이터를 추출할 수 있다.
Vector 와 ArrayList는 배열을 클래스로 구현하여 데이터를 추가하면 자동으로 메모리 공간이 늘어나는 장점이 있다.
배열의 특징을 가지고 있기 때문에 인덱스를 이용해서 데이터를 추출할 수 있다.
공통점
- 순서가 있는 Collection
- List 인터페이스를 구현
- 데이터 중복 가능
- List 인터페이스를 구현
- 데이터 중복 가능
차이점
- Vector : 자동 동기화 보장
- ArrayList : 동기화를 보장하지 않음
- ArrayList : 동기화를 보장하지 않음
Vector : ArrayList에 동기화가 보장되도록 최적화한 클래스
ArrayList : 배열에 동적 메모리 증가 기능을 구현한 클래스
ArrayList 동기화 지원 방법
List list = Collections.synchronizedList(new ArrayList()); // Vector와 동일한 클래스
-질문-
채팅 서버 만들고 있는데...(동접 1000명 정도 생각중)
vector를 쓰는게 나은가요 아니면 arraylist 동기화해서 쓰는게 나은가요?
vector가 옛날꺼지만 동기화때문에 쓰려고 하는데..(채팅서버 특성상 멀티스레드 돌리거든요)
속도도 느리고 여러모로 구형이라......
arraylist동기화 하려니 만약 동기화해서 속도가 느려지면 그밥에 그나물 이라는 생각도 들고...
아니면 vector시대에 비해 컴속도도 빨라졌고 자바도 발전했으니
그냥 arraylist동기화 하는게 여러모로 더나은지..
그것도 아님 동기화시에 유리한 다른 벡터계열의 함수가 있는지요..
아니면 vector시대에 비해 컴속도도 빨라졌고 자바도 발전했으니
그냥 arraylist동기화 하는게 여러모로 더나은지..
그것도 아님 동기화시에 유리한 다른 벡터계열의 함수가 있는지요..
java는 1.5버전으로 하고 있습니다.
-답변-
어차피 Vector 나 ArrayList나 Serializable(직렬 선형구조(인덱스를 참조하는..))한 자료형이므로
색인 속도는 비슷하지 않을까 싶어요..
그리고 일정 수준이상 하드웨어면은 개미털만큼에 속도차이밖에 안날듯 싶네요..
더군다다 1000명정도 동접할 채팅서버면 따로 서버장비를 둘 필요없을 정도로 소규모니까
리소스때문에 뻣거나 할일은 거~~의 없을듯 싶습니다..
(네트워크가 받쳐주고 프로그램을 재대로 짰다고 가정하에...)
프로그램 즉 코딩하는 측면에 생각해 보면 List가 Vector 보단 쓰기 편하겠지요
Vector는 초기화에 사이즈를 주어야 하기 때문에 첨부터 메모리에 maximum 사이즈를
올려야 하고 만약 최대사이즈 이상일 경우에 동작하는 Exception 처리도 따라오겠네요..
List는 동적할당이므로 최대사이즈 없이 노드를 생성하여 붙이니까 클라이언트가
붙는만큼 메모리에 적재시킬 수 있으니까 자원관리측면에서 이득이지 않을까 싶네요
또한 노드를 릴리즈 시키면 자동으로 메모리 반환도 가능하구요
서버를 어떻게 구성할지는 모르겠지만 Request/Response 를 어떻게 구성할지도 생각해 봐야겠네요
동기식으로 할지 비동기식으로 할지....
동기 비동기에 따라서 서버구성도 다르게 구성되야겠고 Thread를 최대 몇개까지 어떻게
쓸껀지도 속도에 큰 요인이 되겠네요..
아무래도 Thread를 많이 붙이면 클라이언트와 거의 동기식 처리가 가능하겠지만
그만큼 자원할당이나 메모리관리 등이 복잡해질 우려가 있으니 잘 고민하시기 바랍니다.
비동기식이면 단순하게 스케쥴 관리를 위한 큐와 Send-Reciver 쓰레드로도 구성할 수 있겠네요..
색인 속도는 비슷하지 않을까 싶어요..
그리고 일정 수준이상 하드웨어면은 개미털만큼에 속도차이밖에 안날듯 싶네요..
더군다다 1000명정도 동접할 채팅서버면 따로 서버장비를 둘 필요없을 정도로 소규모니까
리소스때문에 뻣거나 할일은 거~~의 없을듯 싶습니다..
(네트워크가 받쳐주고 프로그램을 재대로 짰다고 가정하에...)
프로그램 즉 코딩하는 측면에 생각해 보면 List가 Vector 보단 쓰기 편하겠지요
Vector는 초기화에 사이즈를 주어야 하기 때문에 첨부터 메모리에 maximum 사이즈를
올려야 하고 만약 최대사이즈 이상일 경우에 동작하는 Exception 처리도 따라오겠네요..
List는 동적할당이므로 최대사이즈 없이 노드를 생성하여 붙이니까 클라이언트가
붙는만큼 메모리에 적재시킬 수 있으니까 자원관리측면에서 이득이지 않을까 싶네요
또한 노드를 릴리즈 시키면 자동으로 메모리 반환도 가능하구요
서버를 어떻게 구성할지는 모르겠지만 Request/Response 를 어떻게 구성할지도 생각해 봐야겠네요
동기식으로 할지 비동기식으로 할지....
동기 비동기에 따라서 서버구성도 다르게 구성되야겠고 Thread를 최대 몇개까지 어떻게
쓸껀지도 속도에 큰 요인이 되겠네요..
아무래도 Thread를 많이 붙이면 클라이언트와 거의 동기식 처리가 가능하겠지만
그만큼 자원할당이나 메모리관리 등이 복잡해질 우려가 있으니 잘 고민하시기 바랍니다.
비동기식이면 단순하게 스케쥴 관리를 위한 큐와 Send-Reciver 쓰레드로도 구성할 수 있겠네요..
-------------------------추가---------------------------------------
ArrayList와 Vector에 대해서 알려면 우선 Collection Framework 에 대해서 알아야 합니다.
왜 이걸 알아야 하느냐면 Vector는 자바 언어(J2SE)에 Collection Framework 가 도입되기 전부터 존재하던 클래스이고 ArrayList는 Collection Framework 와 함께 도입된것이기 때문이죠.
자바든 C든 파이썬이든 어떠한 종류의 프로그래밍 언어를 사용하든간에 현실 세계의 문제를 해결하다보면 가장 빈번하게 마주치는 문제가 바로 비슷한 종류의 대상들을 모아서 우선순위로 줄세우거나 분류하는 일입니다.
예를 들자면, 학교 행정 시스템의 경우 현실에 존재하는 학생을 Student라는 클래스로 묘사하고, 때에 따라서는 이 학생들의 리스트를 가지고 여러가지 작업을 하거나 수학같은데에서 보면 수의 집합처럼 중복되지 않도록 요소들을 간직해야한다거나, 또는 사내 직원들을 사번 순으로 출력하기 위해서 정렬을 한다거나...
이렇게 비슷한 요소들(학생, 사원, 숫자)들 모아서 어떤 조작을 하기 편하도록 보관해두는 것, 이것을 해결하기 위해서 자바 1.2인가(제 기억에는)... 이무렵에 collection framework라는게 도입이 됩니다.
그러면 1.2 이전에는 그런게 없었느냐? 하면 그렇지는 않습니다.
Collection framework 가 도입되기 전에도 이런 일을 하는 클래스가 있기는 했는데 그중 하나가 바로 Vector 클래스입니다.
당시만 해도 java 1.1인가... 아직 자바가 언어로서 확실히 성숙된 단계가 아니었기 때문에 위에서 언급한 빈번한 프로그래밍 상황을 지원하기 위해서 Vector와 HashTable이라는 클래스를 제공했는데, 기능은 상당히 조악했습니다. 항상 동기화 되어있어서 멀티쓰레드 환경이 아닌 곳에서 성능에 문제가 있었죠.
그래서 자바가 1.2로 버전업이 되면서 Collection Framework 가 나오고, 기존에 존재하던 Vector나 HashTable같은 클래스가 이 프레임워크의 구현체로 포함이 됩니다. 포함이 되긴 했는데, 사실 컬렉션 프레임워크에서 Vector를 대신할 ArrayList나 HashTable을 대신할 HashMap이 쓰이면서 사실상 거의 사용할 일이 없게 되어버렸습니다.
Vector와 HashTable은 컬렉션 프레임워크가 도입되기 전의 과도기적 상황에서 잠시 쓰였던 것이라 지금은 이거 쓰는 사람들이 거의 없을겁니다. 다만, 자바 1.1 시절부터 사용되어온지라 없애버리면 안되겠죠. 그래서 명목상 컬렉션 프레임워크에 포함은 시켜놓은 상태입니다.
Vector 를 써야할 상황이면 ArrayList를 동기화해서 사용하면 됩니다.
자바 언어가 과도기일때 도입된게 Vector, HashTable인데 지금은 언어 자체가 많이 성숙해서 이거 쓸 일이 없고(물론 써도 누가 뭐라고는 안하지만) 다른 컬렉션 프레임워크의 클래스들로 대체된 상태입니다.
정리하면 두 놈 다 기본적으로 하는 일은 똑같다.(맘대로 바꿔 써도 됨.)
다만, 컬렉션 프레임워크가 나오기 전에 제공되던 Vector클래스는 성능상 단점이 많기 때문에(무조건 동기화됨), 멀티 스레드 환경이 아니면 ArrayList를 사용하는게 좋다.
이정도 되겠습니다.
'program' 카테고리의 다른 글
Java JSON 파싱 (0) | 2013.10.03 |
---|---|
자바빈(JAVA BEANS) (0) | 2013.10.03 |
bean, dto, vo, pojo 등 차이점 (0) | 2013.10.03 |
Java Code Convention (0) | 2013.10.02 |
Java/자바/정규식] 대소문자 구분 없이 문자열 바꾸기/치환; Replace String (0) | 2013.08.27 |