Raw Type란?
Raw Type은 제네릭(Generic) 도입 이전의 Java 방식으로, 타입 매개변수를 명시하지 않은 제네릭 클래스나 인터페이스를 말합니다. 제네릭 타입을 사용할 때 타입 매개변수를 지정하지 않으면 Raw Type이 됩니다.
예시 코드
// 제네릭 타입 사용
List<String> list = new ArrayList<>();
// Raw Type 사용
List rawList = new ArrayList(); // 타입 매개변수 미지정
위에서 rawList
는 Raw Type으로 선언되어, 타입 안전성이 보장되지 않습니다.
Raw Type 사용의 문제점
- 타입 안전성 부족
- Raw Type을 사용하면 컴파일러가 타입 검사를 하지 않아, 런타임 오류(ClassCastException)가 발생할 가능성이 높아집니다.
List rawList = new ArrayList();
rawList.add("Hello");
rawList.add(123); // 컴파일러가 오류를 감지하지 못함
for (Object obj : rawList) {
String str = (String) obj; // 런타임 오류 발생 가능
}
- 제네릭의 장점을 활용하지 못함
- 제네릭은 컴파일 타임에 타입 체크를 수행하여, 런타임 오류를 방지합니다.
List<String> list = new ArrayList<>();
list.add("Hello");
list.add(123); // 컴파일 오류 발생, 타입 안전성 보장
- 가독성과 유지보수성 저하
- Raw Type을 사용하면 코드의 의도를 명확히 알기 어려워 가독성이 떨어지고, 유지보수가 어려워집니다.
Raw Type 대신 제네릭을 사용하는 방법
제네릭 타입 사용 예시
List<String> list = new ArrayList<>();
list.add("Hello");
// list.add(123); // 컴파일 오류
와일드카드 타입 활용
List<?> list = new ArrayList<String>();
// list.add("Hello"); // 컴파일 오류: 타입 안전성 보장
Raw Type 사용이 허용되는 경우
Java는 기존 코드를 지원하기 위해 Raw Type을 허용합니다. 하지만 새로운 코드에서는 사용하지 않는 것이 권장됩니다.
허용된 예외 상황
- Class Literals
Class<List> clazz = List.class;
instanceof
연산
if (obj instanceof List) {
List<?> list = (List<?>) obj; // Raw Type 사용
}
결론
- Raw Type은 제네릭 도입 이전의 레거시 코드와 호환성을 위해 존재하지만, 새로운 코드에서는 사용하지 말아야 합니다.
- 제네릭을 사용하면 컴파일 타임 타입 체크를 통해 타입 안전성을 보장하고, 코드의 가독성과 유지보수성을 향상시킬 수 있습니다.
Raw Type 대신 제네릭을 사용하여 오류를 사전에 방지하세요!