국비지원 공부 정리/Java

자바의 재네릭과 와일드카드

worldstroy 2025. 4. 9. 12:17

제네릭이란?

자바에서 형 안전성을 높이기 위해 도입된 프로그래밍으로 
컴파일 시간에 타입 오류를 더욱 효과적으로 찾아낼 수 있으며 클래스, 인터페이스, 메서드에 대한 타입을 파라미터로 전달할 수 있게 해주는 역할
즉, 결정되지 않은 타입을 파라미터로 넘겨주어, 실제 사용할 때 파라미터의 타입을 결정하는 기능  

 

제네릭의 장점

타입 안전성 잘못된 타입의 객체가 저장되는 것을 컴파일 시간에 방지
형 변환 필요성 감소  제네릭을 사용하면 명시적인 형 변환이 필요 없어짐
코드 재사용성 일반 클래스나 메서드로 다양한 타입에 대해 동작하는 코드를 작성하는 것이 가능함

 

제네릭 타입

public class 클래스명<T>
public interface 인터페이스명<E>

 

결정되지 않은 타입을 파라미터로 가지는 클래스와 인터페이스로 일반적으로 괄호 안의 임시 타입은 대문자로 작성하는 것이 원칙임 

 

제네릭 클래스의 예시 코드 

 

public class MyCustomList<T> {
	ArrayList<T> list = new ArrayList<>();
    public void addElement(T element) {
    	list.add(element);
    }
    public void removeElement(T element) {
    	list.remove(element);
    }
    public static <E> void printPair(E first, E second) {
    	System.out.println("(" + first + ", " + second + ")");
    }
}

 

 

 


제한된 타입 파라미터(bounded type parameter)

<T extends Number>
모든 타입으로 대체할 수 없고, 특정 타입과 자식 or 구현 관계에 이쓴ㄴ 타입만 대체할 수 있는 파라미터
extends 키워드를 사용하여 제네릭에 상한을 결정하면 타입 파리마터를 정해진 상한에서 제한할 수 있음
이를 통해 타입 파라미터가 특정 클래스의 서브 클래스, 또는 특정 인터페이스의 구현 클래스만 가능하도록 제한할 수 있다.

 

 

와일드카드(?)

 

?(Unbounded Wildcard) : 어떠한 타입도 될 수 있습니다.
? extends T(Upper Bounded Wlidcard) : T  타입 또는 T의 서브타입을 의미함
? super T(Lower Bounded Wlidcard) : T 타입 또는 T의 슈퍼 타입을 의미함 
제네릭 타입을 매개값 or 리턴 타입으로 사용할 때 타입 파라미터로 ? 사용가능
재네릭에서 와일드카드(?)는 "알 수 없는 타입"을 의미한다.
와일드카드는 제네릭 코드에서 더 큰 유연성을 얻기 위해 사용되며 특히 제네릭 메서드나 제네릭 클래스에서 다양한 제네릭 타입을 처리할 때 유용하게 사용됨

 

와일드카드의 사용의 예

 

1. 상한 경계 와일드카드 :  ? extend 변수 

 

public static void printNumbers(List<? extends Number> list) {
    for (Number num : list) {
        System.out.println(num);
    }
}

 

해당 List에서는 Integer나 Double과 같은 다양한 타입의 리스트를 받아 처리하는 것이 가능함 

 

 

2. 하한 경계 와일드카드 : ? super Integer

 

public static void addIntegers(List<? super Integer> list) {
    list.add(10);
    list.add(20);
}

 

Integer가 아닌 Number랑 Object를 인자로 전달할 수 있음