티스토리 뷰

13.1 제네릭이란?

  • 결정되지 않은 타입을 파라미터로 처리하고 실제 사용할 때 파라미터를 구제적인 타입으로 대체시키는 기능
  • 타입 파라미터는 클래스 및 인터페이스만 가능 -> int가 아니라 Integer를 사용하는 이유
public class BoxDemo {
    public static void main(String[] args) {
        // 실제로 사용할 때 어떤 타입으로 사용할지 지정
        Box<String> boxString = new Box<>();
        boxString.content = "문자열";
        
        //동일한 타입으로 호출할 경우에는 생성자 호출 시 타입 생략 가능
        Box<Integer> boxInt = new Box<>();
        boxInt.content = 100;
    }
}

// 클래스 선언시에는 어떤 타입을 사용할지 정하지 않는다
class Box<T> {
    public T content;
}

 

 

13.2 제네릭 타입

  • 타입 파라미터는 일반적으로 대문자 알파벳 한 글자로 표현
  • 외부에서 제네릭 타입을 사용하려면 타입 파라미터에 구체적인 타입을 지정해야 한다.
  • 지정하지 않으면 Object타입이 암묵적으로 사용됨 ->  Object가 가지고 있는 메소드 사용 가능

 

13.3 제네릭 메소드

  • 타입 파라미터를 가지고 있는 메소드
  • 리턴 타입 앞에 < > 기호를 구하아여 정의한 뒤, 리턴 타입과 매개변수 타입으로 사용 가능
public <T..> 리턴타입 메소드명(매개변수..)  { }

 

 

13.4 제한된 타입 파라미터

  • 타입 파라미터를 대체하는 구체적인 타입을 제한할 필요가 있음
  • 특정 타입과 자식 또는 구현 관계에 있는 타입만 대체할 수 있는 타입 파라미터를 제한된 타입 파라미터 라고 함
  • 클래스 뿐만 아니라 인터페이스도 가능 -> implements를 사용하지 않음
public <T extends 상위 타입> 리턴 타입 메소드명(매개변수...) { }

 

 

13.5 와일드카드 타입 파라미터

  • 어떤 타입이든 가능
리턴타입 메소드명(제네릭타입<?> 변수) { }
void register(List<?> list) { }

 

  • 하위 타입만 가능
리턴타입 메소드명(제네릭타입<? extends ~ > 변수) { }
void register(List<? extends Number> list) { }

//Number 의 하위 타입만 가능

 

  • 본인 혹은 상위 타입만 가능
리턴타입 메소드명(제네릭타입<? super ~ > 변수) { }
void register(List<? super Integer> list) { }

// Integer 혹은 상위 타입만 가능

 

최근에 올라온 글