- 지네릭스: 컴파일시 타입체크를 해주는 기능
//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 |