컬렉션 프레임워크
다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합을 의미
배열을 사용하다 보면 여러가지 비효율적인 문제가 생긴다.
가장 큰 문제점은 크기가 고정적이라는 것이다. 배열의 크기는 생성할 때 결정되며, 그 크기를 넘어가게 되면 더이상 데이터를 저장할 수 없다. 또 데이터를 삭제하면 해당 인덱스의 데이터는 비어있어 메모리가 낭비되는 등 여러 문제점들이 발생한다.
그렇기에 자바는 배열의 이러한 문제점을 해결하기 위해, 널리 알려져 있는 자료구조를 바탕으로 객체나 데이터들을 효율적으로 관리(추가, 삭제, 검색, 저장)할 수 있는 자료구조들을 만들어 놓았다.
이러한 자료구조들이 있는 라이브러리를 컬렉션 프레임워크라고 한다.
(대표적으로는 List, Set, Map, Stack, Queue 등이 있다.
이러한 컬렉션 프레임워크는 자바의 인터페이스(interface)를 사용하여 구현된다.
컬렉션 프레임워크 주요 인터페이스
컬렉션 프레임워크에서는 데이터를 저장하는 자료 구조에 따라 다음과 같은 핵심이 되는 주요 인터페이스를 정의하고 있다
1. List 인터페이스
2. Set 인터페이스
3. Map 인터페이스
이 중에서 List와 Set 인터페이스는 모두 Collection 인터페이스를 상속받지만,
구조상의 차이로 인해 Map 인터페이스는 별도로 정의된다.
따라서 List 인터페이스와 Set 인터페이스의 공통된 부분을 Collection 인터페이스에서 정의하고 있다.
List 계열의 컬렉션 프레임워크
컬렉션 프레임워크를 상속받고 있는 List컬렉션은 List 컬렉션은 객체를 일렬로 늘어놓은 구조를 가지고 있다.
List 컬렉션은 객체를 인덱스로 관리하기 때문에 객체를 저장하면 자동 인덱스가 부여되고 인덱스로 객체를 검색, 삭제할 수 있는 기능을 제공한다. (인덱스에는 데이터가 저장되어 있는 참조 값을 가지고 있다.)
List컬렉션은 객체 자체를 저장하는 것이 아니라 위와 같이 객체의 번지를 참조한다. 동일한 객체를 중복 저장할 수 있는데, 이 경우 동일한 번지가 참조된다. null도 저장이 가능한데 이 경우 해당 인덱스는 객체를 참조하지 않는다.
List 컬렉션을 구현하는 대표적인 클래스들은 ArrayList, LinkedList, Vector가 있으며,
이 3가지 클래스는 List 인터페이스를 같이 상속하고 있으므로 공통적으로 사용할 수 있는 메서드들이 많다.
List 계열의 컬렉션 프레임워크의 특징
▶ 순서가 있는 데이터의 집합으로, 데이터의 중복을 허용함
▶ 자료의 순서가 보장(index) : 정렬 기능 제공
▶ List 인터페이스의 자식 클래스로 구현
==> ArrayList, LinkedList, Vector
▶ 특히 DB의 데이터를 레코드 단위로 저장하거나 저장된 데이터를 가져올 경우 많이 사용 됨.
ArrayList란?
ArrayList는 List 인터페이스를 상속받은 클래스로 크기가 가변적으로 변하는 선형리스트
일반적인 배열과 같은 순차리스트이며 인덱스로 내부의 객체를 관리한다는점 등이 유사하지만, 한번 생성되면 크기가 변하지 않는 배열과는 달리 ArrayList는 객체들이 추가되어 저장 용량(capacity)을 초과한다면 자동으로 부족한 크기만큼 저장 용량(capacity)이 늘어난다는 특징을 가지고 있다.
ArrayList 사용법
// ArrayList 선언
ArrayList <String> list = new ArrayList<String>(); // 타입설정 String타입만 사용 가능
ArrayList<Integer> num = new ArrayList<Integer>(); //타입설정 int타입만 사용가능
ArrayList 예제
package collection;
import java.util.ArrayList;
public class Ex01 {
public static void main(String[] args) {
// ArrayList 객체 생성
System.out.println("ArrayList 객체 생성");
ArrayList<String> list = new ArrayList<String>();
// String 자료형만 받을 수 있음
// 1. add() : 데이터를 추가하는 메소드
// 중복데이터를 넣어서 데이터를 추가해보자
System.out.println("add() 메소드");
list.add("홍길동");
list.add("이순신");
list.add("유관순");
list.add("김유신");
list.add("김연아");
list.add("유관순");
// 2. size() : 데이터의 크기를 정수형으로 반환하는 메소드
System.out.println("size() 메소드");
System.out.println("list의 크기 : " + list.size());
System.out.println();
// 3. get(index) : list의 index에 저장되어 있는 데이터를 출력하는 메소드
System.out.println("get() 메소드");
System.out.println("list[3] : " + list.get(3));
System.out.println();
// (복습) list에 있는 모든 요소를 화면에 출력해보자
for(int i=0; i<list.size(); i++) {
System.out.printf("list[%d] : %s\n", i, list.get(i));
}
System.out.println();
// 4. remove(index) : list의 특정 요소(index)를 제거하는 메소드
// ==> 다음 index부터 index 값이 하나씩 당겨진다
System.out.println("remove() 메서드");
list.remove(2);
for(int i=0; i<list.size(); i++) {
System.out.printf("list[%d] : %s\n", i, list.get(i));
}
System.out.println();
// 5. add(index, element(값)) : list의 특정 index에 데이터를 추가하는 메소드
// ==> 해당 index에 추가가 되고, 기존에 있던 데이터들은 뒤로 한 index씩 밀려난다
System.out.println("add(index, element(값)) 메소드");
list.add(2, "세종대왕");
for(int i=0; i<list.size(); i++) {
System.out.printf("list[%d] : %s\n", i, list.get(i));
}
System.out.println();
// 6. clear() : 모든 요소를 제거하는 메소드
// 한번 실행시키면 다 지워진다.
list.clear();
System.out.println("clear() 메소드");
System.out.println("list.size() : " + list.size());
System.out.println();
}
}
● add() : 데이터를 추가하는 메소드
● size() : 데이터의 크기를 정수형으로 반환하는 메소드
● get(index) : list의 index에 저장되어 있는 데이터를 출력하는 메소드
● clear() : 모든 요소를 제거하는 메소드
● remove(index) : list의 특정 요소(index)를 제거하는 메소드
==> 다음 index부터 index 값이 하나씩 당겨진다
● add(index, element(값)) : list의 특정 index에 데이터를 추가하는 메소드
==> 해당 index에 추가가 되고, 기존에 있던 데이터들은 뒤로 한 index씩 밀려난다
ArrayList 객체 생성
add() 메소드
size() 메소드
list의 크기 : 6
get() 메소드
list[3] : 김유신
list[0] : 홍길동
list[1] : 이순신
list[2] : 유관순
list[3] : 김유신
list[4] : 김연아
list[5] : 유관순
remove() 메서드
list[0] : 홍길동
list[1] : 이순신
list[2] : 김유신
list[3] : 김연아
list[4] : 유관순
add(index, element(값)) 메소드
list[0] : 홍길동
list[1] : 이순신
list[2] : 세종대왕
list[3] : 김유신
list[4] : 김연아
list[5] : 유관순
clear() 메소드
list.size() : 0
예제2) Iterator를 사용하여 출력
package collection;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Ex02 {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("one");
list.add("two");
list.add("three");
list.add("four");
list.add("five");
// Iterator : 자바의 컬렉션 프레임워크에서 컬렉션에 저장되어 있는 요소들을 읽어오는 방법을 표준화 해 놓은 객체
Iterator<String> it = list.iterator();
while(it.hasNext()) {
// next() : 다음 요소를 가져오는 메소드
System.out.println(it.next());
}
}
}
▶ Iterator : 자바의 컬렉션 프레임워크에서 컬렉션에 저장되어 있는 요소들을 읽어오는 방법을 표준화 해 놓은 객체
결과
one
two
three
four
five
'Back-End > Java' 카테고리의 다른 글
[JAVA] 컬렉션 프레임워크(Collection Framework) - Stack, Queue (0) | 2021.09.17 |
---|---|
[Java] 컬렉션 프레임워크_LinkedList (0) | 2021.09.17 |
[Java] 제네릭(Generic) (지네릭스) (0) | 2021.09.17 |
[JAVA] 싱글톤(singleton) 방식으로 객체 생성하기 (0) | 2021.09.17 |
[Java] 래퍼 클래스(wrapper class) (0) | 2021.09.17 |
댓글