Today Yewon Learned

[JAVA] Generic(제네릭) 본문

JAVA

[JAVA] Generic(제네릭)

데브워니 2021. 11. 15. 14:09

제네릭(Generic)

- 데이터 형식에 의존하지 않고, 하나의 값이 여러 다른 데이터 타입들을 가질 수 있도록 하는 방법

- 클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것

- 잘못된 타입이 들어올 수 있는 상황을 컴파일 단계에서 방지 가능

- 코드 재사용성 높아짐

 

제네릭(Generic)의 타입 파라미터

- 가장 흔히 쓰는 이름은 T(Type)과 E(Element)

- 만약 HashMap<K,V>의 경우에는 K(Key)와 V(Value)

- T1, T2, T3처럼 숫자를 붙일 수도 있음

타입 파라미터 의미
<T> Type
<E> Element
<K> Key
<V> Value
<N> Number

 

제네릭(Generic)의 사용

아래 꺽쇠 기호(<>)사이에 있는 T를 '타입 파라미터' 라고 부르며, Box와 같이 타입 파라미터를 받는 클래스를 '제네릭 클래스(Generic Class)라고 함

public class Box<T> {
    private T something;

    public void set(T object) { 
        this.something = object;
    }

    public T get() {
        return something;
    }
}

아래처럼 타입 파라미터로 String을 넘겨주면,

Box<String> box = new Box<>();

클래스에 있던 모든 T가 String으로 대체됨

public class Box<String> {
    private String object;

    public void set(String object) {
        this.object = object;
    }

    public String get() {
        return object;
    }
}

 

제네릭 extends

- 상속의 개념이 합쳐지면 더 다양한 방식으로 제네릭(Generic)을 사용할 수 있음

 

아래 PhoneBox 클래스는 Phone 타입을 받는 Box 클래스를 상속 받음

public class PhoneBox extends Box<Phone> {
    public void handsFreeCall(String numberString) {
        object.call(numberString);
    }
}

extends 키워드를 이용하여 타입 제한 가능

public class PhoneBox<T extends Phone> extends Box<T> {
    public void handsFreeCall(String numberString) {
        object.call(numberString);
    }
}

여기서<T extends Phone>은 T가 Phone의 자식 클래스이어야 한다는 뜻

 

예를 들어서 AndroidPhone이라는 클래스는 Phone을 상속 받기 때문에 PhoneBox<AndroidPhone>은 가능합니다. 하지만 PhoneBox<String>을 쓰면 오류가 발생

 

[참조] : Codeit

Comments