: 요소라고 불리는 가변 개수의 객체들의 저장소
-> 요소의 개수에 따라 크기 자동 조절
-> 요소의 삽입, 삭제에 따른 요소의 위치 자동 이동
-> 특정 타입만 다루지 않고, 여러 종류의 타입으로 변신할 수 있도록 클래스나 메소드를 일반화 시키는 기법
-> 클래스나 인터페이스 이름에 <.E>, <.K>, <.V> 등 타입 매개변수 포함
-> 컬렉션의 요소는 객체만 가능(기본 탕비으로 구현 불가)
즉, 형태는 같고 리턴값만 다른 클래스 여러개가 있을 때, 그것들을 하나로 합치는 것
// 제네릭 클래스 선언
class Box<T> {
private T value;
public void setValue(T value) {
this.value = value;
}
public T getValue() {
return value;
}
}
public class Main {
public static void main(String[] args) {
// String 타입으로 Box 사용
Box<String> stringBox = new Box<>();
stringBox.setValue("Hello");
System.out.println("String 값: " + stringBox.getValue());
// Integer 타입으로 Box 사용
Box<Integer> intBox = new Box<>();
intBox.setValue(123);
System.out.println("Integer 값: " + intBox.getValue());
}
}
\<결과>
String 값: Hello
Integer 값: 123
-> 동기화
-> 멀티스레드 환경
-> 안전성 우선



<예시 코드>


-> 비동기화
-> 단일 스레드 환경
-> 성능 우선



<예시 코드>

-> 토크나이저랑 비슷함

-> 딕셔너리랑 비슷함
K : 키
V : 값
put() 메서드 : 요소 삽입
get() 메서드 : 요소 검색
HashMap<String, String> h = new HashMap<String, String>(); // 해시맵 객체 생성
h.put("apple", "사과"); // "apple" 키와 "사과" 값의 쌍을 해시맵에 삽입
String kor = h.get("apple"); // "apple" 키로 값 검색. kor는 "사과



<예시 코드>

왜 (T) 캐스팅을 하나?
(T)는 타입 캐스팅을 명시적으로 선언하기 위해 필요합니다.
제네릭에서 Object를 구체적인 타입 T로 변환하려면 타입 캐스팅이 필수입니다.
타입 캐스팅을 생략하면 컴파일 오류가 발생합니다.
T[] stck = new T[10]; // 컴파일 오류 발생!
자바에서 제네릭 타입 T로 배열을 직접 생성할 수 없습니다.
왜냐하면, 런타임에는 T의 구체적인 타입 정보가 존재하지 않기 때문입니다.
제네릭 타입이 소거되면 모든 제네릭 타입은 Object로 변환됩니다.