반응형

컬렉션

자바 컬렉션은 목록성 데이터를 처리하는 자료구조를 통칭함

 

만약 여러개의 String 객체를 하나의 객체에 담으려면? => 배열을 이용하면된다.

하지만 담으려는 데이터의 크기를 모르면?

 

자바에선 이러한 문제를 해결하는 클래스가 미리 만들어져있다.

 

순서가 있는 목록인 List형

순서가 중요하지 않은 목록인 Set형

먼저 들어온 것이 먼저 나가는 Queue형

키-값(key-value)로 저장되는 Map형

 

List, Set, Queue는 Collection이라는 인터페이스를 구현한다.

Collection 인터페이슨느 java.util 패키지에 선언되어있고,

여러 개의 객체를 하나의 객체에 담아 처리할때 공통적으로 사용되는 여러 메소드를 선언해두었다.

 

Map은 Collection과 관련없는 별도의 인터페이스로 선언되어있다.

 

public interface Collection<E> extends Iterable<E>

Collection인터페이스는 Iterable라는 인터페이스를 확장했다.

해당 인터페이스는 iterator()메소드만 선언되어있고 Interator라는 인터페이스를 리턴한다.

 

Iterator라는 인터페이스에는

hasNext() : 추가데이터가 잇는지 확인

next() : 현재 위치를 다음 요소로 넘기고 그 값을 리턴해줌

remove() : 데이터를 삭제

라는 메소드가 있다.

 

Collection인터페이스가 Iterable 인터페이스를 확장했으므로 Iterator 인터페이스로 데이터를 순차적으로 가져올 수 있다.


 

 

List

List 인터페이스는 Collection인터페이스를 확장한다.

Collection 인터페이스를 확장하는 다른 인터페이스와 다른점은 배열처럼 순서가 있다는 점이다.

 

List 인터페이스를 구현한 클래스들 중 많이 사용하는 것은

  • ArrayList
  • Vector
  • Stack
  • LinkedList

이다.


 

ArrayList

크기 확장이 가능한 배열이다.

 

상속관계를 보면

java.lang.Object

jaba.util.AbstractCollection

java.util.AbstractList

java.util.ArrayList

이다.

=> AbstractCollection,AbstractList는 각각 Collection, List 인터페이스 중 일부만 구현했다.

 

ArrayList가 구현한 inerface들은

Serializable, Cloneable, Iterable, Collection, List, RandomAccess

이다.

 

public class ListSample{
	public static void main(String[] args){
		ListSample sample = new ListSample();
		sample.checkArrayList1();
	}
	
	public void checkArrayList1(){
		//list1 객체 생성 => ArrayList객체인 list1에 객체들을 넣을 수 있음
		ArrayList list1=new ArrayList();
		
		//list1에 객체들을 넣음
		list1.add(new Object());
		list1.add("ArrayListSample");
		list1.add(new Double(1));
	}
}

컴파일 되지 않는다. => ArrayList는 java.lang에 속한 클래스가 아니기 때문이다.

따라서

import java.util.ArrayList //를 해주어야한다.

 

ArrayList 객체에 여러 객체들을 넣을 수 있지만, 한가지 종류의 객체만을 주로 저장한다.

여러 종류를 하나의 객체에 담을 때는 DTO라는 객체를 만들어서 담는것이 좋다.

따라서 컬렉션 관련 클래스의 객체를 선언할때는 제네릭을 사용하여 선언하는것이 좋다.

=> 한가지 종류의 객체만을 저장

ArrayList<String> list1=new ArrayList<String>();

위와 같이 선언하면 list1은 String 타입의 객체만 넣을 수 있다.

(제네릭을 사용하여, 컴파일 시점에 다른 타입이 잘못 지정되는 것을 막을 수 있다.)

 

ArrayList 객체를 선언할 때 매개변수를 넣지 않으면 기본 초기값은 10이다.

(10개 이상의 데이터가 들어가면 크기를 늘리는 작업은 ArrayList내부에서 자동으로 수행된다.)

ArrayList<String> list1 = new ArrayList<String>(100);

 

 

ArrayList에 데이터를 담기위해선 add와 addAll메소드를 사용하면된다.

 

