[java] 제네릭 타입의 형변환과 타입 안전성(Type Safety)

제네릭(Generics)은 자바에서 컬렉션과 클래스 등을 설계할 때 타입을 매개변수로 사용할 수 있게 하는 프로그래밍 기법입니다. 제네릭을 사용하면 컴파일 시 타입의 안정성을 보장할 수 있고, 형변환을 할 때 발생할 수 있는 런타임 오류를 방지할 수 있습니다.

제네릭 타입 형변환

제네릭을 사용하다보면 제네릭으로 선언한 타입을 다른 타입으로 변환해야 할 때가 있습니다. 이때 우리는 형변환을 해야 하는데, 형변환을 할 때에 주의할 점이 있습니다.

List<Object> objectList = new ArrayList<>();
List<String> stringList = (List<String>) (List<?>) objectList;

위의 예시처럼, 제네릭을 사용하는 경우 우회 형변환을 사용해야 할 수 있습니다. 그러나 이런 형변환은 컴파일러가 경고를 표시할 수 있습니다. 이러한 우회 형변환이 필요한 이유는 컴파일러가 List<Object>List<String>이 다른 타입으로 인식하기 때문입니다.

형변환을 할 때에는 이러한 우회 형변환이 발생할 수 있다는 것을 명심해야 합니다.

타입 안전성(Type Safety)

제네릭은 컴파일 시에 타입 안전성을 보장합니다. 즉, 제네릭을 사용함으로써 런타임에러를 사전에 방지할 수 있습니다. 타입 안전성은 데이터의 유효성을 보장하고 프로그램의 무결성을 유지하는 데 매우 중요합니다.

List<String> stringList = new ArrayList<>();
stringList.add("Hello");
stringList.add(2021);  // 컴파일 에러 발생

위의 예시에서 stringListList<String> 타입이므로 문자열만을 요소로 추가할 수 있습니다. 만약에 숫자를 추가하려고 하면 컴파일 에러가 발생하여 타입 안전성을 보장합니다.

결론

제네릭을 사용함으로써 형변환과 타입 안전성에 대한 이점을 얻을 수 있습니다. 그러나 형변환을 할 때에는 우회 형변환이 발생할 수 있고, 타입 안전성이 보장된다 해도 항상 데이터의 유효성을 확인해야 합니다.

참고 문헌: The Java™ Tutorials - Generic Types


관련 내용