반응형
generic 영어 뜻과 마찬가지로 "포괄적인"이라는 의미를 지닌다.
이걸 데이터 타입에 대입한다면? 포괄적인 타입 = 모든 타입이 될 수 있는 타입이다.
JDK(Java Development Kit)에 포함된기능으로 대충 위 문장을 알면 다 끝났다고 생각합니다.
인생은 실전이니 바로 예제를 보겠습니다, 다음은 제네릭을 이용한 클래스이다.
// 제네릭은 아래처럼 클래스에서 자료형을 매개변수화 할 수 있다, 뿐만 아니라 인터페이스도 가능
class Data <T>{
private T t;
public void set(T t) {
this.t = t;
}
public Object get(){
return t;
}
}
public class Main {
public static void main(String args[]){
// 아래 처럼 제네릭 타입을 String 로 가능
Data <String> data = new Data();
String s = new String("hello world");
data.set(s);
System.out.println(data.get());
// 아래 처럼 제네릭 타입을 int 로도 가능
Data <Integer> data2 = new Data();
Integer i = new Integer(777);
data2.set(i);
System.out.println(data2.get());
}
}
결과 값은
hello world
777
이런 방식으로 클래스의 타입 지정을 객체 선언에서 하는 것으로 미룰 수 있습니다.
그리고 <>로 표기하는 것을 다이아몬드 표기법이라고 합니다.
// 제네릭을 두개 받을 수 있으며, 인터페이스에서는 아래와 같이 사용
interface Base <K,V>{
public K getKey();
public V getValue();
};
class Heir <K,V> implements Base <K,V>{
private K Key;
private V Value;
// 제네릭 타입을 매개변수로 생성자를 받을 수 있음
public Heir(K Key, V Value){
this.Key = Key;
this.Value =Value;
}
public K getKey() {return Key;}
public V getValue() {return Value;}
}
public class Main {
public static void main(String args[]){
// 생성자는 아래와 같이 다이아몬드 표기법이 같이 들어감.
Heir <String, Integer> heir = new Heir<>("Hello World", 777);
System.out.println(heir.getKey()+" "+heir.getValue());
}
}
이러면 결과 값은
Hello World 777
이렇게 사용하면 됩니다, 참 쉽죠?
주의사항
- 클래스형(Integet)이 아닌 기본 자료형(int)는 사용할 수 없음
- 제네릭 매개변수 타입으로 사용은 가능하나 이를 통해 객체를 만들 수 없음
- 제네릭 매개변수 타입으로 static 필드도 정의 불가능
- 제네릭 매개변수 타입으로 배열 선언도 불가능
반응형
'Java' 카테고리의 다른 글
[Java] Java 면접 질문 정리 (0) | 2024.02.25 |
---|