Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

6 Weeks - [Generic Type Erasure란?] #91

Open
leetaggg opened this issue Oct 10, 2023 · 2 comments
Open

6 Weeks - [Generic Type Erasure란?] #91

leetaggg opened this issue Oct 10, 2023 · 2 comments

Comments

@leetaggg
Copy link
Member

문제

이전에 예준님이 잠깐 설명하셨는데, 정확하게 과정을 이해하지 못하였습니다.
Type Erasure가 사용되는 이유와 과정에 대해 알려주시면 감사하겠습니다!

contents - 세부 내용

참고

@junhochoi-dev
Copy link
Member

junhochoi-dev commented Oct 11, 2023

Type Erasure

제네릭(Generic) 타입에 사용된 타입 정보를 컴파일 타임에만 사용하고 런타임에는 소거하는 것을 말합니다.

Type Erasure 규칙

  • 모든 타입 파라미터를 그들의 바운드나 Object 타입으로 교체한다.
  • 제네릭 타입을 제거한 후 타입이 일치하지 않으면 타입 캐스팅을 추가한다
  • 확장된(extended) 제네릭 타입의 다형성을 보존하기 위해 브릿지 메서드를 생성한다

Type Erasure 사용

하위 호환성

Generics은 Java에서 JDK 5에서 도입되었습니다. 이전에 작성된 많은 코드들이 이미 존재했고, 그런 코드들과의 호환성을 유지하기 위해 Type Erasure 방식이 도입되었습니다. Generics를 지원하지 않는 구형 코드와 Generics를 사용하는 신규 코드 간에 문제 없이 상호 운용할 수 있게 되었습니다.

메모리 오버헤드 방지

타입 소거로 컴파일된 클래스는 실제로는 제네릭 타입의 정보를 가지지 않습니다. 컴파일 시에 타입 매개변수가 제거되고, 원시 타입으로 변환하여 이러한 타입 소거로 인해 컴파일된 클래스 파일에는 제네릭 타입 정보에 대한 메타데이터가 포함되지 않습니다. 따라서 런타임 시에는 타입에 대한 정보가 존재하지 않아 Type Erasure 방식으로 인해 JVM은 실행 시점(Runtime)에 추가적인 오버헤드 없이 일반 클래스처럼 작동합니다.

Type Erasure 과정

제네릭 클래스

class Sample<T> {
	T something;
	...
}

// 런타임

class Sample {
	Object something;
	...
}

extends를 통해 타입에 상한 제한

public static <T> void sample(T something) {
	...
}

// 런타임

public static void sample(Object something) {
	...
}

제네릭 메소드

class Sample<T extends Number> {
	T something;
	...
}

// 런타임

class Sample {
	Number something;
	...
}

extends를 통해 타입에 상한 제한

public static <T extends Number> void sample(T something) {
	...
}

// 런타임

public static void sample(Number something) {
	...
}

@dpwns523
Copy link
Collaborator

dpwns523 commented Oct 11, 2023

    public static List<String> a(List<String> in) {
        return new LinkedList<>();
    }
    public static List<Integer> a(List<Integer> in) {
        return new LinkedList<>();
    }

@devjy39 devjy39 closed this as completed Oct 11, 2023
@devjy39 devjy39 reopened this Dec 26, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants