자바의 정석

자바의 정석 12장

그zi운아이 2023. 8. 27. 17:45

이 글은 Java의 정석 3rd Edition을 읽고 정리한 내용입니다.

Chapter 12

지네릭스,열거형,애너테이션


지네릭스

1.1 지네릭스란 

다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입체크를 해주는 기능이다.

 

제네릭스의 장점

  1.타입 안전성을 제공한다.

  2. 타입체크와 형변환을 생략할 수 있으므로 코드가 간결해 진다.

 

1.2 지네릭 클래스의 선언

제네릭을 사용할땐 Object 대신 클래스 옆에 타입변수 <T>를 붙여주면 된다.

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

 

지네릭 클래스가 된 클래스의 객체를 생성할 때는 참조변수와 생성자에 탑입변수 대신 사용될 실제 타입을 지정해 줘야 된다.

Box<String> box = new Box<String> 타입변수 대신 String 지정
box.setItem(123) String 타입이 아니기 때문에 지정 불가
box.setItem("123") 정상 동작
String item = box.getItem(); 형변환이 필요없음

 

지네릭스의 용어 

Box<T> 지네릭 클래스 T의 Box 또는 T Box라고 읽는다 

T 타입변수 또는 타입 매개변수

Box 원시 타입

 

1.3 제한된 지네릭 클랫 

제네릭 타입에 extends를 사용하면 특정 타입의 자손들만 대입할 수 있게 제한할 수 있다.

clss FruitBox<T extends Fruit> { 
	ArrayList<T> list = new ArrayLsit<T>();
    
   }
   
   
   FruitBox<Apple> appleBox = new FruitBox<Apple>(); 
   FruitBox<Toy> toyBox = new FruitBox<Toy>(); //에러 Toy는 Fruit의 자손이 아님

 

1.4 와일드 카드

와일드 카드는 미정의된 타입을 나타내는데 사용됩니다. 와일드 카드는 '?'기호로 표시되며 메소드의 매개편수로 유용하게 사용 될수 있습니다. 

<? extends T> 와일드 카드의 상한 제한. T와 그 자손들만 가능
<? super T> 와일드 카드의 하한 제한, T와 그 조상들만 가능
<?> 제한 없음 모든 타입이 가능

 

1.5 지네릭 타입의 형변환

지네릭 타입과 넌지네릭 타입간의 형변환은 항상 가능하나 경고가 발생한다. 대입된 타입이 다른 지네릭 타입 간에는 형변환이 불가능 하다.

 

1.6 지네릭 타입의 제거

컴파일러는 지네릭 타입을 이용해 소스파일을 체그하고 형변환을 해준후 지네릭 타입을 제거한다.

이는 제네릭이 도입되기 전의 코드와의 호환성을 유지하기 위함이다.

 

2. 열거형

 

2.1 열거형이란 

서로 관련된 상수를 편리하게 선언하기 위한 것으로 여러 상수를 정의할 때 사용하면 유용하다 

public enum Options {
    CHECK(1),
    CALCULATE(2);


    private int value;

    Options(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }
}

 

2.2 열거형의 정의와 사용 

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

열거형을 정의하는 방법은 괄호 안에 상수의 이름을 나열하기만 하면 된다.

enum 열거형이름{ 상수1, 상수2, ...}

 

열거형은 == 비교를 통한 빠른 성능을 제공한다.

 클래스 내부에서 인스턴스 변수로 사용될떄는 클래스 내부에 여러 클래스에 사용될 경우엔 별도의 enum을 생성하여 사용하는것이 좋다.

 

2.3 열거형에 맴버 추가하기 

열거형의 상수의 값이 불연속적인 경우에는 열거형 상수의 이름 옆에 원하는 값을 함께 적어주면 된다. 

지정된 값을 저장할 수 있는 인스턴스 변수와 생성자를 새로 추가해 주어야 한다.

enum Direction {EAST(1),SOUTH(5),WEST(-1),NORTH(10);}

 

2.4 열거형의 이해 

위 enum을 클래스로 정의하면 다음과 같다.

static 상수값은 객체의 주소이고 바뀌지 않으므로 ==으로 비교가 가능하다.

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;
    }
}

 

3. 애너테이션

 

