본문 바로가기
IT Study/YouTube 영상 후기

10분 테코톡 - 제네릭

by hhyyyjun 2022. 12. 24.

https://www.youtube.com/watch?v=n28M8iryFPw

| 제네릭(Generic)

다양한 타입의 객체들을 다루는 메서드나 클래스에 컴파일 시의 타입 체크를 해주는 기능

=> 객체의 타입 안정성을 높이고 , 형변환의 번거로움이 줄어든다.

제네릭 구조

public class Box<T> {}

T : 타입 매개변수

Box<T> : 제네릭 클래스

제네릭의 장점

1) 강력한 타입 체크를 해준다.

2) 형변환을 하지 않아도 된다.

제네릭 사용법

참조변수와 생성자에 대입된 타입이 일치해야 한다.

ex)

Box<Apple> appleBox = new Box<Apple>();

Box<Grape> grapeBox = new Box<Grape>();

Box<Fruit> fruitBox = new Box<Apple>(); => X apple이 fruit을 상속해도 불가능하다.

제네릭 클래스가 상속 관계인 것은 괜찮다.

Box<Fruit> fruitBox = new FruitBox<Fruit>();

List<Fruit> fruits = new ArrayList<Fruit>();

Box<Fruit> grapeBox = new FruitBox<Apple>(); => X 단, 여전히 대입되는 타입은 같아야 한다.

제한된 제네릭

public class Box<T>{

       List<T> items = new ArrayList<>();
       void add(T item){
             items.add(item);
     }
}

=> 제네릭의 문제점 내가 넣고싶은 타입만 넣고 싶은데 위와 같은 T가 있을 때 어떤 타입이든 다 들어올 수 있음

public class Box<T extends Fruit>{

       List<T> items = new ArrayList<>();
       void add(T item){
             items.add(item);
     }
}

=> Fruit을 상속하는 타입만 올 수 있다.

제네릭의 타입 매개변수

T - Type

E - Element

K - Key

V - Value

N - Number

사용자 본인이 원하는 대로 표기하여 사용해도 문제가 되지 않지만, 이와 같이 표기하는 것이 관례이다.

제네릭 메서드

public <T> T foo(List<T> list){}

<T> : 타입 매개변수

T : 리턴 타입

foo : 메소드 명

List<T> list : 매개변수

***만약 전달되는 타입 매개변수의 범위를 제한하고 싶다면?

public <T> T foo(List<T extends Fruit> list){} => X

public <T extends Fruit> T foo(List<T> list){} => O

제네릭 메서드의 사용

제네릭 메서드의 타입과 제네릭 클래스의 타입은 서로 다른 것이다.

public class Box<T>{
      public <T> void printParamClass(T t){
               System.out.println(t.getClass());
      }
}

ex)

Box<Fruit> box = new Box<>();

box.printParamClass("String");

box.printParamClass(1);

box.printParamClass(3.14);

만약 메서드의 타입과 클래스의 타입이 같다면 각 타입이 전달될 수 없다.

***제네릭 메서드는 제네릭 클래스가 아닌 일반 클래스에서도 사용이 가능

public class MyClass{
        public <T> void printParamClass(T t){
               System.out.println(t.getClass());
        }
}

와일드 카드

? 기호로 표현되며, 어떠한 타입도 될 수 있다.

사용

와일드 카드를 사용하여 모든 타입이 들어올 수 있도록 수정

public static void printList(List<? extends Object> list){
     for(Object elem : list){
            System.out.println(elem + " ");
     }

댓글