지식공부

제네릭 , 와일드카드

동곤일상 2025. 7. 16. 22:56
반응형

제네릭(generic)이란?

✅ 쉽게 말하면?

자료형을 나중에 지정할 수 있는 틀
즉, 클래스나 메서드를 만들 때 타입을 고정하지 않고, 사용할 때 타입을 지정

 

 

✅ 예시

🔸 제네릭 없는 경우

ArrayList list = new ArrayList();
list.add(1);
list.add("하이");
System.out.println(list);

 

🔸 제네릭 사용한 경우

 List<Integer> list = new ArrayList<Integer>();
 list.add(1);
// list.add("하이"); 컴파일오류발생
 System.out.println(list);
  • 컴파일 시 타입 체크 가능 → 안전함

 

내가 제네릭클래스를 직접만들어 사용하면 더 와닿을 수도있음

 

Generic1 클래스

package generic;

public class Generic1<T> {
    private T x;

    public T getX() {
        return x;
    }
    public void setX(T x) {
        this.x = x;
    }
}

 

그냥 타입매개변수(T) 만을 set , get 하는 코드뿐인 클래스

이때 타입매개변수(T)는 미리 지정하는것이 아닌 사용될 때 정해짐

 

Generic1<Integer> i  = new Generic1<>();
i.setX(1);
//i.setX("ㅎㅎ");
Generic1<String> s = new Generic1<>();
//s.setX(1);
s.setX("ㅎㅎ");

다음과 같이 만들 때 타입이 정해지는 게 제네릭이라고 한다


2) 와일드카드에 대해 간단히

✅ 와일드카드란?

제네릭에서 ?는 **"어떤 타입이든 올 수 있음"**을 의미해.
즉, 타입을 특정하지 않고 유연하게 처리하고 싶을 때 사용함.


✅ 사용 목적

  • 다양한 제네릭 타입을 하나의 메서드나 클래스에서 처리하고 싶을 때
  • 상속 관계가 있는 제네릭 타입끼리도 호환성을 가지도록 만들기 위해

 

 

참고!!! 와일드카드는 제네릭 타입이나, 제네릭 메서드를 선언하는 것이 아니다.

와일드카드는 이미 만들어진 제네릭 타입을 활용할 때 사용한다.

 

다음예제는 List<T>를 이용한 예제

package generic;

import java.util.ArrayList;
import java.util.List;

public class WildEx {
    public static void main(String[] args) {
       List<Object> list = new ArrayList<>();
        //wild1(list); Object 와 Number는 다른관계
        wild2(list);

        ArrayList<Integer> list1 = new ArrayList<>();
        wild1(list1);
        //wild2(list1); Integer는 String의 부모가아님


        ArrayList<String> list2 = new ArrayList<>();
        //wild1(list2);  String 와 Number는 다른관계
        wild2(list2); 
    }

    //?가 Number의 자식 (Integer ,Float , Double 만 들어올수있음)
    private static void wild1(List<? extends  Number > animals) {
        System.out.println("접근성공");
    }
    //?가 String의 부모 (String , Object)
    private static void wild2(List<?  super  String > animals) {
        System.out.println("접근성공");
    }

}

다음 List<? extends Number>는 오직 숫자의 wrapper를 가지는 List만 받겠다는 의미이며

 

 List<? super String>는 오직 String의 부모 (자신포함 , Object) 만 받겠다는 의미