YOUNGJIN

자바의 정석 12장 ( Generics, 열거형, Annotation ) 본문

Study/Java

자바의 정석 12장 ( Generics, 열거형, Annotation )

Youngjin Noh 2023. 1. 15. 16:33

Generics: 객체의 타입을 컴파일 시에 체크하게 해주는 기능

class Box<T>{
    T item;
    void setItem(T item){ this.item=item; };
    T getItem(){ return item; }
}

Box<String> b=new Box<>();

모든 객체에 대해 동일하게 동작해야하는 static 멤버에 타입 변수 T를 사용할 수 없다. 또한 Generic 배열 타입의 객체 생성도 불가능.

 

제한된 Generic 클래스

class FruitBox<T extends Fruit>{
}

 

와일드카드: 와일드카드란, 제네릭 클래스의 객체를 메소드의 매개변수로 받을 때, 그 객체의 타입 변수를 제한하는 것

<? extends T> : 와일드 카드의 상한 제한. T와 그 자손들만 가능

<? super T> : 와일드 카드의 하한 제한. T와 그 조상들만 가능

<?> : 제한 없음. 모든 타입이 가능. <? extends Object>와 동일

static Juice makeJuice(FruitBox<? extends Fruit> box){
    String tmp="";
    for(Fruit f:box.getList())
    	tmp+=f+" ";
    return new Juice(tmp);
}

 

Generic 메서드

static <T> void sort(List<T> list, Comparator<? super T> c){
}

<Fruit>sort(..., ...);

제네릭 클래스에 정의된 타입 매개변수와 제네릭 메서드에 정의된 타입 매개변수는 전혀 별개의 것이다.

 

 

열거형

enum Direction {EAST, SOUTH, WEST, NORTH}
dir=Direction.EAST;

모든 열거형의 조상은 java.lang.Enum

 

사실 열거형 상수 Direction.EAST, Direction.SOUTH, Direction.WEST, Direction.NORTH 하나하나가 Direction객체이다.

예를 들면

class Direction{
    static final Direction EAST = new Direction("EAST");
    static final Direction SOUTH = new Direction("SOUTH");
    static final Direction WEST = new Direction("WEST");
    static final Direction NORTH = new Direction("NORTH");
    
    private String name;
    
    private Direction(String name){
    	this.name=name;
    }
}

와 같이 정의되 있을 것이다.

 

 

Annotation

소스코드에 추가해서 사용할 수 있는 메타 데이터의 일종이다. 메타 데이터란 애플리케이션이 처리해야할 데이터가 아니라 컴파일 과정과 실행 과정에서 코드를 어떻게 처리해야하는지를 알려주기 위한 추가 정보다.

 

Annotation을 이용하면 다음을 할 수 있다.- 컴파일러에게 코드 작성 문법 에러를 체크하도록 정보 제공- 소프트웨어 개발 환경이 빌드나 배포시 코드를 자동으로 생성할 수 있도록 정보 제공- 런타임에 특정 기능을 실행하도록 정보를 제공

 

Comments