Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

자바(Java) 타입 소거(Type Erasure)란? 개념과 동작 원리 총정리

자바는 제네릭 프로그래밍(Generic Programming)을 지원하고 더 엄격한 타입 검사를 수행하기 위해 타입 소거(Type Erasure) 메커니즘을 사용합니다. 타입 소거란 컴파일 시점에 제네릭 타입 정보를 제거하여 런타임에는 일반 클래스와 동일하게 동작하도록 만드는 과정입니다.

타입 소거의 핵심 동작 방식

  • 제네릭 타입의 모든 타입 매개변수는 바운드(bound)가 있는 경우 해당 바운드 타입으로, 바운드가 없는 경우 Object 타입으로 대체됩니다. 그 결과 바이트코드에는 클래스, 메서드, 인터페이스만 남게 됩니다.

  • 타입 안정성을 유지하기 위해 필요한 곳에 타입 캐스트(type cast)가 자동으로 삽입됩니다.

  • 확장된 제네릭 타입에서 다형성(polymorphism) 개념이 유지되도록 브리지 메서드(bridge method)가 생성됩니다.

예제 코드

import java.io.PrintStream;
import java.util.*;
public class Demo{
    public Demo(){
    }
    public static void main(String args[]){
        List my_list = new ArrayList();
        my_list.add("Hi there");
        String my_str;
        for (Iterator iter = my_list.iterator(); iter.hasNext();
            System.out.println(my_str))
        my_str = (String)iter.next();
    }
}

실행 결과

Hi there

코드 설명

위 예제에서 Demo라는 이름의 클래스에는 내부 구현이 없는 기본 생성자가 정의되어 있습니다. main 메서드 안에서는 새로운 ArrayList 객체가 생성되고, add() 함수를 사용해 문자열 요소가 리스트에 추가됩니다.

이후 iterator() 메서드로 반복자(Iterator)를 얻고, 문자열 변수 my_str을 선언합니다. for 루프의 조건식에서 hasNext() 함수가 다음 요소의 존재 여부를 확인하고, 요소가 있으면 해당 위치로 이동하여 값을 읽어옵니다. 마지막으로 결과가 화면에 출력됩니다.

참고 사항

이 예제는 로 타입(raw type)인 List를 사용하고 있으며, 컴파일러는 명시적인 타입 캐스트 없이는 안전성을 보장할 수 없기 때문에 경고를 표시할 수 있습니다. 실무에서는 List<String>처럼 제네릭 타입 매개변수를 명시하는 것이 권장됩니다. 타입 소거 덕분에 자바의 제네릭은 하위 버전과의 호환성을 유지하면서 컴파일 타임에 강력한 타입 검사를 제공할 수 있습니다.