읽은 책 정리/자바의정석 3판

[Java] Chapter12 지네릭스,열거형,애너테이션

포포015 2021. 3. 30. 17:31

1. 지네릭스란?

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

(컴파일시 체크하기에, 객체의 타입 안정성을 높이고 형변환의 번거로움이 줄어든다)

꺼낼때 마다, 타입체크를 하고 형변환을 하는것을 불편할수밖에없다. 게다가 원하지 않는 종류의 객체가 포함되는것을 막을방법이 없다. 이러한걸 제네릭스가 해결해줌.

 

1.2 지네릭클래스의 선언

- 지네릭 타입은 클래스와 메서드에 선언가능.

(아래와 같이 클래스 옆에 <T> 을 붙이면됨. //<T>는 타입변수라 하며, T가 아닌 다른것도 사용 가능.

 타입변수가 여러개인경우 Map<K,V>와 같이 콤마 ' , ' 로 구분자로 나열하면된다. 

1
2
3
class Box<T>{
    T item;
}
cs

 

지네릭스의 용어

1
2
3
4
class Box<T>
Box<T> -> 지네릭 클래스. T Box라 읽음
T      -> 타입변수 또는, 타입매개변수
Box    -> 원시타입
cs

 

지네릭스의 제한

- Box의 객체를 생성할때, 객체별로 다른타입을 지정하는것은 적절하다.

1) 모든 객체에 대해 동일하게 동작해야하는 static멤버에 타입변수 T는 사용불가.

  ( T는 인스턴스 변수로 간주됨. !! static멤버는 인스턴스 멤버를 참조할수없다)

2) 지네릭 타입의 배열 생성도 X (지네릭 배열타입의 참조변수를 선언은가능 

                                           하지만 new T[10]과 같이 배열을 생성하는것은 불가)

  - 2번의 이유는 new 연산자가 사용되기 때문, 이연산자는 컴파일 시점에 타입 T가 무엇인지 알아야하는데,

    정의된 클래스를 컴파일하는 시점에서는 T가 어떤타입이 될지 알수없어서 X (instanceOf 연산자도 동일한이유로 X)

 

 

1.3 지네릭 클래스의 객체 생성과 사용

- Box<T>의 객체에는 한가지종류. 즉 T타입의 객체만 저장가능하다.

 참조변수와, 생성자에 대입된 타입(매개변수화된 타입이 일치해야함)

1
2
Box<Apple> apple = new Box<Grape>; //에러
 
cs

단, 두 지네릭클래스의 타입이 상속관계에 있고, 대입된 타입이 같은것은 괜찮음.

1
Box<Apple> apple = new FruitBox<Apple>; // O 다형성
cs

JDK 1.7부터 추정이 가능한경우 객체 생성 하는부분에서 타입을 생략가능

1
Box<Apple> apple = new Box<>; // 1.7부터 타입생략가능
cs

-> 원래는 대입된 타입과 다른 타입의 객체는 추가 X

그러나 타입 T가 조상타입이고, 그를 상속받는 자손 클래스타입은 매개변수로 들어올수 있다. (조상, 자손 상속관계)

1
2
3
Box<Fruit> fruitBox = new Box<Fruit>();
fruitBox.add(new Fruit()); //ok
fruitBox.add(new Aplle()); //ok 
cs

 

1.4 제한된 지네릭 클래스

- 타입문자로 사용할타입을 명시하면, 한종류의 타입만 저장할수 있도록 제한가능하지만

 매개변수 T에 지정할수 있는 타입의 종류를 제한하는방법 ...

-> 지네릭 타입에 'extends' 를 사용하면, 특정타입의 자손들만 대입할수 있게 제한가능.

1
2
3
class FruitBox<T extends Fruit> { //Fruit의 자손만 타입으로 지정가능
 
}
cs

여전히 한종류의 타입만 담을수 있지만, Fruit클래스의 자손들만 담을수 있다는 제한이 더추가된것.

만일 클래스가 아니라, 인터페이스를 구현해야한다는 제약이 필요하다면, 이때도 'extends'키워드를 사용해야함.

 

1.5 와일드카드

- 와일드 카드는 기호 '?'로 표현하는데 ? 만으로는 Object 타입과 다를게없으므로,

 'extends' 와 'super'로 상한과 하향을 제한가능하다.

<? extends T> - 상한 제한. T와 그자손들만 가능

<? extends T> - 하한 제한. T와 그조상들만 가능

 

2. 열거형

2.1 열거형이란?

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

 

2.2 열거형의 정의와 사용

- 간단하다. 괄호안에 상수의 이름을 나열하기만 하면된다.

(열거형은 필요할때 더 공부하자....)

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

 

3. 애너테이션

3.1 애너테이션이란?

- 애너테이션이란 주석처럼 프로그래밍언어에 영향을 미치지 않으면서도,

다른 프로그램에게 유용한 정보를 제공할수 있다는 장점(스프링에서 많이쓰지..)

자신이 작성한 코드중 특정한 메서드만 테스트를 하기 원한다면

@Test라는 애너테이션을 메서드 앞에 선언하면(테스트 해야한다는것을 프로그램에게 알릴뿐 지장X)

 

3.2 표준 애너테이션

몇개 자주 보이는건 

@Override - 오버라이딩 하는 메서드를 알림

@Deprecated - 앞으로 사용하지 않을것을 권장하는 메서드에 붙임

@SuppressWarnigs - 컴파일러에게 특정 경고 메시지를 나타나지않게 할수있음.

@FunctionallInterface - 함수형 인터페이스가 잘정의되었는지 확인을 해줌

 

3.3 메타애너테이션

 애너테이션에 붙이는 애너테이션으로 애너테이션을 정의할때

 애너테이션의 적용대상이나, 유지기간을 지정하는데 사용

 

 

애너테이션, 열거형 부분은 나중에 필요할때 더공부해서 정리하도록 하겠다.