제네릭을 도입하기 전, 프로그래머는 컬렉션에서 객체를 읽어낼 때마다 형변환을 해야 했다. 하지만 제네릭을 사용하면 컬렉션에 넣는 객체의 자료형이 무엇인지 컴파일러에게 알릴 수 있으므로, 형변환 코드는 컴파일러가 알아서 넣어준다. 잘못된 자료형의 객체를 컬렉션에 넣으려는 시도도 컴파일단계에서 발견하게 된다.
선언부에 형인자(<String>)가 포함된 클래스나 인터페이스는 제네릭 클래스나 인터페이스라고 부른다. 그러나 제네릭 자료형을 형인자 없이 사용할 수도 있다. 이러한 무인자 자료형을 쓰면 형 안전성이 사라지고(아무 자료형을 다 넣을 수 있음) , 제네릭의 장점중 하나인 표현력 측면에서 손해를 보게된다.
무인자 자료형을 사용하면 안되지만 List<Object>와 같은 자료형은 써도 좋다. List 와 List<Object>의 차이점은 무엇일까? List는 형 검사 절차를 완전히 생략한 것이고, List<Object>는 아무 객체나 넣을 수 있다는 것을 컴파일러에게 알리는 것이다. 코드로 살펴보자.
이러한 비한정적 와일드카드 자료형에는 null이외의 어떠한 원소도 넣을 수 없으므로, 불변식을 지켜준다.
새로 만드는 코드에는 무인자 자료형을 쓰면 안된다고 하였지만, 예외 2가지가 있다. 첫 번째는 클래스 리터럴에는 반드시 무인자 자료형을 사용해야 한다. 자바 표준에 의하면 클래스 리터럴에는 형인자 자료형을 쓸수 없다.(배열 자료형이나 기본 자료형은 쓸수 있다.)
두 번째 예외는 instanceof 연산자 사용 규칙에 관한 것이다. 제네릭 자료형 정보는 프로그램이 실행될 때는 지워지기 때문에 instanceof 연산자는 비한정적 와일드카드 자료형 이외의 형인자 자료형에 적용할 수 없다. 그래서 다음과 같이 하는 것이 좋다.
위와 같이 o가 Set객체라는 것이 확실해진 다음에는 와일드카드 자료형 Set<?>로 형변환 해야하는 것에 주의하자.
요약
'개발서적 > 이펙티브자바' 카테고리의 다른 글
[제네릭]규칙25. 배열대신 리스트를 써라 (0) | 2017.04.29 |
---|---|
[제네릭]규칙24. 무점검 경고를 제거하라 (0) | 2017.04.27 |
[클래스와 인터페이스]규칙22. 멤버 클래스는 가능하면 static으로 선언하라 (0) | 2017.04.26 |
[클래스와 인터페이스]규칙21.전략을 표현하고 싶을 때는 함수 객체를 사용하라 (0) | 2017.04.26 |
[클래스와 인터페이스]규칙20. 태그달린 클래스 대신 클래스 계층을 활용하라 (0) | 2017.04.25 |