JAVA/Basic

[스터디할래? Java 14]제네릭

[스터디할래? Java] 목차

이글은 백기선님 스터디 할래? 스터디를 뒤늦게 따라간 기록입니다.

스터디할래 링크 >> https://github.com/whiteship/live-study

이필기를 시작으로 공부했습니다 >>https://sujl95.tistory.com/73 ,  https://docs.oracle.com/javase/tutorial/java/generics/types.html

여기 없는내용은 스터디 할래 강의 내용 혹은 제가 java Doc보고작성하거나 예제를 만들어 추가했습니다.

그외는 같이 출처가 써있습니다. 

제네릭 data type을 클래스, 메소드에서 내부 데이터 타입을 제네릭으로 지정,
"컴파일과정에서 문제제거"
- jdk1.5 부터 도입 
- jdk 1.7 Diamond  <>: 타입안에 안써도됨, 타입추론
- 클래스나 메소드 내부에서 사용되는 객체의 타입을 컴파일과정에서 문제제거
- 반환값에 대한 타입변환 및 타입 검사에 들어가는 노력줄인다. 
- 타입국한 효과로 타입변환이 불필요해져 성능향상효과

A generic type is a generic class or interface that is parameterized over types. 
제네릭 타입은 타입에서 매개변수로 사용되는 클래스나 인터페이스
https://docs.oracle.com/javase/tutorial/java/generics/types.html 
제네릭 컴파일 ----- .java
        List<Integer> numbers = new ArrayList<>();
        numbers.add(3);
------.class
        List<Integer> numbers = new ArrayList();
        numbers.add(3);
컴파일할때 소거자에 대해 타입정보가 사라지는것 > 구체화타입ex) List
제네릭 사용법
제네릭 메소드 만들기
interface fruit<K,V>{                                           //클래스 
    public default K getKey() {return null;}
    public default V getValue() {return null;}
}
class Banana<K,V> implements fruit<K,V>{                // 상속시 

    public <T> boolean isBTime(List<T> list, T addvlaue) {  //메서드
        T value = list.get(0);
        V[] vArray =(V[]) new Object[2];                        // 배열 선언 
        if (value == addvlaue) return true;
        return false;
    }
}
와일드 카드 wild card 
-Unbounded WildCard
: List<?> :모든클래스
-Upper Bounded wildcard
: List<? extends Number>:특정타입자식클래스
-Lower Bounded Wildcard
: List<? super Number>: 특정타입 부모클래스


아무이름 컴파일은 문제없음 클래스, 메소드매개변수,반환값 가능

매개변수 명명 규약
E - Element (used extensively by the Java Collections Framework)
K - Key
N - Number
T - Type
V - Value
S,U,V etc. - 2nd, 3rd, 4th types
Erasure
Generics Type Erasure
List<Object> list = new ArrayList<Integer>();  >> 컴파일에러. 

메서드 수준

제네릭 특이점 - 원시타입 사용불가.
타입 파라메터 자리에 원시타입 사용안함>> 타입소거(Erasure)발생때문.. 명시안되면 Object로
>> Object클래스를 상속받으면서 하위호환성이지켜진다. >> Wrapper 클래스 사용. 

- 배열선언은 캐스팅이용
  V[] vArray =(V[]) new Object[2];            
new 연산자 동적메모리 할당영역 heap 영역에 생성한 객체 할당.
제네릭은 컴파일타임동작. Object 생성후 캐스팅하여 사용. 

- static 으로 사용불가. 
static 내부에선 제네릭사용가능
https://blog.naver.com/hsm622/222251602836
브리지 메서드 매개변수가 반환타입소거시 가끔 브리지메서드를 생성하는데 stackTrace에 가끔 나타나니 알아두기
public class A extends ArrayList<String>{
    public boolean add(String e){
        return super.add(e)
    }
}
A a = new A();
a.add("text"); 
https://rockintuna.tistory.com/102

Erasure 이레이저 삭제 말소

Conventions 규약

Unbounded  무한한

추천책 : 클라우드 네이티브 자바

 

 

리플렉션으로 볼수 있음.

 

 

  • 제네릭 사용법
  • 제네릭 주요 개념 (바운디드 타입, 와일드 카드)
  • 제네릭 메소드 만들기
  • Erasure

'JAVA > Basic' 카테고리의 다른 글

[스터디할래? Java] 목차  (0) 2021.05.17
[스터디할래? Java 15]lambda 람다  (0) 2021.05.15
[스터디할래? Java 13]I/O  (0) 2021.05.15
[스터디할래? Java 12]애노테이션  (0) 2021.05.15
[스터디할래? Java 11]enum  (0) 2021.05.15