Generic
in Java on Java
Generic
사전적 정의
데이터 형식에 의존하지 않고, 하나의 값이 여러 다른 데이터 타입들을 가질 수 있도록 하는 방법
JDK 1.5부터 도입
특징
- 제네릭을 사용하면 잘못된 타입이 들어올 수 있는 것을 컴파일 단계에서 방지할 수 있다.
- 클래스 외부에서 타입을 지정해주기 때문에 따로 타입을 체크하고 변환해줄 필요가 없다.
- 비슷한 기능을 지원하는 경우 코드의 재사용성이 높아진다.
- 참조 타입(Wrapper Class)만 사용이 가능하다.
암묵적 규칙
타입 | 설명 |
---|---|
<T> | Type |
<E> | Element |
<K> | Key |
<V> | Value |
<N> | Number |
기본 사용 방법
import java.util.*;
public class Main<K,V>{
K key;
V value;
public Main(K k, V v){
this.key = k;
this.value = v;
}
public void testFunc(){
System.out.println(this.key);
System.out.println(this.value);
}
public static void main(String[] args){
Main m = new Main(10,"test");
m.testFunc();
}
}
컴파일 에러 및 런타임 에러 TEST
import java.util.*;
public class Main<K,V>{
K key;
V value;
public Main(K k, V v){
this.key = k;
this.value = v;
}
public void testFunc(){
System.out.println(this.key);
System.out.println(this.value);
}
public static void main(String[] args){
Main m = new Main(10,"test");
m.testFunc();
// testFunc2() //런타임 에러 발생
}
public void testFunc2(){
ArrayList list = new ArrayList();
list.add(0);
list.add(20);
list.add("30"); //문자열 넣기
Integer i = (Integer)list.get(2); //컴파일은 OK, get()은 Object 타입 객체를 반환
System.out.println(list); //ClassCastException 런타임 에러 발생
}
public void testFunc3(){
ArrayList<Main> list = new ArrayList<>();
list.add(new Main("test",123));
list.add(new Audio("test")); // 컴파일 에러
}
}
class Audio{
String text;
public Audio(String text){
this.text = text;
}
}
코드의 재사용성 예시
import java.util.*;
class Audio{
String name, desc;
public Audio(String name, String desc){
this.name = name;
this.desc = desc;
}
}
class Tv{
String name,desc;
public Tv(String name, String desc){
this.name = name;
this.desc = desc;
}
}
class Shop<T>{
T info;
public Shop(T info){
this.info = info;
}
}
// **********************************************
class AdShop{
Audio info;
public AdShop(Audio info){
this.info = info;
}
}
class TvShop{
Tv info;
public TvShop(Tv info){
this.info = info;
}
}
// **********************************************
public class Main{
public static void main(String[] args){
Tv tv = new Tv("LG TV","FULL HD");
Shop<Tv> tvShop = new Shop<>(tv);
System.out.println("name : " + tvShop.info.name + ", desc : " + tvShop.info.desc);
Audio ad = new Audio("Lotte","2.1 System");
Shop<Audio> adShop = new Shop<>(ad);
System.out.println("name : " + adShop.info.name + ", desc : " + adShop.info.desc);
}
}