제네릭 메소드(Generic Method)

수정이·2022년 4월 13일
0

JAVA

목록 보기
6/8
post-thumbnail

제네릭 메소드


  • 자료형 매개변수를 메소드의 매개변수나 반환 값으로 가지는 메소드이다.
  • 자료형 매개 변수가 하나 이상인 경우도 있다.
  • 제네릭 클래스가 아니어도 내부에 제네릭 메소드를 구현하여 사용할 수 있다.
public class ThreeDPrinter {

    public <T> Product makeObject(T material) {

        return new Product(material);
    }
}

static


  • 제네릭 클래스는 static 변수와 static 메소드를 가질 수 없다.
    그 이유는 ThreeDPrinter 클래스의 인스턴스가 생성되기 전에 static이 붙은 변수나 메소드는 메모리의 Data 영역에 올라가는데 변수나 메소드의 T 자료형이 결정되지 않았기 때문에 가질 수 없다.
public class ThreeDPrinter<T> {
	static T printerName; // 에러가 발생
    
    public static T setPrinterName(T name) { // 에러가 발생
    	this.printerName = name
    }
}
  • 하지만, 제네릭 메소드는 static이 가능하다.
    제네릭 메소드는 호출 시 매개 타입을 지정하기 때문에 static이 가능하다.
public class ThreeDPrinter<T> {
   
    public static <T> T setPrinterName(T name) {
    	this.printerName = name
    }
}

기억하자

  • 위와 같이 클래스에도 <T>가 붙어있고, 메소드에도 <T>가 붙어있다. 같은 타입 변수가 붙어있어 같다고 생각하지만, 둘은 완전 별개다.
  • 클래스에 표시하는 <T>는 전역 변수처럼 사용되지만, 메소드에 표시하는 <T>는 지역 변수처럼 메소드 안에서만 사용할 수 있다.

정리


public class ThreeDPrinter<T> {
    
    // 1번
    public T getName() {return name;}
    // 2번
    public <T> T setName(T name) {this.name = name;}
    // 3번
    public <S> T setMaterial(S material) {this.material = material;}
    // 4번
    public static <S> T getMaterial() {return material;}
}
  • 1번 : 클래스의 제네릭 타입 T를 그대로 사용한다.
  • 2번 : 클래스의 T와 2번 메소드의 T는 다르다.
  • 3번 : static 메소드가 아닌 일반 메소드기 때문에 클래스의 T와 3번 메소드의 S를 같이 사용할 수 있다.
  • 4번 : static 메소드기 때문에 클래스의 T와 같이 사용할 수 없어 에러가 발생한다.

참고


0개의 댓글