[Java] 제네릭

Local Gaji·2023년 9월 1일

이것이 자바다

목록 보기
12/18

🎈 제네릭이란 ?

변수에 대입될 값의 타입을 모를 때, 타입을 파라미터로 받아서 변수를 실제로 사용할 때 타입을 지정하는 기능


🔰 제네릭 타입 정의

public class ClassName <T> {
  public T field;
}

타입이 결정되지 않은 필드 field 의 타입을 T 라는 타입 파라미터로 받는다.

결정되지 않은 타입 ( < 타입 > ) 을 파라미터로 가지는 클래스나 인터페이스를 제네릭 타입이라고 한다.


🔰 파라미터로 타입 전달

ClassName<타입> instance = new ClassName<타입>();

ClassName<Integer> instance1 = new ClassName<>();
instance1.content = 100;

ClassName<String> instance2 = new ClassName<>(); 
instance2.content = "Hello";

instance1.content 의 타입은 int 가 되고, instance2.content 의 타입은 String 이 된다.


  • 타입 파라미터는 일반적으로 대문자 알파벳 한글자로 작성한다.
  • 변수의 타입을 지정할 때 < 타입 > 을 파라미터로 전달했다면, 생성자의 타입은 <> 로 생략이 가능하다.
  • 타입 파라미터에 구체적인 타입을 지정하지 않으면 Object 타입이 자동으로 지정된다.

🎈 예시

public class Desktop <C, M> {
  /* 필드 */
  public C component;
  public M maker;
  
  /* 메서드 */
  public C getComponent() {
    return this.component;
  }
  public M getMaker() {
    return this.maker;
  }
  public void setComponent(C component) {
    this.component = component;
  }
  public void setMaker(M maker) {
    this.maker = maker;    
  }
}

setter 에서 타입을 모르는 필드에 타입이 지정된 값이 대입된다.

/* 사용 */

...

Desktop<CPU, String> pc1 = new Desktop<>();

pc1.setComponent( new CPU() );
pc1.setMaker("Intel");

CPU cpu = pc1.getComponent();      // component 필드의 값 반환
String cpuMaker = pc1.getMaker();  // maker 필드의 값 "Intel" 반환
  1. 객체 pc1 생성 시,
    타입 파라미터 <C> 에는 CPU 라는 객체 타입이 전달되었고
    타입 파라미터 <M> 에는 String 타입이 전달되었다.
  2. setter 메서드를 통해,
    필드 Component 에는 CPU 객체의 인스턴스 가 대입되고,
    필드 Maker 에는 Intel 가 대입되었다.
  3. getter 메서드를 통해 각 필드에 저장된 값을 가져온다.

🎈 제네릭 메서드

public <T> 리턴타입 메서드명(매개변수) {}

🔰 예시

public <T> boolean isInteger(T t) {
  return (t.getClass().getSimpleName() == "Integer");
}

// 제네릭 메서드 호출
boolean result = isInteger(10);

🎈 파라미터 타입 제한

타입 파라미터를 Number 같은 숫자 타입들 또는 Byte, Integer 같은 세부 타입으로 제한할 수 있다.

public <T extends Number> 리턴타입 메서드명(...) { ... }


















0개의 댓글