본문 바로가기
책(독서)

[이펙티브자바] ~180p item 30

by DevJR 2020. 10. 23.

아이템 30 - 이왕이면 제네릭 메서드로 만들라

 

-> 메서드도 제네릭으로 만들 수 있는데,

일반적으로 제네릭 메서드는

public <타입파라미터...> 리턴타입 메소드명 (매개변수...) { }

이런식으로 매개변수의 타입과 리턴타입으로 '타입파라미터' 를 갖는 메서드를 의미한다.

 

이 부분에서 제일 이해가 안간 부분은

public static <E> Set<E> union(Set<E> s1, Set<E> s2) {
	Set<E> result = new HashSet<>(s1);
    result.addAll(s2);
    return result;
}

이러한 예시가 있는데, 왜 굳이 타입 파라미터를 써주어야 하는건지 이해가 안되었다. 리턴타입으로 Set<E>가 있으면 굳이 앞에 <E>를 써주지 않아도 되는 것 아닌가 하는 생각이었는데, 리턴타입에 들어가는 <E> 값을 정의해주지 않으면 E 값이 무엇이라는걸 컴파일러는 어떻게 알 것인가?? (헷갈리면 위의 메서드 그대로 긁어서 아무 클래스나 만들고 IDE에서 타입파라미터인 <E> 만 지워보면 에러 뜨는걸 확인할 수 있다.) 요지는 타입파라미터로 써주는 <E> 값이

Set<String> unionSet = <String> union(s1, s2);

이와같이 (뒷부분 메서드 바로앞 타입 파라미터) 제네릭으로 넣어주는 값을 통해 메서드 내에서 혹은 리턴타입, 매개변수 등에서 쓰이는 <E> 값을 정할 수 있게 해준다. 물론 이 바로 위에 <String> union(s1, s2) 의 경우 정의할 때는 <E>로 타입 매개변수를 써주기도 했고, 실제로도 <String>등으로 표기해주긴 했지만 <String> 이 제네릭은 생략해도 된다. 제네릭 메서드의 전달되는 인자들인 s1, s2를 통해서 제네릭 자료형을 알 수 있기 때문에 자료형 표현을 생략할 수 있다고 한다.

 

재귀적 타입 한정 

자기 자신이 들어간 표현식을 사용. -> 타입 매개변수의 허용범위 한정

(179p 참조)

 

 

참고 : butter-shower.tistory.com/88

ict-nroo.tistory.com/42ict-nroo.tistory.com/42

 

[Java] 제네릭 프로그래밍

제네릭 프로그래밍(Generic Programming) 이란? 작성한 코드를 다양한 타입의 객체에 대해 재사용한다는 객체 지향 기법이다. 제네릭(Generic) : 클래스를 정의할 때 구체적인 타입을 적지 않고 변수 형

butter-shower.tistory.com