본문 바로가기
Back_end/JAVA

JAVA - 컬렉션 프레임워크

by hyeon1016 2024. 9. 30.

컬렉션 프레임 워크

 

클래스들의 집합

 

Collection 인터페이스를 구현하는 Set, List, Queue 그리고

독자적인 Map 인터페이스가 있다.

 

이들은 동일한 메서드를 가지게 된다.

반환타입 메서드 설명
void add(E e) 파라미터로 지정된 객체를 컬렉션에 추가
boolean contains(Object obj) 객체 obj가 존재(포함)하는지 여부
Iterator Iterator() 해당 컬렉션 요소의 iteraror 객체를 반환
boolean isEmpty() 컬렉션이 비어있는지 아닌지 여부
void remove(Object obj) 객체 obj를 컬렉션에서 제거
int size() 컬렉션의 요소(객체)의 개수를 반환

 

 

Iterator클래스

컬렉션의 요소에 접근하여 반복적인 작업을 할 때 도움을 주는 클래스.

 

메서드

메서드 설명
hasNext() 다음 객체가 있는지 없는지 판단 후에 커서를 이동
next() 커서가 위치한 객체를 반환

 

 

컬렉션의 요소를 반복적으로 출력하는 방법

Iterator<String> it = list.iterator();

while(it.hasNext()) {
    System.out.println(it.next());
}

 

 

 

List

객체를 저장하는 배열

 

특징

1. 저장되는 요소(객체)들의 순서가 유지된다.

2. 중복을 허용한다.

 

List인터페이스를 구현한 클래스로 ArrayList와 LinkedList가 있다.

 

주요 메서드

반환 타입 메서드 설명
void add(int index, E elem) index 위치에 있는 요소 elem 추가
E get(int index) index 위치에 있는 요소를 반환
int indexOf(Object o) 요소 o가 있는 위치를 반환
ListIterator listiterator() ListIterator 객체를 반환
E remove(int indet) index 위치에 있는 요소를 삭제하고 삭제한 요소를 반환
E set(int index, E elem) 지정한 index의 요소를 elem으로 변경

 

 

ArrayList

배열에서 발전된 형태의 List로 요소를 추가하면 0번 인덱스부터 차례대로 요소가 저장된다.

 

사용 예시

ArrayList list1 = new ArrayList();

list1.add("a");
list1.add("b");
list1.add("c");
list1.add("d");
list1.add("e");

System.out.println("초기상태");
System.out.println("인덱스 1번 위치에 B추가");
list.add(1, "B");
System.out.println(list1);

System.out.println("인덱스 2번 위치의 값 제거");
list.remove(2);
System.out.println(list1);

System.out.println("인덱스 2번 위치의 값 반환" + list.get(2));

 

1. list1이라는 이름의 ArrayList 객체를 생성한다. 

2. list1에 add() 메서드를 사용하여 a, b, c, d, e 문자열을 추가한다.

3. list1에 add(1, "B") 메서드를 사용해 list1의 1번 인덱스에 B 문자열을 추가하고 list1을 콘솔에 출력한다.

4. list1에 remove(2) 메서드를 사용해 list1의 2번 인덱스를 삭제하고 list1을 콘솔에 출력한다.

5. list1에 get(2) 메서드를 사용하여 list1의 2번 인덱스에 있는 요소를 반환한다.

 

객체 저장 예시

배열 안에 어떤 객체가 들어가 있는지 명확히 하기 위해 사용한다.(가독성, 안정성)

member m1 = new member(50, "고기");
member m2 = new member(30, "채소");

ArrayList<member> arr = new ArrayList<member>();

arr.add(m1);
arr.add(m2);

member pp1 = arr.get(0);
member pp2 = arr.get(1);

 

1. m1, m2이라는 이름의 member 객체를 생성하고, 생성자의 파라미터로 각각(50, "고기"), (30, "채소")를 전달한다.

2. member 객체를 저장할 수 있는 ArrayList 객체를 생성한다.(참조변수 arr)

3. arr에 add() 메서드를 사용하여 m1, m2를 저장한다.

4. member 타입 변수 pp1, pp2에 각각 arr.get(0), arr.get(1)을 저장한다.

 

LinkedList

요소들이 유기적으로 연결되어 있는 List

각 요소가 자신의 이전, 다음 요소의 주소를 가지고 있는 구조

 

Class A <ㅡ> Class B <ㅡ> Class C

 

ArrayList 보다 작업 속도가 빠르다는 특징이 있다.

 

비교

ArrayList al = new ArrayList();
LinkedList ll = new LinkedList();
long start = System.currentTimeMillis();

for (int i = 0; i < 100000; i++) {
    al.add(0, String.valueOf(i));
}

long end = System.currentTimeMillis();
System.out.println("ArrayList 작업 시간 : " + (end - start));
start = System.currentTimeMillis();

for (int i = 0; i < 100000; i++) {
    ll.add(0, String.valueOf(i));
}

end = System.currentTimeMillis();
System.out.println("LinkedList 작업 시간 : " + (end - start));

 

위의 코드는 ArrayList와 LinkedList의 속도를 비교하는 코드다.

 

LinkedList가 ArrayList보다 빠른 것을 확인할 수 있다.

 

 

Map

을 한 쌍으로 저장하는 구조

ex) apple(key) : 사과(data)

 

특징 

1. 키를 통해 값을 참조할 수 있다.

2. 중복된 키를 가질 수 없다.

3. 순서가 없다.

 

Map 인터페이스를 구현한 클래스로 HashMap과 TreeMap이 있다.

 

메서드

