본문 바로가기
카테고리 없음

[22-12-01]Java의 정석2 - 12 지네릭스, 열거형, 애너테이션

by 까다로운오리 2022. 12. 1.

 

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

애너테이션이 유지되는 기간을 지정하는데 사용된다.