static 메서드와 지네릭 메서드

CJI0524·2024년 7월 23일
0

Java/Class

목록 보기
4/8

1. 지네릭스의 제한

모든 객체에 대해 동일하게 동작해야하는 static 멤버에 타입 변수 T를 사용할 수 없다. 왜냐하면 T는 인스턴스 변수로 간주되기 때문이다.

즉 다음과 같은 코드는 에러가 발생한다.

✍️ 작성

class Box<T> {
	static T item; // 에러 발생
    static int compare(T t1, T t2) {...} // 에러 발생

}

해당 포스팅에서 알아보았듯 static 멤버는 인스턴스와는 독립적으로 클래스 자체에 속하므로 특정 인스턴스에 종속되지 않는다. 반대로 타입 매개변수(T)는 인스턴스화될 때 지정되므로, 클래스 로딩 시점에 정해진 static 멤버와는 개념적으로 맞지 않는다. static 멤버들은 클래스 자체에서 다뤄질 수 있어야 한다.

2. 지네릭 메서드와 static 메서드

하지만 다음 그림과 같이 지네릭 메서드의 경우, static 메서드에서도 지네릭스 사용이 가능하다. 그 이유는 무엇일까?

바로 지네릭 메서드는 메서드 선언 시점에 타입 매개변수를 정의하고, 메서드 호출 시점에 구체적인 타입을 지정하기 때문이다. 이는 인스턴스와 관련이 없기 때문에, static 메서드에서도 제네릭 타입을 사용할 수 있다. 인스턴스를 생성하지 않고 곧바로 클래스 레벨에서 호출이 가능하기 때문에 지네릭스 사용이 가능한 것이다.

예제 코드는 다음과 같다.

✍️ 작성

class Juicer {
 	static <T extends Fruit> Juice  makeJuice(FruitBox<T> box) {
 	String tmp = "";
    for(Fruit f : box.getList()) tmp += f + " ";
    return new Juice(tmp);
 	} 
}


public class Ex1 {

	public static void main(String[] args) {
		FruitBox<Fruit> fruitBox = new FruitBox<Fruit>();
		FruitBox<Apple> appleBox = new FruitBox<Apple>();

		System.out.println(Juicer.<Fruit>makeJuice(fruitBox)); // 클래스 레벨에서 makeJuice 호출
		System.out.println(Juicer.<Apple>makeJuice(appleBox)); // 클래스 레벨에서 makeJuice 호출
	}
}


다음 코드와 같이 Juicer 클래스의 인스턴스 생성없이 makeJuice 메서드에서 지네릭 타입을 바로 대입하여 호출했다. 이와 같이 메서드에 선언된 지네릭 타입은 지역 변수를 선언한 것과 같다고 생각하면 된다.

3. 해당 게시글 작성에 참고한 글 목록

자바의 정석 3판 (남궁성)
[Java] 제네릭 메소드(Generic Method)란?

profile
개발돌이

0개의 댓글