관리 메뉴

HeeJ's

[04] Generic :: Java 본문

<Programming>/<JAVA>

[04] Generic :: Java

meow00 2020. 6. 24. 16:01

모든 객체를 담을 수 있는 Object 타입의 컬렉션은 실행하기 전, 클래스에 어떤 객체를 담았는지 알 수 없는 문제점이 나타남.

 

제네릭(Generic)

: 하나의 코드를 다양한 타입의 객체에 재사용하는 객체 지향 기법

  클래스, 인터페이스, 메서드를 정의할 때는 타입을 변수로 사용.

**클래스를 선언하여 객체를 생성할 때, 구체적인 타입을 기재한다.

  장점) 컴파일 시, 타입을 점검하기 때문에 실행 도중 발생할 오류 사전 방지

 

 

제네릭 클래스의 선언

class 클래스이름<타입매개변수> {
    필드;
    매서드;
 }

 

* 타입 매개 변수

E - 원소(Element)

K - 키(Key)
N - 숫자(Number)

T - 타입(Type)

V - 값(Value)

 

 

ex.

public class c1<T> {
    private T data;
    
    public void setdata(T data){
		this.data = data;
    }
    
    public T getdata(){
    	return data;
    }
}

위의 클래스를 선언할 때, 구체적인 타입을 기재한다.

c1<Integer> intClass = new c1<>(); //Integer 타입만 저장
c2<String> strClass = new c1<>(); //String 타입만 저장

* 타입 매개변수로 기초 타입을 사용할 수 없다.

   Wrapper 클래스 사용해야함.

   (int -> X, Integer -> O)

 

 

Raw 타입

: 타입 매개변수가 없는 제네릭 클래스 (-> Object 타입이 적용된다.)

  이전 버전과 호환성을 유지하기 위해 지원

Box<String> b1 = new Box()<>; //제네릭
Box b2 = new Box(); //Raw 타입. <>로 명시하지 않으면 Object와 똑같아진다. 

  Raw 타입의 객체는 어떤 타입의 객체든 추가할 수 있다.

  반환 시, 어떤 타입이 반환되는지 알 수 없으므로 타입 변환이 필요하다.

 

 

다중 타입 매개변수

정의.

public class Entry<K, V> {
	
    private K key;
    pricate V value;
    
    public Entry(K key, V value) {
		this.key = key;
        this.value = value;
    }
    
    public K getKey() {
    	return key;
    }
    
    public V getValue(){
        return value;
    }
}

선언.

public class EntryClass {
	public static void main(String[] args) {
    	Entry<String, Integer> e1 = new Entry<>("김철수", 20);
        Entry<String, String> e2 = new Entry<>("일석", "이조");
        
    }
}