자바 컬렉션 (Java Collection, 컬렉션 프레임워크)

박영준·2023년 4월 5일
0

Java

목록 보기
59/111

1. 정의

Collection (컬렉션)

  • 데이터의 집합, 그룹

    • 다수의 요소를 하나의 그룹으로 묶어, 효율적으로 저장/관리할 수 있는 기능을 제공하는 컨테이너

    • 기본형 변수가 아닌, 참조형 변수를 저장

프레임워크

  • 표준화된 프로그래밍

  • 라이브러리 vs 프레임워크

    • 라이브러리 : 공통으로 사용되는 유용한 '기능'들을 모듈화하여 제공
    • 프레임워크 : '기능 + 정형화된 프로그래밍 방식'까지 제공

컬렉션 프레임워크 (JCF, Java Collection Framework) (컬렉션 + 프레임워크)

  • 데이터의 그룹을 저장하는 클래스들을 표준화한 설계

    • Collection 과 이를 구현하는 Class를 정의하는 인터페이스를 제공
  • 컬렉션 프레임워크 vs 배열

    • 컬렉션 프레임워크 : 크기가 가변적
    • 배열 : 크기가 고정적

2. 장점

아래의 장점들 덕분에, 프로그램의 유지보수가 수월하다.

  1. 인터페이스(List, Queue, Set, Map 등...)를 제공하고,
    이를 구현하는 클래스를 제공하여 일관된 API 를 사용할 수 있다.

  2. 가변적인 저장 공간을 제공
    (↔ 배열 : 고정적인 저장 공간)

  3. 자료구조, 알고리즘을 구현하기 위한 코드를 직접 작성할 필요 X
    이미 구현된 컬렉션 클래스를 목적에 맞게 선택하여 사용하면 된다.

  4. 제공되는 API 의 코드는 검증되었으며, 고도로 최적화 되어있다.

3. Enumeration, Iterator, ListIterator

1) 정의

Enumeration

  • Iterator 의 구버진

Iterator

  • 컬렉션 프레임워크에서 컬렉션에 저장되어 있는 요소들을 읽어오는 방법을 표준화한 인터페이스

  • Collection 인터페이스에 정의된 메서드

    • 따라서, List와 Set에서도 사용 가능
  • 주로 while 반복문으로 사용

ListIterator

  • Iterator + 양방향 조회 기능 이 추가된 인터페이스
    • 단, List 를 구현한 경우에만 사용 가능

2) 사용법

import java.util.*;

class Ex {
  public static void main(String[] args) {
      ArrayList list = new ArrayList();		// 다른 컬렉션으로 변경하고 싶다면, 이 부분만 변경하면 된다
      list.add("1");
      list.add("2");
      list.add("3");
      list.add("4");
      list.add("5");

      Iterator it = list.iterator();
     
      while (it.hasNext()) {			// boolean hasNext() : 읽어올 요소가 있는지 확인
          Object obj = it.next();		// Object next() : 다음 요소를 반환
          System.out.println(obj);
     }
}

/* 출력 결과
1
2
3
4
5
*/

4. Comparable, Comparator

1) 정의

  • 컬렉션을 정렬하는데 필요한 메서드를 정의하는 인터페이스

    • Comparable

      • 기본 정렬 기준을 구현하는데 사용

      • 기본적으로 오름차순으로 정렬

    • Comparator

      • 기본 정렬 기준이 아닌, 다른 기준으로 정렬할 때 사용

      • 오름차순이 아닌, 내림차순 or 다른 기준으로 정렬

      • 문자열을 대소문자 구분없이 정렬

2) 사용법

예시 1 : compare() 메서드

public interface Comparator {
	int compare(Object o1, Object o2);		// o1 과 o2 를 비교
    boolean equals(Object obj);
}
  • 반환 값

    • 비교하는 객체 == 해당 객체 : 0 을 반환

    • 비교하는 객체 > 해당 객체 : - (음수) 를 반환

    • 비교하는 객체 < 해당 객체 : + (양수) 를 반환

예시 2 : compareTo() 메서드

// 방법 1
public interface Comparator {
	int compareTo(Object o);		// o 와 객체 자신(this) 을 비교
}

// 방법 2 : 간단한 뺄셈으로도 가능
...

return thisVal - anotherVal;
  • 반환 값

    • 비교하는 객체 == 해당 객체 : 0 을 반환

    • 비교하는 객체 > 해당 객체 : - (음수) 를 반환

    • 비교하는 객체 < 해당 객체 : + (양수) 를 반환

  • 방법 2

    • 왼쪽 값 == 오른쪽 값 : 0 을 반환

    • 왼쪽 값 < 오른쪽 값 : - (음수) 를 반환

    • 왼쪽 값 > 오른쪽 값 : + (양수) 를 반환

5. 컬렉션 프레임워크의 상속계층도

  • collection 인터페이스는 크게 List, Set, Map 으로 구분

    • List, Set : 공통 부분이 많아서, collection 인터페이스를 정의할 수 있었음

    • Map : 조금 다른 구조를 가지고 있어, 같은 상속계층도에 포함하진 않음

  • Collection Framework의 모든 Collection 클래스들은 List, Set, Map 中 하나를 반드시 구현하고 있다!

  • 세부적으로 여러 클래스가 해당 인터페이스를 구현하거나, 다른 인터페이스가 상속받는 구조로 되어있다.


1. Collection 인터페이스

1) 정의

  • List, Set의 부모 인터페이스

주의! 구별하자

  • Collection : 인터페이스

