ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 지네릭스(Generics) - 지네릭 메서드
    백엔드/자바 2021. 5. 22. 17:19

    이전 지네릭스 관련 포스트에서 타입 매개변수는 사용 제한이 있다고 했다.

     

    static 멤버와 같이 쓰여질 때고 또 하나는 일반 클래스에서 사용될 때라고 했다.

     

     

    이렇게 일반 클래스의 경우 타입 매개변수는 사용할 수 없어 컴파일 에러가 나는 것을 볼 수 있다.

     

     

     

    지네릭 클래스라하더라도 static 메서드에선 타입 매개변수도 컴파일 에러가 나는 것을 볼 수 있다.

     

     

     

    그럼 위처럼 타입 매개변수를 써준 것은 무엇일까?

     

    이렇게 메서드의 선언부에 지네릭 타입이 선언된 메서드를 지네릭메서드라 한다.

     

    하지만 지네릭 메서드의 <T>는 우리가 아는 타입 매개변수 <T>와는 다르다.

    지네릭 메서드

     

    우선 위와 같은 클래스들이 있다고 가정해보자.

     

     

     

    이중에서 genericsMethod 클래스를 위와 같이 지네릭 클래스로 변경해보자.

     

    이때 첫번째는 일반적인 메서드고, 두번째는 지네릭 메서드다.

     

    만약 이 클래스로 객체를 만든다면 Fruit클래스와 그 자손인 Apple, Grape만 T로 받을 수 있어야 한다.

     

    그런데 과연 진짜 그럴까?

     

     

     

    하지만 예상과 달리 genericsMethod의 객체는 Fruit의 자손이 아닌 Toy클래스의 객체도 T로 전달받았다.

     

    근데 당황스러운건 일반 메서드인 test1은 Toy 객체를 타입 매개변수 T로 받지 못한다.

     

    반면 지네릭 메서드인 test2는 Toy 객체를 타입 매개변수 T로 받았다.

     

    왜 그런걸까? 바로 지네릭 메서드는 기존의 일반적인 타입 매개변수와는 작동 방식이 다르기 때문이다.

     

     

    대략 구조를 보자면 이렇다.

     

     

    우선 일반적인 타입 매개변수와 일반 메서드의 동작 방식은 위와 같다.

     

    - 객체를 생성할 때 객체에서 사용할 데이터 타입을 지정한다.

    - 해당 데이터 타입이 타입 매개변수에 대입된다.

    - 객체를 이용할 때 사용하거나 저장 가능한 데이터 타입은 타입 매개변수에 대입된 데이터 타입 뿐이다.

     

     

     

    반면 지네릭 메서드는 동작 방식이 전혀 다르다.

     

    - 객체를 생성한다.

    - 객체를 이용해 지네릭 메서드를 이용한다.

    - 이때 메서드에 대입한 객체가 타입 매개변수에 대입된다.

    - 메서드를 실행할 때마다 다른 타입 매개변수를 넣을 수 있다.

     

    일반적인 타입 매개변수는 객체를 생성할 때 정해진다.

     

    하지만 지네릭 메서드는 실행할 때마다 타입 매개변수의 객체가 달라진다.

     

    생긴건 같지만 엄연히 말해서 작동 방식도 다르고 위처럼 쓰임도 다르다.

    지네릭 메서드의 범위

     

    만약 위와 같은 클래스들이 존재한다고 생각해보자.

     

     

     

    그리고 위와 같은 클래스와 static 지네릭 메서드가 존재한다고 생각해보자.

     

     

     

    위는 지네릭 메서드를 사용하는 코드다.

     

    우선 지네릭 메서드는 일반적인 지네릭이 범위를 제한하는 것처럼 extends를 쓸 수 있다.

     

    이것을 이용해서 지네릭 메서드가 사용할 수 있는 객체의 범위를 제한하는 것이다.

     

    그리고 또 하나는 지네릭 메서드의 범위는 본인이 속한 클래스의 범위와는 상관없다.

     

    지역 변수의 범위와 동일하게 해당 지네릭 메서드 내에서만 사용되고 소비된다.

     

    이건 지네릭 메서드가 static이든 아니든 동일하게 적용된다.

    지네릭 메서드와 와일드 카드

    얼핏보면 지네릭 메서드와 와일드 카드는 똑같이 보일 수 있다.

     

    실제로 둘 다 static이나 일반 클래스 내에서도 사용이 가능하다.

     

    하지만 둘의 근본적인 차이가 있다.

     

    와일드 카드가 지네릭 본연의 목적인 하나의 참조 변수 타입으로 여러 객체를 다루기 위한 것이라면

     

    지네릭 메서드는 호출할 때마다 다른 객체를 다루기 위한 것이다.

     

Designed by Tistory.