Mathlife
Mathlife의 학습 노트
Mathlife
전체 방문자
오늘
어제
  • 분류 전체보기
    • CS
      • 알고리즘
      • 자료구조
      • 운영체제
      • 네트워크
      • 데이터베이스
    • 프로그래밍 언어
      • Java
      • JavaScript
      • C·C++
      • Python
    • Backend
      • Spring
    • Frontend
      • HTML
      • CSS
    • Math
      • Linear Algebra
      • Calculus
    • AI
      • ML
      • DL
      • RL
    • Git

블로그 메뉴

  • 홈
  • 관리
  • 글쓰기
  • 태그
  • 방명록

공지사항

인기 글

태그

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Mathlife

Mathlife의 학습 노트

프로그래밍 언어/Java

제네릭

2022. 4. 14. 18:11

런타임에 벌어지는 일

1. type parameter T는 전부 Object로 바뀐다.

2. <> 전부 지워지고 Generic type과 Raw type은 서로 같아진다.

 

예시

1-1.

T[] arr = new T[10]; → 컴파일 X ( 제네릭 배열 막아놨음 )

 

1-2.

T[] arr = (T[]) new Object[10]; → OK!

 

(런타임)

Object[] arr = (Object[]) new Object[10] ▶ Object[] 객체를 Object[] 로 downcast ▶ OK!

 

2-1.

LinkedList<T>[] arr = new LinkedList<T>[10]; → 컴파일 X ( 제네릭 배열 막아놨음 )

 

2-2.

LinkedList<T>[] arr = (LinkedList<T>[])new Object[10]; → 런타임 X ( ClassCastException )

 

(런타임)

LinkedList[] arr = (LinkedList[]) new Object[10] ▶ Object[] 객체를 LinkedList[] 로 downcast ▶ ClassCastException

 

2-3.

LinkedList<T> [] arr = (LinkedList<T>[]) new LinkedList[10]; → OK!

 

(런타임)

LinkedList[] arr = (LinkedList[]) new LinkedList[10] ▶ LinkedList[] 객체를 LinkedList[] 로 downcast ▶ OK!

 

결론

제네릭은 컴파일 이전에 타입 안정성을 보장하는 기능만을 제공한다.

컴파일이 끝나면 모든 코드가 그냥 구버전(raw type version)과 같아진다.

 

참고

https://stackoverflow.com/questions/1206028/java-raw-type-and-generics-interaction

'프로그래밍 언어 > Java' 카테고리의 다른 글

클래스 클래스  (0) 2022.05.31
인텔리제이 단축키  (0) 2022.05.31
음수 정수의 비트 표현  (0) 2022.04.13
Iterable & Iterator  (0) 2022.04.11
모듈과 패키지  (0) 2022.04.10
    '프로그래밍 언어/Java' 카테고리의 다른 글
    • 클래스 클래스
    • 인텔리제이 단축키
    • 음수 정수의 비트 표현
    • Iterable & Iterator
    Mathlife
    Mathlife

    티스토리툴바