boolean add(E e) : 매개 변수로 넘어온 데이터를 가장 끝에 담음(리턴값은 제대로 추가되었는지 확인)

void add(int index, E e) : 매개 변수로 넘어온 데이터를 지정된 index위치에 담는다.

boolean addAll(Collection<? extends E> c) : 매개 변수로 넘어온 컬렌션 데이터를 가장 끝에 담는다.

boolean addAll(int index, Collection<? extends E> c) : 매개 변수로 넘어온 컬렉션 데이터를 index에 지정된 위치부터 담는다.

 

만약 list1의 내용을 list2에 복사하고 싶으면

ArrayLsit<String> list2 = new ArrayList<String>(list);

와 같이 사용하면 된다.

ArrayList에는 Collecion 인터페이스를 구현한 어떠한 클래스도 포함시킬 수 있는 생성자가 있기 때문

 

list2=list1

을 해버리면 주소가 같으므로 위와같이 생성자를 이용하여 복사하거나

addAll()을 이용하여 복사하여야 한다.

 

데이터를 꺼내는 법

size() : ArrayList객체에 들어가 있는 데이터의 개수를 가져오는 메소드

=> ArrayList의 크기를 말하는 것이 아님

get(int index)메소드를 사용하여 데이터를 가져올 수 있다.

 

중복된 값이 잇을경우에는

int indexOf(Object o) : 매개 변수로 넘어온 객체와 동일한 데이터의 위치를 리턴한다.

=>앞에서부터 찾을 경우

int lastIndexOf(Object o) : 매개 변수로 넘어온 객체와 동일한 마지막 데이터의 위치를 리턴한다.

=> 뒤에서부터 찾을 경우

 

ArrayList 객체에 있는 데이터들을 배열로 뽑아낼 경우엔 toArray()메소드를 사용한다.

Object[] toArray() : 객체에 있는 값들을 Object[] 타입의 배열로 만듬

T[] toArray(T[] a) : 객체에 있는 값들을 매개변수로 넘어온 T타입의 배열로 만든다.

 

매개변수가 없는 toArray는 Object타입의 배열로만 리턴하므로, 제네릭을 사용하여 선언한 ArrayList 객체를 배열로 생성할 때는 매개변수가 있는 toArray를 사용하는것이 좋다.

String[] temp = new String[5];
String[] strList=list.toArray(temp);

만약 list의 size가 3이라면 (데이터는 1, 2, 3이라 가정)

strList를 출력하면 1, 2, 3, null, null로 출력될것이다.

 

ArrayList에 저장된 데이터 size > 매개변수로 넘어온 배열의 크기

즉, size(list)=3 > temp=0 크기이면

새로운 배열을 생성하여 넘겨주므로

String[] strList=list.toArray(new String[0]);

와 같이 크기가 0인 배열을 넘겨주는 것이 좋다.

 

데이터 삭제

void clear() : 모든 데이터 삭제

E remove(int index) : 매개 변수에서 지정한 위치에 있는 데이터를 삭제하고 리턴

boolean remove(Object o) : 매개변수에 넘어온 객체와 동일한 "첫번째" 데이터를 삭제한다.

boolean removeAll(Collection<?> c) : 매개 변수로 넘어온 "컬렉션 객체에 있는 데이터"와 "동일한 모든 데이터"를 삭제한다.

 

데이터 변경

E set(int index, E element) : 지정한 위치에 있는 데이터를 두번째 매개변수로 넘긴 값으로 변경, 해당위치에 있던 데이터를 리턴

=> 원래 값 반환하고 설정값으로 값 바꿈

=> remove, add 두 과정을 거칠필요 없음

 

trimToSize() : 객체 공간의 크기를 데이터의 개수만큼으로 변경함, 즉 앞뒤 공백을 없앰

 

728x90
반응형

'공부 > Spring' 카테고리의 다른 글

스프링 웹개발 기초  (0) 2021.10.20
자바 - Map  (0) 2021.10.19
자바 - Set  (0) 2021.10.18
자바 - 제네릭  (0) 2021.10.14
자바 문법  (0) 2021.10.13
블로그 이미지

아상관없어

,