728x90
1. 제네릭(Generic)
자바에서 제네릭(generic)이란 데이터의 타입을 일반화한다는 것을 의미한다.
제네릭은 클래스나 메소드에서 사용할 내부 데이터 타입을 컴파일 시 미리 지정하는 방법이다.
타입이 클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것이며, 특정 타입을 미리 지정해주는 것이 아닌 필요에 의해 지정할 수 있도록 하는 타입이다.
미리 타입 검사 시 장점
- 클래스나 메소드 내부에서 사용되는 객체의 타입 안정성을 높일 수 있다.
- 타입체크와 형변환을 생략하므로 코드가 간결하다.
1-1. Generic 선언 및 생성
class MyArray<T> {
T element;
void setElement(T element) { this.element = element; }
T getElement() { return element; }
}
// 클래스 선언
public class ClassName <T> { ... }
// 인터페이스 선언
public interface InterfaceName <T> { ... }
// 제네릭 클래스 생성
MyArray<Integer> myArr = new MyArray<Integer>();
// Java SE 7부터 가능한 인스턴스 생성시 타입 추정
MyArray<Integer> myArr = new MyArray<Integer>();
- 타입 파라미터(<>) 안에는 T가 아닌 다른 문자 사용 가능하며, 여러개의 타입 변수는 쉼표(,)로 구분하여 명시한다.
- 타입 변수는 클래스 및 메소드의 매개변수나 반환값으로도 사용 가능하다.
- 제네릭 클래스 생성시 타입 변수 자리에 사용할 실제 타입을 명시한다.
1-2. Generic Type
타입 | 설명 |
<T> | Type |
<E> | Element |
<K> | Key |
<V> | Value |
<N> | Number |
<R> | Return, Result |
- 제네릭 타입이란 결정되지 않은 타입을 파라미터로 가지는 클래스와 인터페이스를 의미한다.
2. Generic Method
public <타입 파라미터> 리턴타입 메소드명(매개변수, ...) { ... }
public static <T> void sort(...) {...}
- 제네릭 메소드란 메소드의 선언부에 타입 변수(generic)를 사용한 메소드를 의미한다.
- 타입 변수의 선언은 메소드 선언부 반환 타입 바로 앞에 위치한다.
- 제네릭 클래스에 정의된 타입 매개변수와 제네릭 메소드에 정의된 타입 매개변수는 완전 별개이다.
예제 코드
더보기
public class Box<T> {
private T t; // field
// Getter method
public T get() {
return t;
}
// Setter method
public void set(T t) {
this.t = t;
}
}
package ch13.sec03.exam01;
public class GenericExample {
// Generic Method에 Type Parameter로 T 정의
public static <T> Box<T> boxing(T t) {
Box<T> box = new Box<T>();
box.set(t);
return box;
}
public static void main(String[] args) {
// T를 Integer로 대체
Box<Integer> box1 = boxing(100);
System.out.println("box1.get() = " + box1.get());
// T를 String으로 대체
Box<String> box2 = boxing("집 언제 가");
System.out.println("box2.get() = " + box2.get());
}
}
3. 제한된 타입 파라미터(Bounded Type Parameter)
public <T extends 상위타입> 리턴타입 메소드(매개변수, ...) { ... }
class 클래스명<T extends 인터페이스명> { ... }
class 클래스명<T extends 클래스명&인터페이스명> { ... }
- 모든 타입으로 대체할 수 없고, 특정 타입과 자식 또는 구현 관계에 있는 타입만 대체할 수 있는 타입 파라미터이다.
- extends 키워드를 사용하여 타입 변수에 특정 타입만을 사용하도록 제한한다.
- 제한을 걸어두면 클래스 내부에서 사용된 모든 타입 변수에 제한이 걸린다.
- 인터페이스를 구현해도 extends 키워드를 사용한다.
- 클래스와 인터페이스를 동시 상속받고 구현한다면 & 기호를 사용한다.
4. 와일드 카드(Wild Card)
// 타입에 제한 없음
리턴타입 메소드명(제네릭타입<?> 변수) { ... }
리턴타입 메소드명(제네릭타입<? extends Object> 변수) { ... }
// T와 그 자손들만 가능
리턴타입 메소드명(제네릭타입<? extends T> 변수) { ... }
// T와 그 조상들만 가능
리턴타입 메소드명(제네릭타입<? super T> 변수) { ... }
- 제네릭 타입을 매개값이나 리턴 타입으로 사용할 때 타입 파라미터로 ?(와일드카드)를 사용할 수 있다.
- ?는 범위에 있는 모든 타입으로 대체할 수 있다는 의미다.
public static void registerCourse1(Applicant<?> applicant) {...}
public static void registerCourse1(Applicant<? extends Student> applicant) {...}
public static void registerCourse1(Applicant<? super Worker> applicant) {...}
- 모든 타입 가능
- Student 포함 하위만 가능
- Worker 포함 상위만 가능
참고 링크
728x90
'IT > Java' 카테고리의 다른 글
[Java] List Collection (0) | 2024.03.26 |
---|---|
[Java] Collection Framework (0) | 2024.03.21 |
[Java] 정규 표현식(Regular Expression) (0) | 2024.03.18 |
[Java] 포장 클래스(Wrapper Class) (1) | 2024.03.18 |
[Java] java.base 모듈 (1) | 2024.03.15 |