본문 바로가기
JAVA

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

by moonstal 2022. 3. 9.

- 지네릭스: 컴파일시 타입체크를 해주는 기능

 //tv객체만 저장할 수 있는 어레이리스트

  ArrayList<Tv> tvList = new ArrayList<Tv>();

  tvList.add(new Tv());

  Tv t = tvList .get(0);

  타입체크가 강화됨 객체의 타입안정성을 높이고 형변환의 번거로움을 줄여줌

 

- 타입변수: 클래스를 작성할 때 Object타입 대신 타입변수(E)를 선언해서 사용

- 객체 생성시, 타입변수대신 실제 타입을 지정(Tv)

- 타입 변수 대신 실제 타입이 지정되면, 형변환 생략가능

- Box<T> 지네릴클래스 

  T 타입변수 타입매개변수

  Box 원시타입

- 지네릭타입과 다형성

  참조변수와 생성자의 대입타입 일치

  지네릭 클래스간 다형성 성립

  매개변수의 다형성 성립

 

- Iterator<E>:클래스 작성할 때 오브젝트타입 대신 T와 같은 타입변수를 사용

- HashMAp<K,V>:여러개의 타입변수가 필요한 경우 콤마를 구분자로 선언

- 제한된 지네릭 클래스: extends로 대입할 수 있는 타입을 제한

  class FruitBox<T extends Fruit>{}  인터페이스인 경우에도 extends를 사용

 

- 지네릭스의 제약 :

  타입변수에 대입은 인스턴스 별로 다르게 가능

  static멤버에 타입 변수 사용불가

  배열 생성할 때 타입변수 사용불가. 타입변수로 배열 선언은 가능

  T[] tmpArr = new T[itemArr.length]; 불가  /  T[] itemArr; 가능

 

- 와일드 카드<?>

  하나의 참조 변수로 대입된 타입이 다른 객체를 참조가능

  ArrayList<? extends Product> list = new ArrayList<Tv/Audio>(); Product와 자손들만 가능

  메서드의 매개변수에 와일드 카드를 사용

 

- 지네릭 메서드

  지네릭 타입이 선언된 메서드(타입변수는 메서드 내에서만 유효)

  클래스 타입 매개변수 <T>와 메서드 타입 매개변수 <t>는 별개

  static <t> void sort(List<t> list,Comparator<? super t> c)

  메서드를 호출할 때마다 타입을 대입해야 (대부분 생략가능)

  메서드를 호출할 때 타입을 생략하지 않을 때는 클래스 이름 생략불가

 

- 지네릭 타입의 형변환

  지네릭 타입과 원시타입 간의 형변환은 바람직 하지 않다.

  와일드 카드가 사용된 지네릭 타입으로는 형변환 가능

 

- 지네릭 타입의 제거

  컴파일러는 지네릭 타입을 제거하고, 필요한 곳에 형변환을 넣는다.

 

- 열거형(enum)

  관련된 상수들을 같이 묶어 놓은것

  enum Direction{EAST,SOUTH,WEST,NORTH}

  열거형 상수의 비교에 ==와 compareTo() 사용가능

 

- 열거형에 멤버 추가

  불연속적인 열거형 상수의 경우 원하는 값을 괄호()안에 적는다

  괄호를 사용하려면 인스턴스 변수와 생성자를 새로 추가해줘야한다

  열거형의 생성자는 묵시적으로 private이므로, 외부에서 객체생성 불가

 

- 애너테이션

  주석처럼 프로그래밍 언어에 영향을 미치지 않으며 유용한 정보를 제공

  @Override 오버라이딩을 올바르게 했는지 컴파일러가 체크 (메서드 이름 잘못적는 실수 방지)

  @Deprecated 앞으로 사용하지 않을 것을 권장

  @FuntionalInterface 함수형 인터페이스에는 하나의 추상메서드만 가져야한다는 제약 있음 컴파일러체크

 

- 메타 애너테이션: 애너테이션을 만들때 사용

  @Target 적용대상 지정에 사용

 

- 애너테이션 요소 규칙

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

  괄호()안에 매개변수 선언 불가

  예외선언불가

  요소를 타입매개변수<T>로 정의 불가

'JAVA' 카테고리의 다른 글

람다와 스트림  (0) 2022.03.10
쓰레드  (0) 2022.03.10
컬렉션 프레임웍  (0) 2022.03.08
날짜와 시간 & 형식화  (0) 2022.03.08
java.lang패키지와 유용한 클래스  (0) 2022.03.08