프로그래밍 언어/JAVA

Java 7에서 다이아몬드 연산자 (<>)를 사용해야 하는 이유

Rateye 2021. 9. 17. 11:38
728x90
반응형
질문 : Java 7에서 다이아몬드 연산자 (<>)의 요점은 무엇입니까?

Java 7의 다이아몬드 연산자는 다음과 같은 코드를 허용합니다.

List<String> list = new LinkedList<>();

그러나 Java 5/6에서는 간단히 다음과 같이 작성할 수 있습니다.

List<String> list = new LinkedList();

유형 삭제에 대한 나의 이해는 이것들이 정확히 동일하다는 것입니다. (어쨌든 제네릭은 런타임에 제거됩니다).

왜 다이아몬드에 신경을 쓰나요? 어떤 새로운 기능 / 유형 안전성이 허용됩니까? 새로운 기능이 생성되지 않으면 왜 기능으로 언급합니까? 이 개념에 대한 나의 이해에 결함이 있습니까?

답변

문제

List<String> list = new LinkedList();

왼쪽에서는 일반 유형 List<String> 을 사용하고 있으며 오른쪽에서는 원시 유형 LinkedList 사용하고 있습니다. Java의 원시 유형은 제네릭 이전 코드와의 호환성을 위해서만 존재하며 반드시 필요한 경우가 아니면 새 코드에서 사용해서는 안됩니다.

이제 Java가 처음부터 제네릭을 가지고 있고 제네릭을 갖기 LinkedList 와 같은 유형이없는 경우 제네릭 유형에 대한 생성자가 자동으로 유형 매개 변수를 추론하도록 만들 수 있었을 것입니다. 가능한 경우 과제의 왼쪽. 그러나 그렇지 않았으며 이전 버전과의 호환성을 위해 원시 유형과 제네릭 유형을 다르게 처리해야합니다. 따라서 유형 매개 변수를 반복 할 필요없이 일반 객체의 새 인스턴스를 선언 하는 약간 다르지만 똑같이 편리한 방법 인 다이아몬드 연산자를 만들어야합니다.

List<String> list = new LinkedList() 의 원래 예제에 관한 한 컴파일러는 해당 할당에 대한 경고를 생성합니다. 이걸 고려하세요:

List<String> strings = ... // some list that contains some strings

// Totally legal since you used the raw type and lost all type checking!
List<Integer> integers = new LinkedList(strings);

제네릭은 잘못된 작업을 수행하는 것에 대한 컴파일 타임 보호를 제공하기 위해 존재합니다. 위의 예에서 원시 유형을 사용하면이 보호 기능을 사용할 수 없으며 런타임에 오류가 발생합니다. 이것이 원시 유형을 사용해서는 안되는 이유입니다.

// Not legal since the right side is actually generic!
List<Integer> integers = new LinkedList<>(strings);

그러나 다이아몬드 연산자를 사용하면 할당의 오른쪽이 해당 매개 변수를 다시 입력 할 필요없이 왼쪽과 동일한 유형 매개 변수가있는 진정한 제네릭 인스턴스로 정의 될 수 있습니다. 원시 유형을 사용하는 것과 거의 동일한 노력으로 제네릭의 안전성을 유지할 수 있습니다.

이해해야 할 핵심은 원시 유형 ( <> 이없는)은 제네릭 유형과 동일하게 취급 될 수 없다는 것입니다. 원시 유형을 선언하면 제네릭의 이점과 유형 검사를받을 수 없습니다. 또한 제네릭은 Java 언어의 범용 부분 이라는 것을 명심해야 Collection 의 인수가없는 생성자에만 적용되는 것이 아닙니다!

출처 : https://stackoverflow.com/questions/4166966/what-is-the-point-of-the-diamond-operator-in-java-7
728x90
반응형