제네릭(Generic)
제네릭은 클래스나 메서드에서 사용되며, 코드의 재사용성을 높이고 타입 안전성을 보장하기 위해 사용된다.
<T>와 같은 형태로 사용하며, 여기서 T는 타입 변수(type variable)라고 한다.
보통 T, E, K, V 같은 이름을 자바 컨벤션으로 사용하지만, 다른 이름을 써도 된다. 하지만 자주 쓰이는 이름을 사용하면 혼란을 줄일 수 있다.
제네릭 클래스 예시
public class Generic<T, U, E> {
public E multiTypeMethod(T t, U u) {
...
}
}
Generic<Long, Integer, String> instance = new Generic<>();
instance.multiTypeMethod(longVal, intVal);
위 예시처럼 여러 개의 타입 변수를 사용할 수 있다. 제네릭 클래스는 다양한 타입을 처리할 수 있게 도와준다.
제네릭의 장단점
장점
타입 안전성
컴파일 시 타입을 체크해, 런타임 에러를 줄여준다.
코드 재사용성
하나의 클래스나 메서드를 여러 타입에 대해 재사용할 수 있다.
가독성 향상
명확한 타입 정보를 제공해 코드의 가독성이 좋아진다.
단점
복잡성 증가
특히 다중 타입 변수를 사용할 때 코드가 복잡해질 수 있다.
제한 사항
기본 타입(primitive type)을 직접 사용할 수 없어, 래퍼 클래스를 사용해야 한다.
타입 소거
제네릭 정보가 컴파일 후 제거되므로, 런타임에서는 타입 정보를 알 수 없다.
와일드카드
와일드카드는 제네릭 타입에서 다양한 타입을 유연하게 다룰 수 있게 해 준다.
<? extends T>: T와 그 자손들만 사용 가능
<? super T>: T와 그 조상들만 사용 가능
<?>: 모든 타입 허용 (제한 없음)
와일드카드를 사용하는 이유는 다형성(polymorphism)을 지원하기 위해서이다.
예를 들어, <? extends T>는 T의 자손 타입만 허용함으로써, T의 멤버에 안전하게 접근할 수 있게 해 준다.
public class ParkingLot<T extends Car> {
...
}
// 사용 예시
ParkingLot<BMW> bmwParkingLot = new ParkingLot<>();
// Car의 자식 클래스인 BMW를 허용
ParkingLot<Iphone> iphoneParkingLot = new ParkingLot<>();
// 에러 발생: Iphone은 Car의 자식 클래스가 아니기 때문
제네릭 메서드(Generic Method)
제네릭 클래스의 타입 변수는 static 필드나 static 메서드에서 사용할 수 없다. 왜냐하면, 타입 변수가 인스턴스 변수로 간주되기 때문이다.
하지만 제네릭 메서드는 메서드 내에서만 타입 변수를 사용하기 때문에, static 메서드에서도 사용할 수 있다.
static <T> void sort(List<T> list, Comparator<? super T> c) { ... }
여기서 T는 메서드 내에서만 유효하며, 클래스의 T와는 다른 변수이다. 이름이 같더라도, 다른 범위(scope)에 속하기 때문에 혼동하지 않도록 주의해야 한다.
결론
제네릭은 자바에서 타입 안전성을 보장하면서도 코드의 재사용성을 높이는 중요한 기능이다. 제네릭을 활용하면 다양한 타입을 유연하게 처리할 수 있고, 잘못된 타입 사용으로 인한 오류를 미리 방지할 수 있다. 앞으로 코드를 작성할 때, 제네릭을 적절히 활용해서 더 안전하고 유지보수하기 쉬운 코드를 작성해 봐야겠다.
'JAVA' 카테고리의 다른 글
UncheckedException과 CheckedException (1) | 2024.09.13 |
---|---|
ArrayList는 어떻게 크기가 조절될까? (0) | 2024.09.11 |
Garbage Collection(GC) 더 자세히 살펴보기 (0) | 2024.09.09 |
Java final과 불변성 (0) | 2024.09.08 |
가비지 컬렉션이란? (1) | 2024.09.06 |
인터페이스와 추상 클래스 (3) | 2024.09.03 |
나만의 메서드가 한 가지 기능만 하는지 확인하는 기준 (0) | 2023.10.07 |
좋은 코드를 위한 네이밍 기법들 (0) | 2023.09.27 |