반환타입 메서드 설명
boolean containsKey(Object key) key가 포함되어 있는지 확인 후 반환
boolean containsValue(Object Value) value가 포함되어 있는지 확인 후 반환
V get(Object key) 해당 key의 값을 반환
boolean isEmpty() 맵이 비어 있는지 확인
Set<key> keySet() 모든 key들을 Set의 형태로 반환
V put(K key, V value) key와 value를 요소로 추가
V remove(Object key) key를 가진 요소를 제거
int size() 전체 요소의 개수를 반환

 

HashMap

대용량 데이터 관리에 유리하다.

 

사용 예시(사전)

HashMap hm = new HashMap();
Scanner sc = new Scanner(System.in);

hm.put("apple", "사과");
hm.put("paper", "종이");
hm.put("flower", "꽃");

String voca;

System.out.println("알고 싶은 단어를 입력하세요.");
voca = sc.nextLine();

if (hm.containsKey(voca)) {
    System.out.println("해당하는 뜻은 : " + hm.get(voca));
} else {
    System.out.println("해당하는 뜻은 데이터베이스에 없습니다.");
}

 

1. hm이라는 이름을 가진 HashMap 객체를 생성한다.

2. sc이라는 이름을 가진 Scanner객체를 생성하고, 파라미터로 System.in을 전달한다.

3. hm에 put() 메서드를 사용해 key와 value를 추가한다.

4. String 타입의 변수 voca를 선언한다.

5. 콘솔에 "알고 싶은 단어를 입력하세요."라는 문구를 띄운다.

6. 변수 voca에 sc.nextLine()을 저장해 콘솔창에 입력된 문자열을 저장한다.

7. if문을 사용한다.

 

if문

if-1. 콘솔에 입력한 값이 hm의 key와 일치한 것이 있는가?

if-2. 일치하다면 hm.get(voca)를 사용해 해당 키와 한 쌍인 값을 출력한다.

if-3. 일치하지 않는다면 "해당하는 뜻은 데이터베이스에 없습니다."를 출력한다.

 

TreeMap

순서대로 저장된다.

 

 

Set

 

특징

1. 중복된 요소가지지 않는다.(중복된 요소를 추가하면 false반환)

2. 저장 순서가 없다.

 

Set 인터페이스의 클래스로 HashSet과 TreeSet이 있다.

 

HashSet

Set 인터페이스와 동일한 특징을 가진 클래스다.

 

생성자

생성자 설명
HashSet() HashSet 클래스의 기본 생성자
HashSet(Collection collection) 컬렉션의 요소로 HashSet 객체 생성
HashSet(int capacity) capacity의 용량을 가진 객체 생성

 

TreeSet

Set 인터페이스에서 정렬 기능이 추가된 클래스다.

 

정렬은 자연순서로 작은 수부터 큰 수 순서로 정렬된다.(문자열의 경우 첫 글자를 수로 변환해 순서대로 정렬한다.)

 

HashSet, TreeSet 사용예시

HashSet hs = new HashSet();

hs.add("demon");
hs.add("banana");
hs.add("tomato");
hs.add("apple");
hs.add("cargo");

TreeSet ts = new TreeSet();

ts.add("banana");
ts.add("demon");
ts.add("apple");
ts.add("cargo");
ts.add("tomato");

Iterator it = hs.iterator();
System.out.println("<HASH 출력>");

while (it.hasNext()) {
    System.out.println("" + it.next());
}

Iterator it2 = ts.iterator();
System.out.println("<TREE 출력>");

while (it2.hasNext()) {
    System.out.println("" + it2.next());
}

System.out.println("\n현재 TreeSet의 크기 : " + ts.size());

 

1. HashSet, TreeSet 객체를 생성하고 add() 메서드를 사용해 객체를 요소로 추가한다.

2. HashSet, TreeSet의 참조변수에 iterator() 메서드를 사용하여 각각 Iterator 타입의 it, it2 변수에 저장한다.

3. while 문을 사용해 다음 요소가 존재할 때까지 반복하며 모든 요소를 출력한다.

4. TreeSet의 크기를 출력한다.

 

HashSet은 일정한 순서 없이 저장된 반면, TreeSet은 정렬방법에 따라 순서대로 저장된 것을 확인할 수 있다.

 

Queue와 Stack

 

Queue

먼저 들어온 데이터를 먼저 내보내는 형태(FIFO : First In First Out)

 

메서드

예외발생여부 반환타입 메서드 설명
예외발생 boolean add(E e) Queue에 요소 e를 추가
예외발생 E element() Queue의 제일 상단 요소 반환
예외발생 E remove() Queue의 최상단 요소를 반환 후 제거
X boolean offer(E e) Queue에 요소 e를 추가
X E peek() Queue의 제일 상단 요소 반환
X E poll() Queue의 최상단 요소를 반환 후 제거

 

Stack

마지막에 들어온 데이터를 먼저 내보내는 형태(LIFO : Last In First Out)

 

메서드

반환타입 메서드 설명
E element() 요쇼를 반환
E peek() 요소를 반환
E pop() 요소 하나를 제거하고 반환
E push(E item) 새로운 요소 추가
int search(Object o) 요소 o가 있는지 검색해서 위치를 반환

'Back_end > JAVA' 카테고리의 다른 글

JAVA - 기본 API(java.time)  (0) 2024.09.30
JAVA - 기본 API(formatting, Object)  (0) 2024.09.29
JAVA - 기본 API(Timer/TimerTask)  (0) 2024.09.27
JAVA - 기본 API(BigDecimal, Wrapper)  (0) 2024.09.27
JAVA - 기본 API(java.util.Scanner)  (0) 2024.09.27