본문으로 건너뛰기
Advertisement

12.1 지네릭스 (Generics)

지네릭스(Generics)는 클래스나 메서드를 만들 때, 그 안에서 쓰일 데이터 타입을 미리 정해두는 것이 아니라 사용하는 시점에 지정할 수 있게 해주는 기능 입니다. Java 5부터 도입되었으며, 현재 자바 프로그래밍에서 없어서는 안 될 핵심 문법입니다.

1. 왜 지네릭스가 필요한가?

지네릭스가 없다면 모든 타입을 담기 위해 최상위 부모 타입인 Object를 사용해야 합니다. 이렇게 하면 값을 꺼낼 때마다 (String), (Integer) 같은 형변환(Casting) 을 수동으로 해야 하고, 잘못 지정하면 런타임에 ClassCastException (형변환 오류)이 터집니다.

// 지네릭스 없이 Object 사용 (위험!)
Object item = "Hello";
String s = (String) item; // 형변환 필요
Integer n = (Integer) item; // 런타임 에러! ClassCastException 발생

2. 지네릭 클래스 만들기

타입 파라미터로는 보통 한 글자 대문자를 관례로 씁니다. (T = Type, E = Element, K = Key, V = Value)

// T라는 타입 파라미터를 받는 제네릭 박스 클래스
public class Box<T> {
private T item; // T 타입의 변수

public void put(T item) {
this.item = item;
}

public T get() {
return item;
}
}

public class GenericExample {
public static void main(String[] args) {
// String 타입을 담는 박스
Box<String> strBox = new Box<>();
strBox.put("안녕하세요!");
String result = strBox.get(); // 형변환 없이 바로 String으로 반환!
System.out.println(result); // 안녕하세요!

// Integer 타입을 담는 박스
Box<Integer> intBox = new Box<>();
intBox.put(100);
int num = intBox.get();
System.out.println(num); // 100
}
}

3. 지네릭 메서드 만들기

메서드 반환 타입 앞에 타입 파라미터를 선언합니다.

public class GenericUtil {
// 두 값을 출력하고, 첫 번째 값을 반환하는 제네릭 메서드
public static <T> T printAndReturn(T first, T second) {
System.out.println("첫 번째: " + first);
System.out.println("두 번째: " + second);
return first;
}

public static void main(String[] args) {
String s = printAndReturn("사과", "바나나");
Integer n = printAndReturn(10, 20);
}
}

4. 실전에서의 지네릭스: 컬렉션

앞서 배운 ArrayList<String>, HashMap<String, Integer>의 꺾쇠 괄호(<>)가 바로 지네릭스입니다. 자바 표준 컬렉션 API 전체가 지네릭스로 만들어져 있어서 타입 안전성(Type Safety) 이 컴파일 시점에 보장됩니다.

import java.util.ArrayList;

ArrayList<String> list = new ArrayList<>();
list.add("자바");
// list.add(123); // 컴파일 에러! String 타입만 들어올 수 있습니다.

지네릭스는 코드의 재사용성타입 안전성 을 동시에 높여주는 아주 강력한 기능입니다.

Advertisement