Notice
Recent Posts
Recent Comments
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Archives
Today
Total
관리 메뉴

SYDev

[이것이 자바다] Chapter 13. 제네릭 본문

Programming Lang/Java

[이것이 자바다] Chapter 13. 제네릭

시데브 2025. 1. 31. 18:12

1. 제네릭이란?

  • 제네릭(Generic): 결정되지 않은 타입을 파라미터로 처리하고, 실제 사용할 때 파라미터를 구체적인 타입으로 대체시키는 기능
  • 기본 타입은 타입 파라미터의 대체 타입이 될 수 없음 -> int(X), Integer(O)
public class Box <T> {
    public T content;
}
Box<String> box = new<String>();
box.content = "안녕하세요.";
String content = box.content;	// 강제 타입 변환 없이, "안녕하세요"를 바로 얻을 수 있음

 

2. 제네릭 타입

  • 제네릭 타입: 결정되지 않은 타입을 파라미터로 가지는 클래스와 인터페이스
  • 선언부에 '< >'가 붙고, 그 사이에 타입 파라미터들이 위치
public class 클래스명<A, B, ...> { ... }
public interface 인터페이스명<A, B, ...> { ... }

 

  • 외부에서 제네릭 타입을 사용할려면 타입 파라미터에 구체적 타입을 지정해야 함, 지정하지 않으면 Object 타입 암묵적 사용
public class Product<K, M> {
    // field
    private K kind;
    private M model;
    
    // method
    public K getKind() { return this kind; }
    public M getModel() { return this.model; }
    public void setKind(K kind) { this.kind = kind; }
    public void setModel(M model) { this.model = midel; }
}

 

3. 제네릭 메소드

  • 제네릭 메소드: 타입 파라미터를 가지고 있는 메소드
  • 타입 파라미터가 메소드 선언부에 정의된다는 점에서 제네릭 타입과 차이 존재
public <A, B, ...> 리턴타입 메소드명(매개변수, ...) { ... }

 

4. 제한된 타입 파라미터

  • Bounded type parameter: 타입 파라미터를 대체하는 구체적인 타입을 제한
  • ex) 숫자를 연산하는 제네릭 메소드는 Number 또는 자식 클래스(Byte, Short, Integer, Long, Double)로 제한할 필요가 있음
public <T extends 상위타입> 리턴타입 메소드(매개변수, ...) { ... }
public <T extends Number> boolean compare(T t1, T t2) {
    double v1 = t1.doubleValue();	// Number의 doubleValue() 메소드 사용
    double v2 = t2.doubleValue();	// Number의 doubleValue() 메소드 사용
    return (v1 == v2);
}

 

5. 와일드카드 타입 파라미터

리턴타입 메소드명(제네릭타입<? extends Student> 변수) { ... }
리턴타입 메소드명(제네릭타입<? super Worker> 변수) { ... }
리턴타입 메소드명(제네릭타입<?> 변수) { ... }

 

  • Student와 자식 클래만 가능하도록 선언
  • Worker와 부모 클래스만 가능하도록 선언
  • 어떤 타입이든 가능하도록 선언

참고자료