제네릭이란?
클래스, 인터페이스, 메소드 정의 시에 타입을 파라미터로 받아 컴파일 시간에 타입 체크를 가능하게 하는 기능이다.
다양한 타입에 대해 동일한 코드를 재사용할 수 있어 안전성, 유지보수성이 향상된다.
자주 쓰이는 제네릭 타입
- <T> : Type
- <E> : Element
- <K> : Key
- <V> : Value
- <N> : Number
반드시 한 글자일 필요는 없으며, 임의로 작성해도 무방하나 통상적으로 위와 같이 사용한다.
선언 및 생성
// 클래스, 인터페이스 선언
public class ClassName <T> { ... }
public interface InterfaceName <T> { ... }
// 제네릭 타입 2개를 인자로 받는 경우
public class HashMap <K, V> { ... }
제네릭 클래스의 사용 (객체 생성)
생성된 제네릭 클래스를 사용할 때(= 객체를 생성할 때)는 구체적 타입을 명시해야 한다.
public class ClassName <T, K> { ... }
public class Main {
public static void main(String[] args) {
ClassName<String, Integer> class1 = new ClassName<String, Integer>();
ClassName<String, Integer> class2 = new ClassName<>(); // 동일한 경우 생략 가능
}
}
주의할 점
타입 파라미터로 명시할 수 있는 것은 참조 타입 뿐이다.
int, double 등의 원시 타입은 올 수 없기 때문에 Integer, Double 등을 사용한다. (사용자 정의 클래스도 가능)
더보기
원시 타입 vs 참조 타입
원시 타입 Primitive type
- int, long, double, float, boolean, byte, short, char
- 사용하기 전에 선언 되어야 하며, Stack 메모리에 저장된다.
참조 타입 Reference Type
- 문자열, 배열, 열거, 클래스, 인터페이스 (java.lang.Object를 상속하는 모든 클래스)
- 객체를 사용할 때마다 참조 변수에 저장된 객체의 주소를 불러와서 사용하며, Heap 메모리에 저장된다.
제네릭 메소드
반환 타입 이전에 제네릭 타입을 선언하며, 파라미터 타입에 따라 제네릭 타입의 타입이 결정된다.
메소드에서 독립적으로 제네릭 유형을 선언하여 쓸 수 있으므로 정적 메소드로 선언할 때 필요하다.
public <T> T genericMethod(T ob) {
...
}
제네릭 와일드카드
자바에서 제네릭 타입의 불확실성을 다루기 위해 사용되는 방법
? 기호를 사용해 표현되며, 제네릭 타입이 특정 범위의 타입을 가질 수 있음을 나타낸다.
- 상한 제한 와일드카드 (? extends T) : T 타입 또는 T의 하위 타입만 허용 > 안전하게 읽기 작업
- 하한 제한 와일드카드 (? super T) : T 타입 또는 T의 상위 타입만 허용 > 안전하게 쓰기 작업
- 비제한 와일드카드 (?) : 어떤 타입도 될 수 있음 > 안전성을 보장 받기 어려움
// 상한 제한 와일드카드 - Number 또는 하위 타입
public void printList(List<? extends Number> list) {
for (Number num : list) {
System.out.println(num);
}
}
// 하한 제한 와일드카드 - Integer 또는 상위 타입
public void addNumbers(List<? super Integer> list) {
list.add(1);
list.add(2);
}
상한 제한 와일드카드 사용 시, 리스트가 정확히 어떤 서브 타입의 객체를 포함하는지 알 수 없기 때문에 리스트에서 객체를 읽기만 가능하고 새로운 객체를 추가할 수는 없다. (컴파일러 입장에서는 이 리스트가 어떤 객체로 이루어져 있는지 알 수 없음)
'Backend > Java' 카테고리의 다른 글
[Java] 컬렉션 프레임워크 Collection Framework (0) | 2024.03.21 |
---|---|
[Java] 람다식 Lambda Expression (0) | 2024.03.19 |
[Java] 접근 제어자 / 기타 제어자 정리 (0) | 2024.03.19 |
[Java] 싱글턴 패턴 Singleton Pattern (0) | 2024.03.19 |