[JAVA] 광범위한 타입을 제공하는 제네릭(Generic)과 와일드카드(WildCard) 정리

2026. 2. 1. 23:46·Java & Kotlin

들어가며

제네릭(T)은 대충 아무 타입이나 올 수 있는 정도로 알고 써왔었는데, 자세히 공부해보니 생각보다 더 깊고 좋은 기능이었다. 이 기회에 새로 배운 와일드카드까지 같이 정리해보려고 한다.

본론으로 들어가기 전에 스스로 타입 정보를 추론해서 개발자가 타입 정보를 생략할 수 있는 것을 타입 추론 이라고 하는 것을 알고가자.

GenericBox<Integer> integerBox = new GenericBox<Integer>() // 타입 직접 입력
GenericBox<Integer> integerBox2 = new GenericBox<>() // 타입 추론

본론으로

🧐 제네릭이 뭘까?

자바에서는 여러 타입이 오게 할 수 있는 기능으로 <T> 형식으로 제공한다. 이게 바로 제네릭 문법이다. 와닿지 않을 수 있으니 코드를 바로보자!

public class AnimalHospitalV3<T extends Animal> {
	
	private T animal;
	
	public void set(T animal) {
		this.animal = animal;
	}
	
	public void checkup() {
		System.out.println("동물 이름: " + animal.getName());
		System.out.println("동물 크기: " + animal.getSize());
		animal.sound();
	}
	
	public T getBigger(T target) {
		return animal.getSize() > target.getSize() ? animal : target;
	}
}

<T>로 모든 타입이 올 수 있겠지만, 자바의 가장 상위 부모 객체인 Object가 올 수도 있고 원하지 않는 타입이 올 수도 있다. 그래서 위 코드에서는 extends Animal, 즉 원하는 부모를 상속하여 타입의 제한을 두었다. 이렇게 체크예외인 컴파일 오류로 실수를 방지하자.


🤩  제네릭의 타입제한을 이용하여 알맞는 메서드를 실행하게끔 유도할 수 있다.

아래 코드를 보자. 메서드에도 제네릭별로 다르게 하여 오버로딩 할 수 있다. 제네릭 메서드 타입 추론도 가능하여 굳이 지정해서 넘기는 것이 아니라, 매개변수에 따른 타입추론으로 알맞는 메서드를 찾아 실행한다. 다양한 타입이 들어올 확률이 있을 때 유용할 것 같다.

public class GenericMethod {

	public static Object objMethod(Object obj) {
		System.out.println("object print: " + obj);
		return obj;
	}
	
	public static <T> T genericMethod(T t) {
		System.out.println("generic print: " + t);
		return t;
	}
	
	public static <T extends Number> T numberMethod(T t) {
		System.out.println("bound print: " + t);
		return t;
	}
}



public class MethodMain1 {

	public static void main(String[] args) {
			Integer i = 10;
			Object object = GenericMethod.objMethod(i);
			
			// 타입 인자(Type Argument) 명시적 전달
			System.out.println("명시적 타입 인자 전달");
			Integer result = GenericMethod.<Integer>genericMethod(i);
			Integer integerValue = GenericMethod.<Integer>numberMethod(10);
			Double doubleValue = GenericMethod.<Double>numberMethod(20.0);
			
			//타입 추론, 타입 인자 생략
			System.out.println("타입 추론");
			Integer result2 = GenericMethod.genericMethod(i);
			Integer integerValue2 = GenericMethod.numberMethod(10);
			Double doubleValue2 = GenericMethod.numberMethod(20.0);
		}
}

// 실행결과
object print: 10
명시적 타입 인자 전달
generic print: 10
bound print: 10
bound print: 20.0

//추가한 내용만 출력
타입 추론
generic print: 10
bound print: 10
bound print: 20.0

🧠 와일드카드(Wildcard)와 제네릭(Generic)을 의도에 맞게 이용하자.

와일드 카드는 컴퓨터 프로그래밍에서 *나 #같은 하나 이상의 문자들을 상징하는 특수문자를 뜻한다. 

쉽게 말해서 여러 타입이 들어올 수 있음을 뜻한다.

그럼 둘이 뭐가 다른건가요?!

결론 먼저 말하자면, 둘의 의도와 읽혀지는 타입이 아예 다르다.

  • 제네릭 -> 그 타입을 사용하고 싶을때
  • 와일드 카드 -> 타입을 무시하고 싶을때

이게 무슨 말일까?! 좀 더 자세한 이해를 위해 코드 예제를 살펴보자.

// 제네릭 메서드
public static <T> void copy(List<T> src, List<T> dest) {
    for (T t : src) {
        dest.add(t);   // T 타입 일관되게 사용 가능
    }
}

// 와일드카드 메서드
public static void printAll(List<?> list) {
    for (Object o : list) {
        System.out.println(o);
    }
}

 

복사하는 메서드인 copy()는 두 리스트의 타입이 같아야 한다는 제약이 필요하다. -> 타입 추론이 필요한 제네릭 메서드로 구현.