2) 메서드

2. List 인터페이스

참고: 자바 컬렉션 프레임워크 - List 인터페이스

3. Set 인터페이스

참고: 자바 컬렉션 프레임워크 - Set 인터페이스

4. Map 인터페이스

참고: 자바 컬렉션 프레임워크 - Map 인터페이스


연습문제

1. 코드의 실행 결과?

import java.util.*;

class Ex {
	public static void main(String[] args) {
		ArrayList list = new ArrayList();		// 중복 허용, 저장순서 유지 -> 3, 6, 2, 2, 2, 7
		list.add(3);
		list.add(6);
		list.add(2);
		list.add(2);
		list.add(2);
		list.add(7);
        
		HashSet set = new HashSet(list);		// 중복 허용 X -> 3, 6, 2, 7
		TreeSet tset = new TreeSet(set);		// 오름차순으로 정렬 -> 2, 3, 6, 7
		Stack stack = new Stack();
		stack.addAll(tset);			// 2 부터 스택에 push

		while (!stack.empty())
			System.out.println(stack.pop());		// top에서부터 꺼낸다
	}
}

/* 출력 결과
7
6
3
2
*/

2. BanNoAscending클래스를 완성하여 ArrayList에 담긴 Student인스턴스들이 반(ban)과 번호(no) 로 오름차순 정렬되게 하시오.(반이 같은 경우 번호를 비교해서 정렬)

import java.util.*;
 
class Student {
    String name;
    int ban;
    int no;
    int kor;
    int eng;
    int math;
 
    Student(String name, int ban, int no, int kor, int eng, int math) {
        this.name = name;
        this.ban = ban;
        this.no = no;
        this.kor = kor;
        this.eng = eng;
        this.math = math;
    }
 
    int getTotal() {
        return kor + eng + math;
    }
 
    float getAverage() {
        return (int) ((getTotal() / 3f) * 10 + 0.5) / 10f;
    }
 
    public String toString() {
        return name + "," + ban + "," + no + "," + kor + "," + eng + "," 
        + math + "," + getTotal() + "," + getAverage();
    }
}

// 정답
class BanNoAscending implements Comparator {
    public int compare(Object o1, Object o2) {

		if (o1 instanceof Student && o2 instanceof Student) {
			Student s1 = (Student) o1;
			Student s2 = (Student) o2;

			int result = s1.ban - s2.ban;

			if (result == 0) {
				return s1.no - s2.no;
			}

			return result;
		}
	}
}
// ---

class Exercise11_7 {
    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add(new Student("이자바", 2, 1, 70, 90, 70));
        list.add(new Student("안자바", 2, 2, 60, 100, 80));
        list.add(new Student("홍길동", 1, 3, 100, 100, 100));
        list.add(new Student("남궁성", 1, 1, 90, 70, 80));
        list.add(new Student("김자바", 1, 2, 80, 80, 90));
        Collections.sort(list, new BanNoAscending());
        Iterator it = list.iterator();
        while (it.hasNext())
            System.out.println(it.next());
    }
}
  • 양/음수/0인지 판단하여 정렬

3. 빙고판은 1~30 사이의 숫자들로 만든 것인데, 숫자들의 위치가 잘 섞이지 않는다는 문제가 있다. 이러한 문제가 발생하는 이유와 이 문제를 개선하기 위한 방법을 설명하고, 이를 개선한 새로운 코드를 작성하시오.

import java.util.*;

class Exercise11_10 {
	public static void main(String[] args) {
		Set set = new HashSet();
		int[][] board = new int[5][5];

		for (int i = 0; set.size() < 25; i++) {
			set.add((int) (Math.random() * 30) + 1 + "");
		}

		Iterator it = set.iterator();

		for (int i = 0; i < board.length; i++) {
			for (int j = 0; j < board[i].length; j++) {
				board[i][j] = Integer.parseInt((String) it.next());
				System.out.print((board[i][j] < 10 ? " " : "") + board[i][j]);
			}

			System.out.println();
		}
	}
}
// 정답
ArrayList list = new ArrayList(set);
Collections.shuffle(list);
  • HashSet은 중복 X. 순서 유지 X
    • 따라서, 아무리 임의의 순서로 저장을 해도, 해싱(hashing) 알고리즘의 특성상 한 숫자가 고정된 위치에 저장된다
    • List인터페이스를 구현한 컬렉션 클래스(ArrayList 등...)를 사용해서, 이 문제를 해결 할 수 있다.

참고: [JAVA] Java 컬렉션(Collection) 정리
참고: JAVA Collection Framework (1) - 컬렉션 프레임워크란?
참고: [JAVA] 컬렉션(Collection)이란?(추가 : Collecion의 요소 상세설명)
참고: [Java]컬렉션(Collections) 정리
참고: [java] HashMap에서 stream을 이용하여 정렬하는 법
참고: [Java] 자바 HashMap 사용법 & 예제 총정리
참고: [JAVA] HashMap의 개념 및 사용법 정리
참고: [JAVA] Map - getOrDefault 이란? 사용법 및 예제
참고: [Java] Map - getOrDefault 란? 사용법/예제
참고: [백준] 18258번 : 큐 2 - JAVA [자바]
참고: 자바의 정석 Chapter11 컬렉션 프레임 워크
참고: 링크드리스트, 더블링크드리스트, 더블서큘러링크드리스트 란?
참고: [Java] Iterator, hasNext() 와 next()
참고: [Java/자바] TreeSet 사용법

profile
개발자로 거듭나기!

0개의 댓글