3.1 에너테이션이란?

 메타데이터를 코드에 첨부할 수 있도록 해주는 기능으로 코드의 동작에 직접적인 영향을 주진 않지만,메타데이터를 사용하여 특별한 동작을 하도록 하는 기능이다.

 

3.2 표준 에노테이션

애너테이션 설명
@Override 컴파일러에게 오버라이딩하는 메서드라는 것을 알린다.
@Deprecated 앞으로 사용하지 않을 것을 권장하는 대상에 붙인다.
@SuppressWarnings 컴파일러의 특정 경고메시지가 나타나지 않게 해준다.
@SafeVarargs 지네릭스 타입의 가변인자에 사용한다.(JDK1.7)
@FunctionalInterface 함수형 인터페이스라는 것을 알린다.(JDK1.8)
@Native native메서드에서 참조되는 상수 앞에 붙인다.(JDK1.8)
@Target* 애너테이션이 적용가능한 대상을 지정하는데 사용한다.
@Documented* 애너테이션 정보가 javadoc으로 작성된 문서에 포함되게 한다.
@Inherited* 애너테이션이 자손 클래스에 상속되도록 한다.
@Retention* 애너테이션이 유지되는 범위를 지정하는데 사용한다.
@Repetable* 애너테이션을 반복해서 적용할 수 있게 한다.(JDK1.8)

 

3.3 메타 에너테이션

에노테이션을 위한 에노테이션이다. 에노테이션에 붙이는 에너테이션으로 에너테이션을 정의할 때 애너테이션의 적용대상이나 유지기간 등을 지정하는데 사용된다.

 

@Target 

에노테이션이 적용가능한 대상을 지정하는데 사용된다.

대상 타입 의미
ANNOTATION_TYPE 애너테이션
CONSTRUCTOR 생성자
FIELD 필드 (멤버변수, enum상수)
LOCAL_VARIABLE 지역변수
METHOD 메서드
PACKAGE 패키지
PARAMETER 매개변수
TYPE 타입(클래스, 인터페이스, enum)
TYPE_PARAMETER 타입 매개변수(JDK1.8)
TYPE_USE 타입이 사용되는 모든 곳(JDK1.8)

@Relation 

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

유지정책 의미
SOURCE 소스 파일에만 존재.클래스파일에는 존재하지 않음
CLASS 클래스 파일에 존재. 실행시에 사용불가.기본값
RUNTIME  클래스 파일에 존재.실행시에 사용가능

 

@Documented

애너테이션에 대한 정보가 javadoc으로 작성한 문서에 포함되도록 한다.

 

@InHerited

애너테이션이 자사ㅗㄴ클래스에 상속되도록 한다. @InHerited 가 붙은 애너테이션을 조상 클래스에 붙이면, 자손 클래스도 이 애너테이션이 붙은 것과 같이 인식된다.

 

@Repeatable

보통은 하나의 상에 한 종류의 애너테이션을 붙이는데, @Repeatable이 붙은 애너테이션을 여러번 사용 가능하다

 

@Native

네이티브 메서드에 의해 참조되는 상수 필드에 붙이는 애너테이션이다.

 

3.4 애너테이션 타입 정의하기

새로운 애너테이션을 정의하는 방법은 인터페이스를 정의하는 것도 동일하나 @기호를 추가하면 된다.

@interface 애너테이션이름 {
	타입 요소이름 (); // 애너테이션의 요소를 선언한다.
}

 

마커 애너테이션

 

값을 지정할 필요가 없는경우 애너테이션의 요소를 하나도 지정하지 앟을 수 있다.

요소가 하나도 정의도지 않은 애너테이션을 마커 애너테이션이라고 한다.

 

애너테이션 요소의 규칙

- 요소의 타입은 기본형 String,enum 애너테이션 class만 허용된다

- ()안에 매개변수를 선언할 수 없다.

-예외를 선언할 수 없다.

- 요소를 타입 매개변수로 정의할 수 없다.

 

 

'자바의 정석' 카테고리의 다른 글

자바의 정석 16  (0) 2023.08.31
자바의 정석 13장  (0) 2023.08.28
자바의 정석 11장  (0) 2023.08.22
자바의 정석 10장  (0) 2023.08.21
자바의 정석 6장  (0) 2023.06.13