[Java] 제네릭(Generic)

u_yonu·2026년 3월 4일

Java

목록 보기
17/18
post-thumbnail

제네릭(Generic)

제네릭(Generic)의 정의

다양한 데이터 타입을 처리할 수 있는 클래스, 인터페이스, 메서드를 작성하는 기법이다.

제네릭의 장점

  1. 컴파일 시점에 타입을 지정할 수 있어 타입 안정성(type safety) 을 제공함
  2. 하나의 코드로 여러 타입에 대해 동작하도록 설계할 수 있어 코드 재사용성이 증가
  3. 타입이 명확하므로 불필요한 형 변환(casting) 을 줄일 수 있음

제네릭 클래스(Generic Class)

클래스(또는 인터페이스) 정의에 타입 매개변수를 넣는 방식으로 해당 클래스 전체 범위에서 타입을 사용할 수 있다.

java
class Holder<T> {
    private T data;

    public Holder(T data) {
        this.data = data;
    }

    public T get() { return data; }
    public void set(T data) { this.data = data; }
}

  • 제네릭 클래스의 선언

    • 클래스 또는 인터페이스 선언 시 <>에 타입 파라미터를 표시한다.
    • 타입 파라미터는 특별한 의미의 알파벳이라기보다, 임의의 참조형 타입을 의미한다.

    관례적으로 자주 쓰는 이름

    • T: Type
    • E: Element
    • K: Key
    • V: Value
  • 제네릭 클래스의 객체 생성

    • 변수 선언 쪽과 생성자 쪽의 타입은 반드시 일치해야 한다.

      Holder<String> h1 = new Holder<String>("hello");
      System.out.println(h1.get()); // hello
    • 타입이 추론 가능한 경우, 생성자 쪽 타입은 생략할 수 있다. (Java 7+ 다이아몬드 연산자 <>)

      Holder<Integer> h2 = new Holder<>(100);
      System.out.println(h2.get()); // 100
    • 제네릭 타입을 지정하지 않는 raw type으로도 생성할 수 있지만 권장하지 않는다.
      → 타입 안정성이 깨지고, 타입 파라미터 T가 사실상 Object처럼 취급된다.


제네릭 메서드(Generic Method)

제네릭 메서드는 메서드 내부에서 사용할 타입 파라미터를 메서드가 직접 선언하는 방식이다.
즉, 클래스에 제네릭이 있든 없든 상관없이, 특정 메서드만 제네릭하게 만들 수 있다.

  • 타입 파라미터를 사용하는 메서드
  • 클래스의 타입 파라미터와는 별개로, 메서드 레벨에서 제네릭 타입을 정의하고 사용할 수 있음
  • 제네릭 메서드를 정의하려면 반환 타입 앞에 타입 파라미터를 선언한다.
    • 형태: public static <T> T methodName(...)
  • 호출할 때 타입 파라미터는 보통 컴파일러가 추론하므로 생략 가능
  • 필요하면 타입을 명시적으로 지정할 수도 있음
    • 형태: 클래스명.<타입>메서드명(...)
    • 예시
    String s = Utils.<String>first("A", "B");
    Integer n = Utils.<Integer>first(1, 2);

한정된 타입 매개변수(Bounded Type Parameter)

한정된 타입 매개변수는 제네릭을 정의할 때, 아무 타입이나 다 받는 것이 아니라 특정 범위의 타입만 허용하고 싶을 때 사용한다.

  • 제네릭 클래스 / 메서드를 정의할 때 "특정한 종류의 타입만" 받도록 제한할 수 있다.
  • 구체적인 타입 제한이 필요하면 extends 키워드를 사용한다.
    • 여기서 extends는 상속뿐 아니라 인터페이스 제한에도 사용된다.
  • 타입 파라미터에 대한 제한은 상한 경계(extends) 만 가능하다.
    • super(하한 경계)는 와일드카드에서 사용한다.

와일드 카드

  • 제네릭 클래스 인스턴스 변수의 참조 타입을 작성할 때
  • 와일드 카드로서 문자 ?를 사용
  • 불특정 타입을 나타내기 위해 사용하는 특수한 타입 매개변수
  • 제네릭 클래스에 다형성 적용가능
종류 표현 설명
제한없는 와일드 카드 GenericType<?> 타입에 제한이 없음
상한 경계 와일드 카드 GenericType<? extends T> T와 T를 상속받은 타입만 사용 가능
하한 경계 와일드 카드 GenericType<? super T> T와 T의 조상 타입만 사용 가능


제네릭 끝.!

profile
비전공자의 개발도전기

0개의 댓글