그냥 아무 리스트나 출력하는 역할인 printAll()은 어떤 타입이 오던지 출력만 하면 된다. -> 제약을 걸어놓기보단 모든게 오길 기대하는 와일드 카드가 더 적합.

 

이제 제네릭은 사용하고 싶다는 표현과 와일드카드는 무시하고 싶다는 표현이 좀 와닿는가?

와일드 카드는 제네릭처럼 타입을 결정하거나 복잡하게(어떻게 복잡한지는 추후에 나온다) 작동하지 않는다. 단순히 일반 메서드에 제네릭 타입도 받을 수 있는 매개변수가 하나 있는 것뿐이다. 꼭 필요한 상황이 아니라면 의도에 맞게 와일드카드 사용도 권장된다.

 

🛠️ 제네릭 타입이 어떤식으로 타입을 관리하는지 알아보자

자바의 제네릭 타입은 컴파일 시점에만 존재하고, 런타임 시에는 제네릭 정보가 지워지는데, 이것을 타입 이레이저라고 한다.

제네릭은 자바 컴파일 단계에서만 사용되고(체크 예외인 컴파일 오류로 실수를 방지하기 위해), 컴파일 이후에는 제네릭 정보가 삭제된다. 제네릭에 사용한 타입 매개변수가 모두 사라지는 것이다.

아래 코드와 주석을 보며 각각 컴파일 전후 코드를 확인하자.

// 선언시 -> .java 파일
public class GenericBox<T> {
        private T value;
        public void set(T value) {
            this.value = value;
        }
        public T get() {
            return value;
        }
    }
    
// 컴파일시 타입추론이 일어난다.
public class GenericBox<Integer> {
        private Integer value;
        public void set(Integer value) {
            this.value = value;
        }
        public Integer get() {
            return value;
        }
    }
    
// 컴파일이 끝난 시점 -> .class 파일
public class GenericBox {
        private Object value;
        public void set(Object value) {
            this.value = value;
        }
        public Object get() {
            return value;
        }
    }

 

 

컴파일 이후에는 제네릭 정보가 존재하지 않기에 런타임에 타입을 활용하는 아래와 같은 코드는 활용할 수 없으니 참고하길 바란다~! (런타임엔 모두 Object가 되어버리므로)

 class EraserBox<T> {
        public boolean instanceCheck(Object param) {
            return param instanceof T; // 오류
        }
        public T create() {
            return new T(); // 오류
        }
    }

마무리하며

이번 기회에 얼핏 알고 있었던 제네릭에 대해 공부하며 와일드카드에 대해 함께 공부해보았다.

라이브러리나 오픈소스를 작성할 때는 어떤 값이 들어올지 모르기에, 그에 대비해 제네릭과 와일드카드를 적극 활용해야 여러군데 적용 가능한 메서드나 변수가 탄생하지 않을까 싶다. 

오픈소스 둘러보면 이런 문법들 굉장히 많았는데, 앞으로 코드 읽을 때 의도를 조금 더 빠르게 파악할 수 있겠다!

'Java & Kotlin' 카테고리의 다른 글

[JAVA] 자바 중첩 클래스(Nested Class), 지역클래스의 변수 캡처(Capture)와 함께 정리하며 람다의 출생 이유까지 알아보기  (0) 2026.02.01
[JAVA] 자바가 제공하는 날짜 시간 총정리  (0) 2026.01.31
[JAVA] String은 바쁘다! 속도가 중요할 시 StringBuilder를 이용하자  (0) 2026.01.30
[Kotlin] 자바 개발자를 위한 코틀린 정리(차이점을 위주로)  (0) 2025.11.06
[JAVA] 함수형 인터페이스란?(Supplier<T>, Predicate<T>를 적용하게 된 이유를 중점으로)  (0) 2025.11.03
'Java & Kotlin' 카테고리의 다른 글
  • [JAVA] 자바 중첩 클래스(Nested Class), 지역클래스의 변수 캡처(Capture)와 함께 정리하며 람다의 출생 이유까지 알아보기
  • [JAVA] 자바가 제공하는 날짜 시간 총정리
  • [JAVA] String은 바쁘다! 속도가 중요할 시 StringBuilder를 이용하자
  • [Kotlin] 자바 개발자를 위한 코틀린 정리(차이점을 위주로)
노을을
노을을
진인사대천명
  • 노을을
    노을의 개발일기장
    노을을
  • 전체
    오늘
    어제
    • All (61) N
      • Java & Kotlin (16)
      • Spring (3) N
      • Problem Solve (13) N
      • Computer Science (0)
      • Infra (1)
      • DB (2)
      • Various Dev (23)
        • 우아한테크코스 (9)
        • Git&Github (2)
        • Unity (12)
      • Book (1)
      • Writing (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    백준
    프리코스
    알고리즘
    합격
    코테
    코딩
    github
    스프링
    코딩테스트
    티스토리챌린지
    개발자
    우테코
    게임개발
    java
    개발
    우아한테크코스
    8기
    오픈미션
    자바
    유니티
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
노을을
[JAVA] 광범위한 타입을 제공하는 제네릭(Generic)과 와일드카드(WildCard) 정리
상단으로

티스토리툴바