ㆍ자바의 자료구조
- 자바에서의 데이터를 담는 자료 구조를 크게 나누어보면 이렇다.
- 순서가 있는 목록(List) 형
- 순서가 중요하지 않은 셋(Set) 형
- 먼저 들어온 것이 먼저 나가는 큐(Queue) 형
- 키-값(key-value)로 저장되는 맵(Map) 형
- List, Set, Queue는 'Collection' 인터페이스를 확장하고 있다.
- Collection 인터페이스는 Iterable<E>라는 인터페이스를 확장했다. (Iterable 인터페이스를 사용하여 데이터를 순차적으로 가져올 수 있다)
- Collection 인터페이스에 선언된 주요 메소드 목록은 다음 오라클 공식문서에서 확인하자.
https://docs.oracle.com/javase/8/docs/api/
Java Platform SE 8
docs.oracle.com
ㆍList 인터페이스
- List 인터페이스는 배열처럼 '순서'가 있는 자료형이다. (ArrayList, Vector, Stack, LinkedList 등이 이를 구현한다.)
- ArrayList와 Vector 클래스의 사용법은 거의 동일하다. (ArrayList는 Not Tread safe / Vector은 Tread safe)
ㆍArrayList
- Object -> AbstractCollection<E> -> AbstractList<E> -> ArrayList<E> // ArrayList의 상속관계
- Serializable, Cloneable, Iterable<E>, Collection<E>, List<E>, RandomAccess // ArrayList가 구현한 인터페이스
- ArrayList의 생성자에 아무것도 넣지 않을 경우 공간이 10인 ArrayList를 만듬 (new ArrayList();)
- 제네릭을 이용하여 타입을 정해주는 것이 좋음. (타입을 지정하지 않으면 모든 요소를 Object로 처리)
- ArrayLIst의 생성자에 정수값을 파라미터로 넣어주면 해당 크기만큼의 ArrayList를 만듬 (new ArrayList(100);) //크기가 100인 ArrayList 생성
- ArrayList의 초기 크기 이상으로 데이터가 삽입되면, 크기를 늘이는 작업이 자동으로 수행 (성능에 영향을 주게됨)
요소 추가
- add(E e) - 매개 변수로 넘어온 데이터를 추가 (가장 끝에)
- add(int index, E e) - 인덱스 위치에 데이터를 추가
- addAll(Collection<? extends E> c) - 컬렉션 데이터를 추가 (가장 끝에)
- addAll(int index, Collection<? extends E> c) - 컬렉션 데이터를 인덱스 위치에 추가
- for(타입이름 임시변수명 : 반복대상객체) 사용가능
- Shallow copy - 다른 객체에 원본 객체의 '주소 값'만 할당.(복제된 객체와 원본 객체가 값을 공유)
다른 컬렉션 객체를 '=' 연산자를 통해 대입할경우 Shallow copy가 발생.
ArrayList<String> listA = new ArrayList<String>();
listA.add("A");
listA.add("B");
ArrayList<String> listB = listA;
listB.add("C");
System.out.println(listA);
// [A, B, C] 출력
다음과 같이 다른 객체에 원본 객체를 그대로 대입했을 때, 주소값이 할당되어 다른 객체에서 객체의 데이터를 바꾸면 원본 객체에도 영향이 감. 따라서, 객체를 조회할때만 사용하는 것이 좋아보임.
- Deep copy - 다른 객체에 모든 '값'을 복사하여 할당. (복제된 객체는 원본에 영향이 없음)
ArrayList<String> listA = new ArrayList<String>();
listA.add("A");
listA.add("B");
ArrayList<String> listB = new ArrayList<String>(listA);
// listB.addAll(listA) 메소드를 사용하는 것과 동일
listB.add("C");
System.out.println(listA);
// [A, B] 출력
System.out.println(listB);
// [A, B, C] 출력
생성자를 이용하여 새로운 객체를 생성한 것이므로 완전히 다른 객체(주소 값도 다름)
요소 가져오기
- size()메소드로 컬렉션 객체의 몇개의 데이터가 저장되어있는지 리턴값(int)으로 알 수 있다.
- size() - ArrayList에 저장되어있는 데이터의 개수를 리턴 (int)
- get(int index) - 매개변수로 받은 정수값의 위치에 있는 데이터를 리턴
- indexOf(Object o) - 매개변수로 넘어온 객체와 동일한 데이터의 위치를 리턴 (앞에서부터 검색)
- lastIndexOf(Object o) - indexOf 메소드의 기능인데 뒤에서부터 검색한다.
배열로 반환
- toArray() - Object타입의 배열로 리턴
- toArray(T[] a) - 매개변수 타입의 배열로 리턴 // Ex)) String[] stringList = list.toArray(new String[0]);
(매개변수로 들어가는 배열의 크기를 맞춰주는것이 좋음.)
요소 삭제
- clear() - 모든 요소 삭제
- remove(int index) - index위치의 요소를 삭제
- remove(Object o) - 매개변수로 들어온 객체와 동일한 첫 번째 데이터만 삭제 (삭제 성공여부를 return boolean)
- removeAll(Object o) - 매개변수로 들어온 객체와 동일한 모든 데이터 삭제 (삭제 성공여부를 return boolean)
- 기억해두어야 할 것은 인덱스를 이용하여 요소를 삭제할 때, get()메소드처럼 지워지는 데이터가 반환된다는 점이다. (지우면서 확인할 수 있음)
요소 값 변경
- set(int index, E element) - 인덱스위치의 요소를 두번째 매개변수 값으로 변경한다.
- trimToSize() - 컬렉션 객체의 비어있는 공간(데이터가 들어있지 않은 공간)을 없앤다. (데이터의 크기를 줄임)
ㆍStack (LIFO - Last In First Out)
- ArraryList와 동일하게 제네릭으로 타입을 지정해주는것이 권장됨.
- Stack() - 아무것도 없는 Stack 객체 생성 (Stack 객체의 유일한 생성자)
- empty() - 객체가 비어있는지 확인
- peek() - 가장 위에있는 데이터 리턴
- pop() - 가장 위의 데이터 삭제후, 리턴
- push(E item) - 매개변수로 들어온 데이터를 가장 위에 저장
- search(Object o) - 매개변수로 들어온 데이터의 인덱스값을 리턴
참고
ㆍ"자바의 신 vol.2", 이상민 저자