[Java] 제네릭 ②

kiteB·2022년 2월 13일
0

Java2

목록 보기
4/36
post-thumbnail

[ 멀티 타입 파라미터 (class<K, V, ...>, interface<K, V, ...>) ]

제네릭 타입은 두 개 이상의 멀티 타입 파라미터를 사용할 수 있는데, 이 경우 각 타입 파라미터를 ,로 구분한다.

Product<T, M> 제네릭 타입을 정의하고 ProduceExample 클래스에서 Product<Tv, String> 객체와 Product<Car, String> 객체를 생성한 뒤, GetterSetter를 호출해보자!

  • Product (제네릭 클래스)
public class Product<T, M> {
    private T kind;
    private M model;
    
    public T getKind() { return this.kind; }
    public M getModel() { return this.model; }
    
    public void setKind(T kind) { this.kind = kind; }
    public void setModel(M model) { this.model = model; }
}
  • ProductExample (제네릭 객체 생성)
public class ProductExample {
    public static void main(String[] args) {
        Product<Tv, String> product1 = new Product<Tv, String>();
        product1.setKind(new Tv());
        product1.setModel("스마트Tv");
        Tv tv = product1.getKind();
        String tvModel = product1.getModel();
        
        Product<Car, String> product2 = new Product<Car, String>();
        product2.setKind(new Car());
        product2.setModel("디젤");
        Car car = product2.getKind();
        String carModel = product2.getModel();
    }
}

제네릭 타입 변수 선언과 객체 생성을 동시에 할 때 타입 파라미터 자리에 구체적인 타입을 지정하는 코드가 중복해서 나와 다소 복잡해질 수 있다. 자바 7부터 제네릭 타입 파라미터의 중복 기술을 줄이기 위해 다이아몬드 연산자 <>를 제공한다.

자바 컴파일러는 타입 파라미터 부분에 <> 연산자를 사용하면 타입 파라미터를 유추해서 자동으로 설정해준다.

예를 들어 다음은 자바 6 이전 버전에서 사용한 제네릭 타입 변수 선언과 객체 생성 코드이다.

Product<Tv, String> product = new Product<Tv, String>();

자바 7부터는 다이아몬드 연산자 <>를 사용해서 다음과 같이 간단하게 작성할 수 있다.

Product<Tv, String> product = new Product<>();

[ 제네릭 메소드 (<T, R> R method(T t)]

제네릭 메소드는 매개 타입과 리턴 타입으로 타입 파라미터를 갖는 메소드를 말한다.

제네릭 메소드를 선언하는 방법은

  • 리턴 타입 앞에 <> 기호를 추가하고 타입 파라미터를 기술한 다음,
  • 리턴 타입과 매개 타입으로 타입 파라미터를 사용하면 된다.
public <타입파라미터, ...> 리턴타입 메소드명(매개변수, ...) { ... }

다음 boxing() 제네릭 메소드는 <> 기호 안에 타입 파라미터 T를 기술한 뒤, 매개 변수 타입으로 T를 사용했고, 리턴 타입으로 제네릭 타입 Box<T>를 사용했다.

public <T> Box<T> boxing(T t) { ... } 

제네릭 메소드는 두 가지 방식으로 호출할 수 있다.

  • 코드에서 타입 파라미터의 구체적인 타입을 명시적으로 지정해도 되고,
  • 컴파일러가 매개값의 타입을 보고 구체적인 타입을 추정하도록 할 수도 있다.
리턴타입 변수 = <구체적타입> 메소드명(매개값);	//명시적으로 구체적 타입을 지정
리턴타입 변수 = 메소드명(매개값);	//매개값을 보고 구체적 타입을 추정

다음 코드는 boxing() 메소드를 호출하는 코드이다.

Box<Integer> box = <Integer>boxing(100);	//타입 파라미터를 명시적으로 Integer로 지정
Box<Integer> box = boxing(100);	//타입 파라미터를 Integer로 추정

[ 참고자료 ]

이것이 자바다 책

profile
🚧 https://coji.tistory.com/ 🏠

0개의 댓글