[Java] 제네릭(Generic) 사용법

Hanjmo·2023년 1월 24일
0

제네릭(Generic)

다양한 타입의 데이터를 다루는 클래스나 메서드에서 사용할 데이터의 타입을 컴파일 시 미리 지정할 수 있게 해주는 기능이다.

사용하는 이유?

한 종류의 객체만을 저장하는 경우에 의도하지 않은 타입의 객체가 저장되는 것을 막고, 저장된 객체를 꺼내올 때 기존의 타입과 다른 타입으로 형변환되어 발생할 수 있는 에러를 사전에 방지할 수 있다.
또한 컴파일 시에 타입을 체크하고 형변환을 생략할 수 있으므로 코드가 간결해진다.

사용법

클래스나 인터페이스 이름 옆에 '<>'를 붙이고, 사이에 타입 변수(type variable)를 넣어준다.

public class 클래스명<타입 변수> {...}
public interface 인터페이스명<타입 변수> {...}

타입 변수의 종류

타입 변수설명
<T>Type
<E>Element
<K>Key
<N>Number
<V>Value
<R>Result

제네릭 클래스

public class Card<T> {
	private T pattern;
    
	public void setPattern(T pattern) {
    	this.pattern = pattern
    }
    
    public T getPattern() {
    	return pattern;
    }
}

클래스를 설계할 때 구체적인 타입을 명시하지 않고 타입 변수로 넣어 놓는다.
그러다가 설계한 클래스가 사용되어질 때 다음과 같이 구체적인 타입을 지정하면 형변환을 최소화할 수 있다.

Card card<String> = new Card<String>();

인스턴스를 생성할 때 <String>을 붙여주면 클래스를 설계할 때 작성했던 T타입들이 String타입으로 취급되어 실행된다.

제네릭 멀티 타입

public class ExMultiType<K, V> implements Map.Entry<K, V> {
	private K key;
    private V value;
    
	public void setValue(V value) {
    	this.value = value;
    }
    
    public K getKey() {
    	return this.key;
    }

    public V getValue() {
    	return this.value;
    }
}

HashMap처럼 데이터를 키(key)와 값(value)의 형태로 저장하는 컬렉션 클래스는 지정해줘야 할 타입이 두 개다. 따라서 <K, V>와 같이 두 개의 타입을 콤마','로 구분해서 적어준다.

제네릭 메서드

public <T> T ExMethod(T param) {
	...
}

제네릭 메서드임을 알리기 위해서 리턴 타입 앞에 제네릭 메서드임을 명시해야 한다.
클래스의 타입 변수와 메서드의 타입 변수는 관련이 없다.

0개의 댓글