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 - [제네릭을 사용하는 경우와 기본 데이터 타입을 사용하는 경우] #86

Open
skagmltn7 opened this issue Oct 9, 2023 · 1 comment
Assignees

Comments

@skagmltn7
Copy link
Collaborator

문제

제네릭을 사용하는 경우와 기본 데이터 타입을 사용하는 경우의 런타임 동작의 차이는 무엇인가요? 또, 가비지 컬렉션은 어떻게 제네릭과 기본 데이터 타입을 다루는데 영향을 미칠까요?

contents - 세부 내용

책에보면 가비지 컬렉터때문에 컨테이너를 구별해야한다고 하는데 가비지 컬렉터가 어떻게 제네릭을 분간하고 어떤 식으로 작동하는지 궁금합니다!

참고

책 p647

@DeveloperYard DeveloperYard self-assigned this Oct 11, 2023
@DeveloperYard
Copy link
Collaborator

DeveloperYard commented Oct 11, 2023

제네릭을 사용하는 경우와 기본 데이터 타입을 사용하는 경우의 런타임 동작 차이

  1. 컴파일 타입 체크
    1. 제네릭을 사용할 경우, 컴파일러는 타입 안전성을 검사해 잘못된 타입이 사용되는 것을 방지한다. 이에 따라 런타임에 타입 관련 오류가 발생할 가능성이 줄어든다.
    2. 기본 데이터 타입을 사용하는 경우, 컴파일러는 덜 엄격하게 타입을 검사하므로 런타임에 잘못된 타입 변환 오류가 발생할 수 있다.
  2. 타입 소거
    1. 제네릭의 경우 명시적인 형 변환이 필요하며, 컴파일 되면 컴파일러가 타입에 대한 정보를 소거하고, 컴파일된 바이트 코드에는 제네릭 타입에 대한 특정 정보가 없게 된다.
    2. 기본 데이터 타입은 런타임에서도 그 타입이 그대로 유지된다.
  3. 형 변환
    1. 제네릭을 사용하는 경우 형 변환이 자동으로 이뤄진다. 이는 타입 안전성을 제공하며 런타임에서 오류를 방지한다.
    2. 기본 데이터 타입을 사용하는 경우 명시적인 형 변환이 필요할 수 있으며, 이로 인해 런타임 오류가 발생 가능하다.
  4. 런타임 오류
    1. 제네릭을 사용하면 런타임 오류가 줄어들고, 런타임 예외 발생 가능성이 낮아진다.
    2. 기본 데이터 타입을 사용하는 경우, 잘못된 형 변환 및 타입 불일치로 인한 런타임 오류 가능성이 높아질 수 있다.

가비지 컬렉터 관련

런타임 시에는 제네릭의 타입이 뭔지 알 수 없기 때문에 가비지 컬렉션이 어떻게 진행되나 궁금해서 많이 검색해봤으나, 관련 자료가 나오지 않았습니다.

다음은 일반적인 가비지 컬렉션 과정입니다.

  1. 루트 참조: 가비지 컬렉터는 루트(주로 실행 스레드의 로컬 변수, 정적 변수, 레지스터 등)에서부터 시작하여 객체 참조를 추적한다. 루트 참조에서 시작하지 않는 객체는 가비지로 간주된다.
  2. 참조 체인 탐색: 가비지 컬렉터는 루트로부터 시작해서 객체 간의 참조 체인을 탐색한다. 이 과정에서 더 이상 참조되지 않는 객체를 식별한다.
  3. 참조 계수: 일부 가비지 컬렉션 알고리즘은 참조 계수를 사용하여 객체가 더 이상 참조되지 않는지 확인한다. 객체의 참조 계수가 0이면 해당 객체는 가비지로 간주된다.
  4. 순환 참조: 가비지 컬렉터는 순환 참조를 처리하기 위한 알고리즘을 사용하여 순환 참조를 가진 객체 그룹을 식별하고 수집한다.

@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

3 participants