goal
자바의 collection framework 이해
자바의 collection 인터페이스의 주요 메소드
자바의 List 인터페이스의 개념과 설명
자바의 List<E> 구현체 -> ArrayList 클래스
자바의 List<E> 구현체 -> LinkedList 클래스
자바의 Set 인터페이스의 개념과 설명
자바의 Set<E> 구현체 -> HashSet 클래스
자바의 Set<E>구현체 -> TreeSet 클래스
1 ] 자바의 collection framework
1. 개념
- 다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합
- 즉, 데이터를 저장하는 자료 구조와 데이터를 처리하는 알고리즘을 구조화하여 클래스로 구현해 놓은 것이다.
- 컬렉션 프레임워크는 자바의 인터페이스(interface)를 사용하여 구현된다.
2. 컬렉션 프레임워크의 주요 인터페이스
- List 인터페이스
- Set 인터페이스
- Map 인터페이스
인터페이스 | 설명 | 구현클래스 |
List<E> | 순서가 있으며 중복을 허용한다. | Stack, Queue, ArrayList, LinkedList, Vector |
Set | 순서가 없으며 중복을 허용하지 않는다. | HashSet, TreeSet |
Map<K, V> | 키와 값이 한 쌍으로 이루어지는 데이터 집합 - 순서가 없다. 키는 중복을 허용하지 않지만, 값은 중복될 수 있다. |
HashMap, TreeMap, Hashtable, Properties |
3. 주요 컬렉션 프레임워크 간의 상속 관계
참고 자료 : JAVA Collection Framework (1) - 컬렉션 프레임워크란?, https://hudi.blog/java-collection-framework-1/, @Hudi
4. 컬렉션 클래스
- 컬렉션 프레임워크에 속하는 인터페이스를 구현한 클래스를 컬렉션 클래스라고 한다.
5. Collection 인터페이스
- Collection 인터페이스에서 List와 Set과 관련한 공통 부분을 정의한다.
- 그리고, 구현체들은 collection 인터페이스를 상속 받는다.
- 다른 말로 하자면, Collection 인터페이스는 컬렉션을 다루는데 가장 기본적인 동작들을 정의하고 그것들을 메소드로 제공한다.
[1] Collection 인터페이스의 주요 메소드
메소드 | 설명 |
boolean add(E e) | 주어진 객체를 컬렉션에 추가 |
boolean addAll(Collection c) | 주어진 컬렉션의 객체들을 컬렉션에 추가 |
void clear() | 해당 컬렉션의 모든 요소를 제거한다. |
boolean contains(Object o) | 주어진 객체가 저장되어 있는지 여부 확인 |
boolean containsAll(Collection c) | 주어진 컬렉션이 저장되어 있는지 여부 확인 |
boolean equals(Object o) | 해당 컬렉션과 전달된 객체가 같은지를 확인한다. - 결국, 객체가 같은지 확인하기 때문에 메모리 주소를 비교한다. |
boolean isEmpty() | 해당 컬렉션이 비어있는지를 확인한다. |
Iterator<E> iterator() | 해당 컬렉션의 반복자(iterator)를 반환한다. - 현재로서는 이해가 되지 않는부분.. - 따로 정리가 필요하다. |
boolean remove(Object o) | 해당 컬렉션에서 전달된 객체를 제거하고 성공 여부를 반환한다. - 컬렉션프레임워크.remove(index) :: index로 객체를 삭제한다. - 컬렉션프레임워크.remove("요소명") :: 요소명으로 객체를 삭제한다. - 참고 블로그 :: 컬렉션 프레임워크(List 컬렉션 1), https://dustink.tistory.com/98, DUKI의 개발 |
boolean removeAll(Object o) | 해당 컬렉션에서 전달된 컬렉션을 삭제하고 성공 여부를 반환한다. |
int size() | 해당 컬렉션의 요소의 총 개수를 반환한다. - for문에서 순회할 때 자주 사용하는 문법이다. |
Object[] toArray() | 해당 컬렉션의 모든 요소를 Object 타입의 배열로 반환한다. - 예시 코드는 아래 기입했다. |
Object[] toArray(Object[] a) | 주어진 배열에 컬렉션의 객체를 저장해서 반환한다. |
boolean retainAll(Collection c) | 주어진 컬렉션을 제외한 모든 객체를 컬렉션에서 삭제하고 컬렉션에 변화가 있는지 여부를 반환한다. |
※ 컬렉션 프레임워크의 toArray() 사용방법
- 컬렉션 프레임워크 toArray() 리스트를 활용한 객체 반환 출력
List<String> list1 = new ArrayList<>();
list1.add("A");
list1.add("B");
list1.add("C");
String[] strList = list1.toArray(new String[0]);
for (String str: strList)
System.out.println(str);
// str.getClass().getSimpleName() => String
/* output
----------------------
A
B
C
----------------------
*/
- 컬렉션 프레임워크 toArray() 리스트를 활용하지 않고 출력한 객체 반환
List<String> list1 = new ArrayList<>();
list1.add("A");
list1.add("B");
list1.add("C");
for(int i = 0; i < list1.size();i++) {
System.out.println(list1.get(i));
// list1.get(i).getClass().getSimpleName() => String
}
/* output
----------------------
A
B
C
----------------------
*/
2 ] 컬렉션 프레임워크, List<E> 인터페이스
List 인터페이스는 객체를 일렬로 늘어놓은 구조이다.
- 객체를 인덱스로 관리하며, 객체를 저장하면 자동적으로 인덱스가 부여된다.
- 인덱스로 객체를 검색, 삭제할 수 있는 기능을 제공한다.
1. List<E> 인터페이스의 주요 메소드
기능 | 리턴 타입 | 메소드 | 설명 |
검색추가 | void | add(int index, Object element) | 주어진 인덱스에 객체를 추가 |
boolean | addAll(int index, Collection c) | 주어진 인덱스에 컬렉션을 추가 | |
Object | set(int index, Object element) | 주어진 위치에 객체를 저장 | |
객체검색 | Object | get(int index) | 주어진 인덱스에 저장된 객체를 반환 |
int | indexOf(Object o) lastIndexOf(Object o) |
순방향 / 역방향으로 탐색하여 주어진 객체의 위치를 반환한다. |
|
ListIterator | listIterator() listIterator(int index) |
List의 객체를 탐색할 수 있는 ListIterator 반환 주어진 index부터 탐색할 수 있는 ListIterator반환 |
|
List | subList(int fromIndex, int toIndex) | 주어진 인덱스에 저장된 객체를 삭제하고 삭제된 객체를 반환한다. | |
객체삭제 | Object | remove(int index) | 주어진 인덱스에 저장된 객체를 삭제하고 삭제된 객체를 반환한다. |
boolean | remove(Object o) | 주어진 객체를 삭제 | |
객체정렬 | void | sort(Comparator c) | 주어진 비교자(comparator)로 List를 정렬 |
2. ArrayList
컬렉션 프레임워크에서 가장 많이 사용된다.
- Vector와 동일하지만 Vector를 개선한 List인터페이스의 구현체
- List 계열 자료구조의 특성을 이어받아 데이터가 연속적으로 존재한다.
[1] ArrayList의 장점
- 기존의 배열은 크기가 고정되고, 크기를 변경할 수 없다.
- 하지만
ArrayList
는 가변된 크기를 가진다. (즉, ArrayList 초과 용량이 들어오면 자동적으로 늘어남)
[2] ArrayList의 초기화 및 사용 예시
// List<타입 파라미터> 객체명 = new ArrayList<타입파라미터>(용량지정);
List<String> listArray = new ArrayList<String>();
// 초기 용량은 10개로 생성되며, ArrayList안에 10개의 객체를 저장할 수 있게 생성
List<String> listArray = new ArrayList<String>(100);
// 초기 용량은 100개로 생성되며, ArrayList안에 100개의 객체를 저장할 수 있게 생성한다.
import java.util.ArrayList;
import java.util.List;
public class Note {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("Java"); // String 객체 저장/추가
list.add("python");
list.add("javaScript");
int size = list.size(); // 저장된 총 객체 수 얻기 <Collection interface>
String skill = list.get(0); // 0번 인덱스의 객체 얻기
for(int i = 0; i < list.size(); i++){// 저장된 총 객체 수 만큼 조회 <List interface>
String str = list.get(i);
System.out.println(i + ":" + str);
}
System.out.println("-------------------------------------");
list.remove(0); // 0번 인덱스 객체 삭제
for(int i = 0; i < list.size(); i++){// 저장된 총 객체 수 만큼 조회
String str = list.get(i);
System.out.println(i + ":" + str);
}
}
}
3. LinkedList
ArrayList와 사용법은 똑같으나 자료구조적인 차이가 존재한다.
- 데이터를 효율적으로 추가, 삭제, 변경에 용이하다.
- 메모리상에 불연속적으로 존재하며, Node마다 데이터는 서로 연결 되어있다.
- 자료구조와 깊은 연관이 있으니 추후에 공부하고 사용법과 같이 포스팅할 예정
3 ] 컬렉션 프레임워크 Set<E>
Set은 요소의 중복을 허용하지 않으며 순서가 없다.
- 집합과 같은 개념이다.
- 대표적으로 HashSet과 TreeSet이 존재한다.
1. HashSet
[1]. HashSet<E> 실습
import java.util.*;
public class Main {
public static void main(String[] args) {
HashSet<String > languages = new HashSet<String>();
languages.add("Java");
languages.add("Python");
languages.add("Javascript");
languages.add("C++");
languages.add("Kotlin");
languages.add("Ruby");
languages.add("Java");
Iterator it = languages.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
}
2. TreeSet
하 --.. 추후 포스팅