java/개념

컬렉션과 제네릭

unhyepnhj 2024. 6. 8. 15:52

컬렉션(collection)

- 요소(element) 객체들의 저장소(컨테이너)

- 컬렉션은 제네릭(generics) 기법으로 구현

- 컬렉션의 요소는 객체만 가능

 

배열 vs 컬렉션

배열 컬렉션
- 삽입과 삭제가 빈번
- 데이터의 크기를 예측할 수 없는 프로그램에서 사용이 불편
- 고정 크기의 배열 사용이 어려운 경우 O
- 객체들을 쉽게 삽입, 삭제, 검색 가능
- 가변 크기의 컨테이너 → 요소의 개수에 따라 크기 자동 조절
- 요소의 삽입, 삭제에 따른 요소 위치 자동 이동


컬렉션을 위한 자바 인터페이스와 클래스

- 개발자는 컬렉션 클래스를 바로 사용 가능

- 모두 Collection<E>를 상속받음

 

Vector<E>, ArrayList<E>: 가변 크기의 배열 구현

LinkedList<E>: 노드들이 링크로 연결되는 배열 구현

Stack<E>: 스택 구현

HashSet<E>: 집합 구현

→ 단일 클래스 객체만을 요소로 다룸

 

HashMap<K, V>: '키(K)'와 '값(V)'의 쌍으로 이루어지는 데이터를 저장하고 '키'로 검색


컬렉션의 특징

 

1. 컬렉션은 제네릭(generics) 기법으로 구현

- 제네릭: 모든 종류의 타입을 다룰 수 있도록 클래스나 메소드를 타입 매개변수를 이용해 선언하는 기법

타입 매개변수 <E>, <K>, <V>: 특정 타입만 다루지 않고 여러 종류의 타입으로 변신할 수 있도록 컬렉션을 일반화하기 위해 사용

 

2. 컬렉션 요소로는 객체만 가능

- 원칙적으로는 기본 타입의 데이터를 컬렉션 요소로 사용할 수 없음

- 기본 타입의 값이 삽입되면 자동 박싱에 의해 Wrapper 클래스 타입으로 변환되어 객체로 저장 

Vector<int> v = new Vector<int>();	//int는 기본 타입이므로 컬렉션 요소로 사용 불가 
Vector<Integer> v = new Vector<Integer>();	//정상 코드

제네릭

 

제네릭의 기본 개념

- JDK 1.5부터 도입

- 모든 종류의 데이터 타입을 다룰 수 있도록 일반화된 타입 매개 변수로 클래스나 메소드를 작성하는 기법 

- C++의 템플릿과 동일

//Stach<E> 클래스 예시

class Stack<E>{
	...
    void push(E element){ ... }
    E pop() { ... }
    ...
}

- Stack<E>에서 E에 구체적인 타입을 지정하면 지정된 타입만 다룰 수 있는 구체화(specialized)된 스택이 됨

- Stack<Integer>는 Integer 타입만

- Stack<Point>는 Point 타입만

 

- 대부분의 컬렉션 클래스들은 JDK에 제네릭으로 만들어져 있음

https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/Stack.html

 

Stack (Java SE 21 & JDK 21)

Type Parameters: E - Type of component elements All Implemented Interfaces: Serializable, Cloneable, Iterable , Collection , List , RandomAccess, SequencedCollection public class Stack extends Vector The Stack class represents a last-in-first-out (LIFO) st

docs.oracle.com

 

제네릭 타입 매개변수 

- 하나의 대문자를 사용하는 것이 관례

  • E: Element를 의미, 컬렉션에서 요소임을 나타냄
  • T: Type을 의미
  • V: Value를 의미
  • K: Key를 의미