스프링으로 프로젝트를 하다보면 단순히 DTO까지 굳이 만들어서 데이터를 넘겨야 할 필요가 없는경우에

컬렉션 프레임워크에 담는경우가 많은데 어떤 객체로 추가, 검색, 삭제해야 하는지 고민이 항상 된다.

 

 

배열은 저장할 수 있는 수가 한정된다는 명확한 단점을 가지고 있기때문에 컬렉션 프레임워크를 사용한다.

컬렉션 프레임워크의 주요 인터페이스는 List, Set, Map이 있다.

 

 

크게는 Collection 하위타입인 List와 Set을 구분하고 Collection과 Map의 차이를 보겠다.

 

 

List와 Set은 객체를 추가 삭제 검색하는 방법에서 유사점이 있기 때문에 Collection으로 묶여있지만

Map은 키와 값은 하나의 쌍으로 묶어 관리하는 구조이기 때문에 사용방법이 완전 다르다.

 

 

 

 

List 컬렉션

List 컬렉션은 객체를 일렬로 늘어놓은 구조를 가지고 있다.

객체를 인덱스로 관리하기 때문에 객체를 저장하면 자동 인덱스가 부여되고 인덱스로 객체를 검색, 삭제할 수 있다.

 

 

List 컬렉션은 객체 자체를 저장하는 것이 아니라 객체의 번지를 참조한다.

동일한 객체를 중복 저장할 수 있는데 이 경우 동일한 번지가 참조된다.

 

 

null의 경우 객체를 참조하지 않는다(저장은 가능)

LIst의 기본 문법

List<String> list = ...;
list.add("홍길동"); //맨 끝에 객체 추가
list.add(1, "신용권"); //지정된 인덱스에 객체 삽입
String str = list.get(1); //인덱스로 객체 찾기
list.remove(0); // 인덱스로 객체 삭제
list.remove("신용권") // 객체삭제 

 

ArrayList

ArrayList 객체를 생성하면 내부에 10개의 객체를 저장할 수 있는 초기 용량을 가진다

List<E> list = new ArrayList<E>(); // 기본생성자 생성
List<String> list = new ArrayList<String>(30); // 30개의 초기용량

ArrayList에 객체를 추가하면 인덱스 0부터 차례대로 저장된다.

ArrayList에서 특정 인덱스의 객체를 제거하면 바로 뒤 인덱스부터 마지막 인덱스까지 앞으로 1씩 당긴다.

 

따라서 빈번한 객체 삭제와 삽입이 일어나는 곳에서는 ArrayList를 사용하는 것이 바람직하지 않다

이런 경우엔 LinkedList가 더 좋다.

그러나 인덱스 검색이나 맨 마지막에 객체를 추가하는 경우에는 ArrayList가 더 좋은 성능을 발휘한다.

 

 

Vector

Vector는 ArrayList와 동일한 내부구조를 가지고 있다.

Vector생성 방식은 다음과 같다

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

ArrayList와 다른 점은 Vector는 동기화(synchronized)된 메소드로 구성되어 있기때문에

멀티쓰레드 환경에서 안전하게 사용가능하다.

 

 

LinkedList

LinkedList는 List 구현 클래스이므로 ArrayList와 사용방법은 똑같지만 내부구조가 완전히 다르다.

 

ArrayList는 내부 배열에 객체를 저장해서 인덱스로 관리하지만

LinkedLIst는 인접 참조를 링크해서 체인처럼 관리한다.

 

LinkedList에서 특정 인덱스의 객체를 제거하면 앞뒤 링크만 변경되고

나머지 링크는 변경되지 않는다

삽입할 때도 마찬가지다.

 

 

빈번한 추가 삭제가 발생하는곳에서는 LinkedList를 사용하는것이 좋다.

 

 

//

Reference : 이것이 자바다

+ Recent posts