Collection Framework (자료구조)

heeezni·2025년 6월 3일
0

Java 문법

목록 보기
12/14
post-thumbnail

Collection

  • Java에서 '객체'들을 모아서 처리할 때 유용한 방법들을 제공하는 API 집합을
    Collection Framework라고 한다. (= 자료구조)

  • Java의 컬렉션 프레임워크는 java.util 패키지에서 지원

  • 컬렉션 프레임워크는 대부분 최상위 인터페이스의 메서드를 사용하므로,
    하위의 어떤 구현체를 사용하더라도 메서드 사용 방식이 일관된다.
    → 데이터를 담을 때는 add(), 길이를 구할 때는 size()

사물이 모여 있는 모습의 유형

  • 순서가 있는 구조: List (JS의 배열과 유사), Queue (FIFO - 선입선출)
    중복 허용 O
  • 순서가 없는 구조: Set (홈런볼), Map (키-값 쌍 / 키세스 초콜릿)
    중복 허용 X

Collection 자체는 인터페이스이며, List, Set, Queue가 이를 구현함
Map은 Collection 인터페이스를 구현하지 않지만, 자주 함께 묶여서 설명됨

Set은 중복을 허용하지 않음, Map은 키는 중복 불가, 값은 중복 가능.


List

순서 있는 집합을 처리하는 대표적인 구조인 List

package collection;

import java.util.ArrayList;
import java.util.List;

public class ListTest {

	public static void main(String[] args) {

		List<String> list = new ArrayList<>(); // 고무줄 배열 (JS 배열과 유사)
		// <> 안에 자료형을 명시하면 컴파일러가 타입 체크를 해줌 → 제네릭(Generic)

		list.add("apple");
		list.add("banana");
		list.add("grape");
		list.add("orange");

		// 고전적 반복문 (인덱스 기반 접근 - 빠름)
		for (int i = 0; i < list.size(); i++) {
			System.out.println(list.get(i));
		}

		// 향상된 for문 - Java 5부터 도입
		for (String fruit : list) { // 리스트에 저장된 요소를 하나씩 꺼냄
			System.out.println(fruit);
		}
	}
}

List vs 배열

  • 공통점: 순서를 가지며 인덱스로 접근 가능
  • 차이점:
    1) 배열은 생성 시 반드시 크기를 명시하고, 기본형도 저장 가능
    2) List객체만 저장하며, 크기가 유동적이다 (JS 배열과 유사)
항목배열 (Array)List (컬렉션)
순서있음있음
인덱스 접근가능가능
크기고정 – 생성 시 반드시 명시유동적 – 추가/삭제에 따라 자동 변경
저장 대상기본형 + 참조형 모두 가능**객체(참조형)**만 저장 가능
기능별도 없음 (기본 문법 사용)다양한 메서드 제공 (add(), remove(), size() 등)
유사 개념C의 배열JavaScript의 배열

제네릭 (Generic)

제네릭(Generic)은 자바에서 컴파일 시 타입 안정성을 확보하기 위해 사용하는 문법

왜 쓸까?

  • 타입 안정성 확보 → 컴파일 타임에 타입 체크 가능

  • 형변환 생략 → Object로 저장하고 꺼낼 때 형변환하는 번거로움 제거
    (실질적인 작업을 하려면 결국 형변환이 필요하니까)

  • 코드 재사용성 증가 → 다양한 타입에 대해 동일한 로직 재사용 가능

// 제네릭 사용 안 함 (비추)
List list = new ArrayList();
list.add("apple");
String item = (String) list.get(0); // 형변환 필요

// 제네릭 사용 (추천)
List<String> list = new ArrayList<>();
list.add("apple");
String item = list.get(0); // 형변환 필요 없음

Set

순서 없는 집합 중 하나인 Set

package collection;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class SetTest {

	public static void main(String[] args) {
		Set<String> set = new HashSet<>(); 
		/*Java 7부터는 다이아몬드 연산자(<>)를 사용할 때 
        우측 타입은 컴파일러가 좌측 타입을 보고 '자동 추론'하기 때문에, 생략 가능*/

		// 중복된 값 없이 저장됨 (Set의 특징)
		set.add("BMW");
		set.add("Benz");
		set.add("Audi");
		set.add("K9");

		// ✅ Set은 인덱스가 없기 때문에 일반 for문 사용 불가
		// 대신, ✅ Iterator 또는 ✅ 향상된 for문 사용

		Iterator<String> it = set.iterator(); 
        /*Iterator : 순서 없이 저장된 요소를 
        하니씩 꺼내서 처리하기 위한 도구*/

		while (it.hasNext()) { // 다음 요소가 존재하는지 확인 (true/false 반환)
			String obj = it.next(); // 다음 요소를 반환하고, 커서를 한 칸 이동시킴
			System.out.println(obj);
		}
	}
}

Iterator

컬렉션에 저장된 요소들을 하나씩 꺼내서 처리할 수 있게 해주는 객체
인덱스 없이 저장된 Set이나 Map 등에 사용됨

주요 메서드:

  • hasNext() → 다음 요소가 있는지 확인
  • next() → 다음 요소 반환
  • remove() → 현재 요소 삭제 (선택적)

set도 향상된 for문이 가능하다!

for(String obj : set){
	System.out.println(obj);
} 

Set은 Iterable 인터페이스를 구현하고 있어서 향상된 for문으로 순회 가능
사실 내부적으로는 Iterator가 자동으로 사용


Map

순서 없는 집합 중 하나인 Map

Map은 <Key, Value> 쌍으로 구성된 구조
(대표적으로 HashMap, Hashtable, Properties, TreeMap 등)

package collection;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class MapTest {
	public static void main(String[] args) {

		Map<String, String> map = new HashMap<>();

		map.put("a1", "가나 초콜릿");
		map.put("a2", "허쉬 초콜릿");
		map.put("a3", "페레로로쉐");

		// 1️⃣ key만 뽑아서 Set으로 반환
		Set<String> keySet = map.keySet();

		// 2️⃣ Set은 순회할 수 없으므로 Iterator로 변환
		Iterator<String> it = keySet.iterator();

		while (it.hasNext()) {
			String key = it.next(); // key 하나씩 꺼냄
			String value = map.get(key); // key를 이용해 value 꺼냄
			System.out.println(key + " : " + value);
		}
        
        //향상된 for문도 가능!
        for (String key : map.keySet()) {
    		System.out.println(key + " : " + map.get(key));
		}

	}
}
profile
아이들의 가능성을 믿었던 마음 그대로, 이제는 나의 가능성을 믿고 나아가는 중입니다.🌱

0개의 댓글