EJ2E Item 23. 새로 작성하는 코드에서는 raw type 쓰지 말자
class List<E> {
...
}
List<String> stList = ~~~~;
이런 코드가 있을 때...
- List<E>: Generic type
- List<String>: Parameterized type
- E: Formal type parameter
- String: Actual type parameter
- List: Raw type (제목에 쓴게 이거임)
- List<?>: Unbounded wildcard type
- 나머진 패스.
- 컴파일 시에 타입 안전성을 보장한다.
- 부가적인 장점으로 컬렉션에 들어있는 것을 꺼낼 때 캐스팅할 필요가 없다.
그럼 Generic을 꼭 쓰게 하지 왜 Raw Type으로 쓸 수 있게 해뒀냐?
- 호환성 때문에. 이미 1.5전 버전 기준으로 만들어 놓은 코드가 많으니까.
Generic 특성
- List<String>은 List의 하위 타입이지만 List<Object>의 하위 타입은 아니다.
- 다음 item에서 더 자세히 설명 나옴.
public static void main(String[] args) {
List<String> strings = new ArrayList<String>();
unsafeAdd(strings, new Integer(42));
String s = strings.get(0); // Compiler-generated cast
}
private static void unsafeAdd(List list, Object o) {
list.add(o);
}
굵은 글씨에서 타입을 명시하지 않았기 때문에 list.add(o); 여기서 일단 컴파일 경고가 발생하지만 일단 무시하고 실행할 수는 있다 막상 실행하면 ClassCastException 발생한다. 하지만 만약 저기서 List<String>이라고 타입을 명시했다면 애초에 컴파일도 못했을 것이다.
//위험
static int numElementsInCommon(Set s1, Set s2) {
int result = 0;
for (Object o1 : s1)
if (s2.contains(o1))
result++;
return result;
}
//안전
static int numElementsInCommon(Set<?> s1, Set<?> s2) {
int result = 0;
for (Object o1 : s1)
if (s2.contains(o1))
result++;
return result;
}
위에껀 왜 위험하고 아래껀 왜 안전할까? 안전한 녀석에는 무언가 추가할 수가 없다. 위험한 녀석에는 아무 객체나 넣을 수 있지만 unbounded wildcard type을 사용한 경우에는 컬렉션에 아무것도 추가할 수 없다. 컴파일 에러다.
왜? Actual type parameter가 뭔지 모르는데 뭘 집어 넣을 수 있을까.. 생각해보면 당연하다.
- List<String>.class
- instanceof
'Java' 카테고리의 다른 글
[JMX] JMX API 직접 사용하여 JMX MBean 공개하고 모니터링 및 관리하기 (0) | 2010.04.15 |
---|---|
EJ2E Item 24. unchecked 경고를 제거하자 (1) | 2010.03.29 |
EJ2E Item 23. 새로 작성하는 코드에서는 raw type 쓰지 말자 (0) | 2010.03.26 |
EJ2E Item 22. nonstatic 보다는 static 멤버 클래스를 선호하라 (0) | 2010.03.24 |
EJ2E Item 21. 전략을 표현할 때는 함수 객체를 사용하라 (0) | 2010.03.24 |
[ClassLoader] Thread의 getContextClassLoader() (2) | 2010.03.11 |
Class.forName()와 ClassLoader.loadClass() 차이점 (2) | 2010.03.09 |
톰캣 6.0 클래스로더 구조 (0) | 2010.03.02 |
null은 캐스팅이 되는건야 안 되는거야? (10) | 2010.03.02 |
클래스 로더의 loadClass()와 findClass() (0) | 2010.02.25 |
자바 클래스로더 입문 퀴즈 정리 (2) | 2010.02.23 |