Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 생각
- es5
- 나만재밌는이야기
- 스프링구성
- a-d
- 영속성컨텍스트
- 모던자바인액션
- 다시보기연습
- JPA
- 일빵빵알파벳파닉스
- 동작파라미터화
- 람다
- spring5receipe
- gulp
- 메서드참조
- 발음공부
- 클린코드
- 스프링5레시피
- 일급함수
- 엔티티매핑
- 영속성
- 잡담
- 달리기를말할때내가하고싶은이야기
- ES6
- Java8
- 1월의독서
- 제대로알기
- 객체지향생활체조원칙
- 프레디케이트
- spring configuration
Archives
- Today
- Total
notepad
Generics - 제네릭 사용 이유 본문
Lesson: Generics (Updated) (The Java™ Tutorials > Learning the Java Language)
Java Java의 Generics. Java 언어에서 언어적으로 가장 이해하기 어렵고 제대로 사용하기가… | by Leopold (백중원) | Medium
Generics
- 클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법
- 클래스, 인터페이스, 메서드를 정의할 때 유형이 매개 변수가 되도록 한다.
- 일반 변수와 구분하기 위해 대분자 1자리 변수를 사용한다 T, S, etc
사용 이유
- 컴파일 타임에 유형 검사 -> 안정성 추가
- 불필요한 타입 캐스팅 제거
- 코드 재사용 가능
컨벤션
The most commonly used type parameter names are:
- 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
바운드 타입 매개변수 > 특정 타입으로 제한한다 | 특정 타입의 서브타입으로만 유형 제한
- class
Pair {} - Number타입만 올 수 있도록 범위 제한 - class <T extends A & B & C> Pair{} - Multiple Bounds , 클래스 하나와 인터페이스 여러개 선언 가능
interface A {...} interface B {...} class C {...} class D <T extends C & B & A> {...} // Class 가 앞에 와야한다. 인터페이스가 먼저 오면 컴파일 오류 // call D<AB> d = new D<>();
- 제너릭 타입으로 받은 매개변수로 큰 값 비교와 같은 로직 구현 시 ‘>’ 와 같은 연산자를 사용할 경우 컴파일 오류가 발생한다. -> 연산자는 int, double, char 과 같은 기본 유형에만 적용되기 때문이다.
- Comparable
인터페이스로 제한되는 형식 매개변수를 사용하여 구현한다. public static <T extends Comparable<T>> int countGreaterThan(T[] anArray, T elem) { int count = 0; for (T t : anArray) { if (t.compareTo(elem) > 0) ++count; } return count; }
와일드카드
- 상한/하한/무제한 와일드카드
- List <? extends T> : 데이터 타입을 자신과 자식으로 제한
- List <? super T>: 데이터 타입을 자신과 부모 객체만 허용
- List <?> : 자기 자신의 타입만 허용
upper, lower 와일드카드 사용 지침
사용 예제
class | interface
public class Pair<K, V> {
private K key;
private V value;
public Pair(K key, V value) {
this.key = key;
this.value = value;
}
public void setKey(K key) { this.key = key; }
public void setValue(V value) { this.value = value; }
public K getKey() { return key; }
public V getValue() { return value; }
}
method
public class Util {
public static <K, V> boolean compare(Pair<K, V> p1, Pair<K, V> p2) {
return p1.getKey().equals(p2.getKey()) &&
p1.getValue().equals(p2.getValue());
}
}
//call
Pair<Integer, String> p1 = new Pair<>(1, "apple");
Pair<Integer, String> p2 = new Pair<>(2, "pear");
boolean same = Util.compare(p1, p2);
'JAVA > JAVA' 카테고리의 다른 글
[레시피2] 스프링코어 - POJO와 IOC컨테이너를 다루는 기술 (0) | 2021.03.10 |
---|---|
리플렉션 (0) | 2020.09.04 |
JVM 이해하기 (0) | 2020.09.01 |