glenn-syj / more-effective-java

이펙티브 자바를 읽으며 자바를 더 효율적으로 공부합니다
4 stars 5 forks source link

[MEJ-012] Java 변화와 타겟 타입이 가지는 의미 #208

Open glenn-syj opened 3 months ago

glenn-syj commented 3 months ago

based on: #206 by @undeadtimo

들어가며

원글에서 살펴보았듯, 적용 가능성 테스트에서의 타겟 타입(Target Type)은 메서드 오버로딩에서 파라미터 관련 정보를 제공하는 역할을 맡기도 하는데요. 이번 글에서는 타겟 타입이 가지는 의미를 살펴보고자 합니다.

Java 버전 별 타겟 타입

Java 4와 그 이전

Java 4와 그 이전에는 제네릭이나 람다 표현식 등이 도입되지 않았으므로, 대부분 명시적으로 타입을 선언해야했습니다. 기본적인 타입 추론도 primitive type에서만 이루어졌습니다.

Java 5와 Java 7

Java 5에서 제네릭 기능이 도입되면서, 컴파일러는 컨텍스트에 따라 타입을 추론하게 되었습니다. 자연스럽게 제네릭에 필요한 타입 파라미터도 넘겨주게 되었습니다.

// https://www.baeldung.com/java-generalized-target-type-inference
List<String> strListInferred = Collections.emptyList();
List<Integer> intListInferred = Collections.emptyList();

위 코드에서 컴파일러는 문맥을 통해 strListInferredintListInferred에 대해 타입을 추론할 수 있습니다. 바로 아래 제네릭 메서드를 통해서요.

public static final <T> List<T> emptyList()

또한, Java 7에 이르러 다이아몬드 연산자 <>가 도입되면서 제네릭 타입 추론 과정이 이용자에게 간단해졌는데요. 이는 현재 익숙한 아래 코드와 같은 방식으로 동작합니ㅏㄷ.

List<String> list = new ArrayList<>()

Java 8 이후

Java 8에서부터는 람다 표현식, 메서드 참조, 함수형 인터페이스와 같은 함수형 프로그래밍 기능이 도입되었습니다. 타겟 타입은 컴파일러 타입 추론 과정에서 그 역할이 강화되었는데요.

특히, 함수형 프로그래밍은 함수를 인자로 받고 반환하는 고차 함수와 익명 함수를 핵심으로 삼는데요. 타겟 타입은 코드의 유연성을 높이면서도, 타입 추론과 타입 안정성을 보장하는 역할을 한다고 볼 수 있겠습니다.

References

https://www.baeldung.com/java-generalized-target-type-inference

undeadtimo commented 3 months ago

버전별로 변화되어온 타겟 타입(목표 타입)에 대한 설명 덕분에, 이전 버전에서의 다중정의 메서드에 대한 혼동 가능성에 대해 더욱 수월하게 이해할 수 있게 되었습니다.


제가 작성한 글에서 다음 부분에 해당합니다.

`위험성을 방지해줄 안전책은 사용하는 매개변수 중 하나 이상을 근본적으로 다르게 설정하는 것이다.

근본적으로 다른 이라는 말은 두 변수의 타입이 서로의 타입으로 형변환이 불가능한 것을 말한다.

예를 들어, ArrayList의 int를 받는 생성자와 Collection을 받는 생성자는 int와 Collection타입이 서로의 타입으로 형변환이 불가능하므로 근본적으로 다른 관계가 된다.

'자바 4'까지는 모든 기본타입이 모든 참조타입과 근본적으로 달랐다.

그러나 '자바 5'부터 제네릭, 오토박싱이 생긴 결과 List 인터페이스가 취약해졌다.

심지어 자바 8부터 등장한 람다와 메서드 참조 역시 다중정의에 대한 혼란을 가중시켰다.`


자바 5에서부터 제네릭이 추가되며 컴파일러가 타겟 타입을 추론하는 방식으로 개발자에게 편의성을 제공해주었지만,

이로 인한 혼동과 오류 발생 가능성을 만들었습니다.

더욱이 자바 8에서의 함수형 프로그래밍은 제가 심화탐구에서 다뤘던 것처럼 부정확한 메서드 참조로 인한 타겟 타입 모호성을 발생시켜 사용자에게 제공되는 편의성만큼이나 위험성을 동반하게 된 것을 알게 되었습니다.