Generic

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);
	}
}

© 2023 Lee. All rights reserved.