티스토리 뷰
Java5부터 버그를 줄이고 유형에 대한 추가 추상화 계층을 추가하기 위해 도입되었습니다.
Generic의 필요성
Integer를 넣었으니 당연히 Integer Type을 반환하지 않을까? 하지만
IDE에서 미리 언질을 줍니다.
## 아마 IDE에 "어떤 환경 구성"에서 프로그램을 작성하는지 설정을 해줘야 할 듯합니다. ##
Object Type을 제공하는데 Integer Type이 필요하다고 말합니다.
명시적으로 캐스팅하여 해결을 할수는 있지만
안전한 방법은 아닙니다. 해당 List는 Object Type을 넣을 수 있기 때문에
작성자가 Integer Type을 넣을 것이라는 보장이 없습니다.
☠️Runtime 시점에 에러를 발견하는 경우가 생길 수 있습니다.
작성자가 특정 유형을 사용하려는 의도를 표현할 수 있고 컴파일러가 의도를 보장해주면 좋을 것 같습니다.
이러한 이유에서 Generic이 필요합니다.
Type을 포함하는 <>(다이아몬드 연산자)를 추가하여
Type의 범위를 좁혀줍니다.
앞으로 조금 더 견고한 프로그램을 작성할 수 있게 됩니다.
Generic Method
1. 제네릭 메서드는 메서드 선언의 반환 형식 앞에 형식 매개변수를 감싼 다이아몬드 연산자가 있습니다.
2. 제네릭 메서드의 본문은 일반 메서드와 동일합니다.
3. 다이아몬드 연산 자안에 , (쉼표)로 구분하여 여러 형식의 매개변수를 지정할 수 있습니다.
<T> List <T> <- 반환 형식 앞에 형식 매개변수를 감싼 다이아몬드 연산자가 있습니다.
<T, G> <- ', '(쉼표)로 구분하여 여러 형식의 매개변수가 지정되었습니다.
Bounded Generic (제한된 타입 매개변수)
허용하는 매개변수 유형을 제한하는 것을 의미합니다.
extends 키워드를 사용하여 상한 제한(Upper-bounded)을 설정할 타입을 명시하면 됩니다.
혹은 super 키워드를 사용하여 하한 제한(Lower-bounded)을 설정할 수도 있습니다.
Method
Multiple Bound
나열된 모든 타입 매개변수의 서브타입입니다.
만약 제한된 타입들 중class가 포함되어있다면 제일 첫 번째 요소여야 합니다.
그렇지 않다면 컴파일 에러가 날 것이지만 자바버전에 따라 상이할 수 있습니다.
Class
Wild Card With Generics
WildCard(?)는 알 수 없는 유형을 표현합니다...
'Object'는 모든 클래스의 상위 유형입니다.
그러나 List <Object>는 List <Integer>의 상위 유형이 될 수 없습니다.
가능 : 'Object' > 'Integer'
불가능 : 'List <Object>' > 'List <Integer>'
작성자의 의도는 Dog의 하위 유형을 포함하는 List를 받아
으르렁()이라는 Dog 클래스의 으르렁 method을 호출하는 것입니다.
List <Integer>가 List <Object>의 하위 유형이 아니듯 IDE에서 경고를 합니다.
부가적인 설명: 치와와 class는 Dog class를 확장합니다.
WildCard keyword를 사용합니다.
List <Dog>를 extends Dog>로 변경합니다.
이제 으르렁 AllDogs method는 Dog 및 Dog의 모든 하위 유형에서 사용이 가능합니다.
Type Erasure
컴파일 타임 때만 타입에 대한 제약조건을 걸고 런타임에는 타입에 대한 정보를 소거하는 것입니다.
generic 적용 이전 코드와의 하위 호환성 관점에서 필요한 과정이라고 합니다.
1. 모든 유 형매 게 변수를 제한시킨 타입을 변형하거나 제한되지 않은 경우 Object로 변경 따라서 생성된
바이트코드에는 일반 클래스, 인터페이스 메서드만 표현됩니다.
유 형매 게 변수가 bound 되지 않은 경우에는 Object로 변경됩니다.
2. 런타임 시점에도 안전성을 유지하고 싶다면 타입 캐스팅 구문을 추가합니다.
3. 확장된 제네릭 형식에서 다형성 유지를 위해 브리지 메서드를 추가합니다.
컴파일 시 생겨나는 코드이기 때문에 스택트레이스에 나오면 당황할 수 있습니다.
1. bounded 상황
컴파일 전
Java 컴파일러는 아래와 같이 모두 T -> Number로 바꾼 코드에 대하여
바이트코드를 만들게 됩니다.
컴파일 후
2. bridge method 상황
컴파일 전
컴파일 후
소스코드에서는 경고가 나오지만 JVM에서는 올바르게 실행됩니다.
ng.getT() -> Object getT() -> Integer getT() 순으로 호출이 됩니다.
'Java & Kotlin' 카테고리의 다른 글
Java Collection Framework (0) | 2022.12.14 |
---|---|
Java raw type (0) | 2022.12.12 |
Java NIO (0) | 2022.12.11 |
Java Buffer (0) | 2022.12.11 |
Java Stream (0) | 2022.12.10 |
- Total
- Today
- Yesterday
- jvm
- springboot
- 자사서비스
- jdk11
- java8
- 백엔드
- jre8
- JDK
- 스택
- boot
- 자바
- 문제
- 스타트업
- jre11
- mappedby
- 알고리즘
- 백준 제로 자바
- 백준 제로
- boot 일대다
- jre
- 개발자채용
- 프로그래머
- Spring
- 다대일
- 백준
- JDK8
- 관계설정
- 코딩테스트
- JPA
- ㅃ
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |