코드스테이츠_국비교육/[Section1]

16.03_제네릭 메서드_22.09.13

생각없이 해도 생각보다 좋다. 2022. 9. 14. 22:18

학습키워드

  • 제네릭
  • 제네릭 클래스
  • 제네릭 메서드
  • Wrapper 클래스

 

제네릭 메서드

>의미

: 제네릭으로 선언한 메서드

: 클래스 전체가 아닌 특정 메서드만 제네릭 선언을 할 수 있다.

>제네릭 메서드 정의

: 제네릭 메서드의 타입 매개변수는 반환타입 앞에 선언한다.

class Main {
	...
	public <T> void sleep(T element){
	...
	}
}

>제네릭 메서드의 특징 및 장점

: static 메서드에서도 선언 가능하다.

: 제네릭 메서드의 타입은 메서드를 호출할 때 지정된다.

: 타입 지정을 생략할 수 있다. (컴파일러가 자동으로 인자의 자료형으로 타입을 지정함)

: 제네릭 메서드의 내용에는 Object 클래스의 메서드만 사용할 수 있다.

//어떤 타입이 지정될 지 모르기 때문이다. 하지만 Object 클래스는 모든 클래스의 상위 클래스이기 때문에 상관없다!

>제네릭 메서드와 제네릭 클래스 타입 매개변수 차이

: 제네릭 클래스와 제네릭 클래스가 한 클래스에 동시에 선언되어 있다면, 제네릭 클래스의 타입 매개변수와 제네릭 메서드의 타입 매개변수는 서로 다른 매개변수이다.

: 매개변수의 특성(지역 변수)을 생각하면 이해하기 쉽다. 클래스 내의 변수명과 같은 이름의 매개변수를 메서드에 적용해도 문제없는 것과 같다.

: 제네릭 클래스의 타입은 클래스의 인스턴스가 생성될 때 지정된다.

: 제네릭 메서드의 타입은 해당 메서드가 호출될 때 지정된다. (타입 인자는 생략이 가능하다)

class Cake<T> {                
	...
	public <T> void whipping(T element) {
	...
	}
}

Cake<String> cake = new Cake<>();
//제네릭 클래스의 타입은 인스턴스 생성 시 지정됨.
cake.<Integer>whipping(100);
//제네릭 매서드의 타입은 해당 메서드 호출 시 지정됨.
cake.wipping(100); // 타입 생략도 가능
//제네릭 메서드의 타입 인자 생략 시, 컴파일러가 자동으로 주어진 인자를 기준으로 지정함.

//??매개변수가 여러 개여도 컴파일러가 메서드 내에서 골라서 쏙쏙 해줄까? =>골라서 다 처리해준다.
//예시.
class Cake<T> {
    public <T, A> void whipping(T element, A atom) {
        System.out.println(element + "번 " + atom);
    }
}

Cake<String> cake = new Cake<>();
cake.whipping(100, "저어라");
//출력: 100번 저어라
//T element = Integer 100
//A atom = String "저어라"

>제네릭 메서드 주의 사항

: 제네릭 메서드의 타입은 메서드가 호출될 때 정해지므로, 타입이 정의되지 않은 시점. 즉, 메서드 선언 시에 특정 타입이 사용할 수 있는 메서드(해당 타입의 메서드)는 사용 불가능하다.

//예시 1.
//T와 A가 '+'연산자를 사용할 수 있는 타입인지 모름.
public <T, A> void whipping(T element, A atom) {
    System.out.println(element + atom);//에러
}

//예시 2.
//T가 String이라는 보장이 없음.
public <T> void whipping(T elementm) {
    System.out.println(element.length());//에러
}

>제네릭 메소드의 제한된 타입 매개변수 선언

: 제네릭 클래스의 제한된 타입 매개변수 선언과 똑같은 구조와 기능을 갖는다.

 

와일드카드

>의미 및 특징

: 메서드의 타입을 어떤 타입으로도 대체할 수 있게 하는 파라미터

: 기호 ? 로 표현함.

: 기능적으론 제네릭 메서드와 다를게 없지만, 제네릭이 아님!

: 특히 제네릭 클래스를 매개 변수로 할 때, 주로 사용.

: 제네릭 메서드보다 와일드카드를 많이 쓸 예정. 물론 같이 쓰는 것도 가능!

: 상한 제한(extends), 하한 제한(super)을 두어 <?>에 넣을 수 있는 타입에 제한을 둠.

>제한 없음, <?>

: 어떤 타입의 타입 파라미터도 받을 수 있음.

>상한 제한, <? extends T>

: T와 T를 상속받는 하위 클래스 타입만 타입 파라터로 받을 수 있음.

>하한 제한, <? super T>

: T와 T가 상속한 상위 클래스 타입만 타입 파라미터로 받을 수 있음.

 

// 읽을 순 있겠는데, 예제를 만들기가 진짜 어렵네... 시간될 때 만들어보자

'코드스테이츠_국비교육 > [Section1]' 카테고리의 다른 글

16.06_예외 처리_22.09.13  (0) 2022.09.15
16.05_열거형_22.09.13  (0) 2022.09.14
16.02_제네릭 클래스_22.09.13  (1) 2022.09.13
16.01_Wrapper 클래스_22.09.13  (0) 2022.09.13
15_추석 전 날_22.09.08  (0) 2022.09.09