제네릭(Generic) / T extends 클래스 / 제네릭 메소드
06 Oct 2021 -
1 minute read
제네릭(Generic)
-
클래스에서 사용하는 변수의 자료형은 여러개이고 그 기능(메서드)는 동일한 경우 클래스의 자료형을 특정하지 않고 추후 해당 클래스를 사용할 때 지정할 수 있도록 선언
-
실제 사용되는 자료형의 변환은 컴파일러에 의해 검증 > 안정적인 프로그래밍 방식
-
컬렉션 프레임워크에서 많이 사용
제네릭을 사용하지 않은 경우 예제
-
ThreeDPrinterPowder.java
public class ThreeDPrinterPowder { private Powder material; public Powder getMaterial() { return material; } public void setMaterial(Powder material) { this.material = material; } }
-
ThreeDPrinterPlastic.java
public class ThreeDPrinterPlastic { private Plastic material; // 변수에 대한 자료형 여러개 public Plastic getMaterial() { return material; } public void setMaterial(Plastic material) { this.material = material; } }
-
ThreeDPrinterObject.java (여러 타입을 대체하기 위해 Object 사용)
public class ThreeDPrinterObject { private Object material; public Object getMaterial() { return material; } public void setMaterial(Object material) { this.material = material; } }
-
(Main Class) ThreeDPrinterTest.java
public class ThreeDPrinterTest { public static void main(String[] args) { Powder powder = new Powder(); ThreeDPrinterObject printer = new ThreeDPrinterObject(); printer.setMaterial(powder); Powder p = (Powder)printer.getMaterial(); // 반환값은 Object 자료형으로 인식되기 때문에 에러 발생 // > 형변환 해야 함 } }
제네릭 사용 예제
-
GenericPrinter.java
public class GenericPrinter<T> { private T material; public T getMaterial() { return material; } public void setMaterialT(T material) { this.material = material; } public String toString() { return material.toString(); } }
-
T : Type Parameter, 이 클래스를 사용하는 시점에 실제 사용하는 자료형을 지정
-
E : element, K : key, V : value, …
-
-
(Main Class) GenericPrinterTest.java
public class GenericPrinterTest { public static void main(String[] args) { Powder powder = new Powder(); GenericPrinter<Powder> powderPrinter = new GenericPrinter<>(); // T 대신 어떤 자료형을 쓸건지 지정 powderPrinter.setMaterialT(powder); Powder p = powderPrinter.getMaterial(); System.out.println(powderPrinter.toString()); } } // 출력결과 // 재료는 Powder 입니다.
<T extends 클래스>
-
T 자료형의 범위 제한 가능
-
ex) public abstract class ClassName { public abstract void test(); }
-
T에 무작위 클래스가 들어갈 수 없게 상위 클래스(ClassName.java)를 상속받은 클래스로 한정
-
상위클래스에서 선언하거나 정의하는 메서드 활용 가능
-
상속을 받지 않는 경우 T는 Object로 변환, Object클래스가 기본으로 제공하는 메서드만 사용 가능
-
제네릭 메소드
-
자료형 매개변수를 메서드의 매개변수나 반환값으로 가지는 메서드
-
자료형 매개변수가 하나 이상일 수 있음
-
제네릭 클래스가 아닌 경우에도 내부에 제네릭 메서드 구현하여 사용 가능
-
기본형태 :
public <자료형 매개 변수> 반환타입 메서드명(자료형 매개변수 ...){}