자바

자바 컬렉션 프레임워크란? / 자바 List 컬렉션 자바 리스트 컬렉션 -> ArrayList, Vector, LinkedList

알통몬_ 2017. 3. 21. 22:19
반응형


안녕하세요 알통몬입니다.

공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^

 

이번 포스팅부터는 컬렉션 프레임워크에 대해 공부해볼텐데요.

그럼 컬렉션 프레임워크가 무엇인지부터 알아야겠죠?


배열을 사용하면 쉽게 저장하고 쉽게 사용할 수 있습니다.

하지만 객체의 갯수가 배열 생성 시에 결정되므로 수가 정해지지 않은

다수의 객체를 저장하기에는 문제가 있을 수 있습니다.

거기에 객체를 삭제했을 경우 해당 인덱스는 비게 되므로

낱알이 빠진 옥수수 처럼될 수있습니다. 

그렇기 때문에 새로운 객체를 저장하기 위해서는 배열의 어떤 자리가 비었는지

확인할 수 있는 코드도 추가되어야 합니다.

컬렉션 프레임워크

==> 위처럼 배열을 사용했을 때의 문제점을 해결하고

자료구조를 바탕으로해서 객체들을 효율적으로 추가, 삭제,검색할 수 있도록

java.util 패키지에 컬렉션과 관련된 인터페이스들과 클래스들을 포함시켜놓았습니다.


자바에서 컬렉션은 객체를 수집해서 저장하는 역할을 합니다.

프레임워크란

==> 사용법을 미리 정해놓은 라이브러리

컬렉션프레임워크는 몇 가지 인터페이스를ㄷ통해 다양한 컬렉션 클래스를 

이용할 수 있도록 해주니다.

주요 인터페이스

: List, Set, Map


위 인터페이스들은 컬렉션의 사용 법을 정의해 놓은 것입니다.

아래 이미지는 위 인터페이스들로 사용 가능한 클래스들을 보여주는 이미지입니다.


그럼 각 인테페이스 별 특징을 보겠습니다.


그럼 이제부터 List 컬렉션과 List 인터페이스의 구현 클래스들인 ArrayList, Vector, LinkedList에

대해 공부하게씁니다.


List컬렉션

List 켈럭션은 객체를 일렬로 늘어놓은 구조를 가지고 있는데요.

객체 저장 시 인덱스가 자동으로 부여됩니다. 또한 그 인덱스를 통해 검색 삭제를 할 수 있습니다.

List컬렉션은 객체의 번지를 참조하는데요, 동일한 객체를 중복 저장할 수 있고, 

이런 경우에 같은 번지를 참조해요. null 저장 가능하지만 이 경우에는 해당 인덱스가

객체를 참조하지 않아요.


List 컬렉션에서 제공하는 인터페이 메소드들

위 이미지를 보면 메소드의 매개 변수 타입과 리턴 타입에 E 라는 타입의 파라미터가 있습니다.

그 이유는 List 인터페이스가 제네릭 타입이기 때문입니다.


제네릭에서 배운 거처럼 구체적인 타입은 구현 객체 생성 시 결정됩니다.

객체를 추가할 때는 add(), 객체를 찾아올 때는 get()을 사용합니다~

그리고 삭제 시에는 remove()를 사용하면 됩니다.

ex)

List<String> names = 구현 클래스;

list.add("tistory"); // 맨 끝에 객체가 추가됨

list.add(1,"altong"); // 1번 인덱스에 추가

String val = list.get(1); // 1번 인덱스 값 가져옴

list.remove(0); // 0번 인덱스의 객체 삭제

list.remove("tistory"); // 해당 객체 삭제


전체 객체 대상으로 반복문을 이용해 저장된 객체를 얻고 싶다면

List<String> list = "";

for(int i = 0; i<list.size(); i++) {

 String val = list.get(i);

}

처럼 사용할 수 있고 향상된 for문을 사용할 수도 있습니다.

for(String vals : list) {

}


구현 클래스

1. ArrayList

ArrayList에 객체 추가 시 객체가 인덱스로 관리되는데요.

일반 배열과 인덱스로 객체를 관리한다는 점은 유사합니다.

하지만 ArrayList는 저장 용량을 초과해서 객체가 들어오면 자동으로

인덱스가 늘어납니다.

ArrayList 생성 방법

List<String> list =new ArrayList<>();

제네릭에서 구현객체는 <>안의 타입파라미터를 생략할 수 있다고 배웟었죠??


기본 생성자로 ArrayList 객체 생성 시 내부에 10개의 객체를 저장할 수 있는 초기 용량을 가집니다.

처음부터 용량을 크게 잡고 싶을 경우에는 new ArrayList<>(35);

처럼 ()안에 원하는 크기를 입력하시면 됩니다.

그럼 위 내용을 토대로 간단한 예제를 보겠습니다.


2. Vector

Vector는 ArrayList와 동일한 구조를 가지고 생성방법도 동일합니다.

List<String> vector = new Vector<>();

그럼 ArrayList와는 뭐가 다를까요?

--> Vector의 경우 동기화된 메소드들로 구성이 되어 있씁니다.

때문에 멀티 쓰레드가 동시에 이 메소도들을 실행할 수 없으며

하나의 쓰레드가 실해을 완료해야 다음 쓰레드가 실행할 수 있습니다.

때문에 멀티 쓰레드 환경에서 객체를 추가하거나 삭제할 때 안전하게 할 수 있습니다.

이것을 쓰레드가 안전하다 라고 말합니다.


사용 방법은 ArrayList와 같기 때문에 따로 예제를 쓰진 않겠습니다.

대신 파일로 첨부합니다.

VectorExample.txt


3. LinkedList

ArrayList와 사용법은 같습니다. 하지만 이번에 내부구조가 완전히 다릅니다.

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

LinkedList는 인접 참조를 링크해 체인처럼 관리합니다.

LinkedList에서 특정 인덱스의 객체를 제거할 경우 앞뒤 링크만 변경되고 나머지 링크느 변경되지 않아요.

특정 인덱스를 삽입하는 경우에도 마찬가지 입니다. 

때문에 빈번한 객체 삭제 , 삽입이 일어나는 곳이라면 ArrayList보다 LinkedList가 

더 좋은 성능을 발휘한다고 할 수 있습니다.

LinkedList를 생성하려면 저장할 객체 타입을 타입 파라미터에 표기하고 기본 생성자를 

호출하면 되는데요, 처음 생성될 때에 어떤 링크도 만들지 않으므로 내부는

비어있다고 보면됩니다.

그럼 마지막으로 ArrayList와 LinkedList의 성능 비교 표를 보면서 포스팅을 마칩니다.


감사합니다.





반응형