1. 지네릭스
:다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입 체크를 해주는 기능이다. 객체의 타입을 컴파일 시에 체크하기 때문에 객체의 타입 안정성을 높이고 형 변환의 번거로움이 줄어든다.
예를들어 ArrayList와같은 컬렉션 클래스는 다양한 종류의 객체를 담을 수 있긴 하지만 보통 한 종류의 객체를 담는 경우가 더 많다. 그런데 꺼낼 때 마다 타입 체크를 하고 형 변환을 하는 것은 너무 번거롭기 때문에 이러한 문제를 지네릭스가 해결해준다.
장점
1. 타입 안정성 제공
2. 타입 체크와 형 변환 생략, 코드 간결
class Box {
Object items;
void setItem(Object item) { this.item = item; }
Object getItem() { return item; }
}
이 코드를 지네릭 클래스로 변경하면 다음과 같다.
class Box<T> {
T items;
void setItem(T item) { this.item = item; }
T getItem() { return item; }
}
여기서 T는 타입변수 라고 하며 타입변수가 여러개인 경우 콤마로 구분한다.
Box는 원시타입이라 한다.
Box<String> Box<Integer> 는 지네릭 클래스에 서로 다른 타입을 대입하여 호출한 것일 뿐, 이 둘이 별개의 클래스를 의미하진 않는다.
단, 지네릭 클래스 Box의 객체를 생성할 떄, 객체별로 다른 타입을 지정하는것은 괜찮지만, static멤버에 타입변수 T를 사용할 수 없다. (T는 인스턴스변수로 간주된다.) 왜냐하면 static멤버는 타입 변수에 지정된 타입이 동일한 것이어야 하기 떄문이다. 그리고 지네릭타입의 배열을 생성하는 것 역시 허용되지 않는다. 이는 new연산자 떄문인데 이 연산자는 컴파일 시점 타입 T가 뭔지 정확히 알아야 하지만, Box<T> 클래스 같은 경우 컴파일 하는 시점에서 T가 어떤 타입이 될지 전혀 알 수 없기 때문이다. (insteadof도 마찬가지)
해결방법은 'Reflectino API'의 newInstance()와 같이 동적으로 객체를 생성하는 메서드로 배열 생성 or Object배열 생성해서 복사한 다음 T[]로 형번환
지네릭 타입 문자를 제한하기 위해선
ex) class FruitBox<T extends Fruit>
과 같이 extends 사용~
와일드카드
https://mangkyu.tistory.com/241
[Java] 제네릭과 와일드카드 타입에 대해 쉽고 완벽하게 이해하기(공변과 불공변, 상한 타입과 하
이번에는 공변과 불공변에 대해서 먼저 알아보고, 이후에 제네릭과 와일드카드에 대해 알아보도록 하겠습니다. 많은 분들이 어려워하는 제네릭인 만큼 쉽게 풀어서 설명하려고 노력했는데, 많
mangkyu.tistory.com
제네릭 클래스의 객체를 메소드의 매개변수로 받을 때, 그 객체의 타입 변수를 제한하는 것을 말한다.
<? extends T > 와일드카드의 상한 제한. T와 그 자손들만 가능
<? super T > 와일드 카드의 하한 제한. T와 그 조상들만 가능
<?> 제한 없이 모든 타입 가능 == <? extends Object>
지네릭 메서드
메서드 선언부에 지네릭 타입이 선언된 메서드
ex) static <T> void sort (List<T> List, Comparator<? super T> c)
static Juice makeJuice(FruitBox<? extends Fruit> box) {
String tmp = "";
for ( Fruit f : box.getList()) tmp += f + " ";
return new Juice(tmp);
}
//를 지네릭 메서드로 바꾸면 다음과 같다.
static <T extends Fruit> Jice makeJuice(FruitBox<T> box) {
String tmp = "";
for(Fruit f : box.getList()) tmp += f + " "l
return new Juice(tmp);
}
2. enums
enum 열거형 이름 { 상수명1, 상수명2, ... }
3. annotation
https://www.javatpoint.com/java-annotation
Java Annotations - javatpoint
Java annotations with custom annotation and built-in annotations in java such as @Override, @Deprecated, @SuppresssWarnings, @Target, @Retention etc.
www.javatpoint.com
메타 애너테이션
: 애너테이션을 위한 애너테이션
@Target
애너테이션이 적용 가능한 대상을 지정하는데 사용된다.
@Retention
애너테이션이 유지되는 기간을 지정하는데 사용된다.