[JAVA]

23. 지네릭, 열거형

혜리노베이션 2023. 6. 2. 19:44

1. 지네릭스(Generics)


- 컴파일시 타입을 체크해 주는 기능
- 객체의 타입 안정성을 높이고 형변환의 번거러옴을 줄여줌

 


2. 타입변수


- 클래스 작성할 때 Object타입 대신 변수를 선언해서 사용 *일반클래스 -> 지네릭클래스
- 객체 생성 시 타입 변수 대신 실제 타입을 제정하여 대입
- 타입 변수 대신 실제 타입이 지정되면, 형변환 생략 가능


3. 지네릭스 용어

- Box<T>: 지네릭 클래스. T의 Box 또는 T Box라고 읽는다
- T: 타입변수 또는 타입 매개변수
- Box: 원시타입 (raw type) *일반클래스



4. 지네릭 타입과 다형성

- 참조변수와 생성자의 대입된 타입은 일치해야 한다.
  * ArrayList<Tv> list = new ArrayList<Tv>(); => 일치
- 지네릭 클래스 간 다형성은 성립
  * List<Tv> list = new ArrayList<Tv>(); => 다형성, ArrayList가 List를 구현
- 매개변수의 다형성도 성립
  * 부무와 그 자손 객체 가능

 



5. Iterator<E>

- 클래스를 작성할 때 Object타입 대신 T와 같은 타입 변수를 사용

6. HashMap<K, V>

- 여러 개의 타입 변수가 필요한 경우 콤마로 구분자를 선언



7. 제한된 지네릭 클래스

- extends로 대입할 수 있는 타입을 제한
- 인터페이스인 경우에도 extends를 사용
- 타입 변수에 대입은 인스턴스 별로 다르게 가능
  * static멤버에 타입 변수 사용 불가
- 배열 생설할 때 타입 변수 사용불가, 타입 변수로 배열 선언은 가능

 


8. 와일드 카드

- 하나의 참조 변수로 대입된 타입이 다른 객체를 참조 가능
- <? extends T> 와일드 카드의 상한 제한, T와 그 자손들만 가능
- <? super T> 와일드 카드의 하한 제한, T와 그 조상등만 가능
- <?> 제한 없음. 모든 타입이 가능 <? extends Object>와 동일
- 메서드의 매개변수에 와일드 카드를 사용
  * (FruitBaox<? extends Fruit> box): FruitBox에 그와 그 자손들이 다 가능

 


9. 지네릭 메서드

- 지네릭 타입이 선언된 메서드(타입 변수는 메서드 내에서만 유효)
- 클래스의 타입 매개변수<T>와 메서드의 타입 매개변수 <T>는 별개
- 메서드를 호출할 때마다 타입을 대입해야 함 *대부분 생략 가능
- 메서드를 호출할 때 타입을 생략하지 않을 때는 클래스 이름 생략 불가

 


10. 지네릭 타입의 형변환

- 지네릭 타입과 원시 타입 건 형변환은 바람직 하지 않다 * 경고 발생
 * objBox = (Box<object>)box; // 원시 -> 지네릭
- 와일드 카드가 사용된 지네릭 타입으로는 형변환 가능

 


11. 지네릭 타입의 제거

- 컴파일러는 지네릭 타입을 제거하고, 필요한 곳에 형변환을 넣는다.
  1) 지네릭 타입의 경계를 제거
  2) 지네릭 타입 제거 후에 타입이 불일치하면 형변환을 추가
  3) 와일드 카드가 포함된 경우, 적절한 타입으로 형변환 추가

 


12. 열거형

- 관련된 상수들을 같이 묶어 놓은 것, Java는 타입에 안전한 열거형을 제공
  enum kind { A, B, B, D} // 열거형 kind 정의
  enum value { A, B, C} // 열거형 value를 정의
- 열거형 상수의 비교에 ==와 compareTo()사용가능

13. 열거형에 멤버 추가하기

- 불연속적인 열거형 상수의 경우, 원하는 값을 괄호()안에 적는다
- 괄호를 사용하려면 인스턴스 변수와 생성자를 새로 추가해줘야 함
- 열거형 생성자는 묵시적으로 private이므로, 외부에서 객체생성 불가
  *  Direction d = new Direction(1); // 에러 열거형 생성자는 외부에서 호출X