Java 제네릭(Generic)이란?

HEETAE HEO·2022년 6월 20일
1
post-thumbnail

제네릭이란?

데이터의 타입을 클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것을 의미합니다.

우리는 흔히 ArrayList, LinckedList등을 생성할 때
객체<타입>객체명 = new 객체<타입>();
다음과 같이 선언하여 사용합니다.

제네릭같은 경우는 하나하나의 타입에 따라 클래스를 생성하는 것이 비효율적일때 사용하는 것입니다.

제네릭의 장점

  1. 제네릭을 사용하면 잘못된 타입을 들어올 수 있는 것을 컴파일 단계에서 방지할 수 있다.

  2. 클래스 외부에서 타입을 지정해주기 때문에 따로 타입을 체크하고 변환해줄 필요가 없다. 즉, 관리하기가 편하다.

  3. 비슷한 기능을 지원하는 경우 코드의 재사용성이 높아진다.

제네릭 사용법

제네릭 타입은 타입을 파라미터로 가지는 클래스와 인터페이슬를 말합니다. 제네릭 타입은 클래스 또는 인터페이스 이름 뒤에 <> 부호가 붙고 사이에 타입 파라미터가 위치합니다.

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

타입 파라미터는 정해진 규칙은 없지만 일반적으로 대문자 알파벳 한글자로 표현합니다.

예시 코드

class ExClassGeneric<T> { 
	private T t;
    
    public void setT(T t){
    	this.t = t;
     }
    
    public T getT() {
    	return t;
    }
}

위와 같이 클래스를 설계할 때 구체적인 타입을 명시하지 않고 타입 파라미터로 넣어두었다가 실제 설계한 클래스가 사용되어질 때 ExClassGeneric<String> exGeneric = new ExClassGeneric<>(); 이런식으로 구체적인 타입을 지정하면서 사용하면 타입 변환을 최소화 시킬 수 있습니다.

제한된 제네릭과 와일드 카드

위의 코드에서는 제네릭의 가장 일반적인 예시들을 보여주었습니다. 예를 들어 타입을 T라고 하고 외부 클래스에서 Integer을 파라미터로 보내면 T는 Integer가 되고, String을 보내면 T는 String이 된다. 만약 당신이 Student라는 클래스를 만들었을 때 T 파라미터를 Student로 보내면 T는 Student가 된다. 즉, 제네릭은 참조 타입 모두 될 수 있습니다.

이때 사용하는 것이 바로 extneds와 super 그리고 ? 입니다.

<K extends T> // T와 T의 자손 타입만 가능(K는 들어오는 타입으로 지정 됨)

<K super T> // T와 T의 부모(조상) 타입만 가능(K는 들어오는 타입으로 지정됨)

<? extends T> // T와 T의 자손 타입만 가능
<? super T> // T와 T의 부모 타입만 가능
<?> // 모든 타입 가능. <? extends Object>랑 같은 의미

extends T : 상한 경계
? super T : 하한 경계

<?> : 와일드 카드 (Wild card)

public class Calcu { 
	public void printList(List<?> list) { 
    	for(Object obj : list) { 
        	system.out.println(obj + " ");
        }
    }
    
    public int sum(List<? extends Number> list){
    	int sum =0;
        for(Number i : list) { 
        	sum += i.doubleValue();
        }
        return sum;
    }
    
    public List<? super Integer> addList(List<? super Integer> list) {
    for(int i= 1; i<5; i++) {
    	list.add(i);
    }
    
    return list;
   	}
}

와일드카드 타입에는 총 3가지의 형태가 있으며 물음표(?)라는 키워드로 표현됩니다.

제네릭타입<?> : 타입 파라미터를 대치하는 것으로 모든 클래스나 인터페이스타입이 올 수 있습니다.

제네릭타입<? extends 상위타입> : 와일드카드의 범위를 특정 객체의 하위 클래스만 올 수 있습니다.

제네릭타입<? super 하위타입> : 와일드카드의 범위를 특정 객체의 상위 클래스만 올 수 있습니다.

profile
Android 개발 잘하고 싶어요!!!

0개의 댓글