제네릭 (Generics)
- 컴파일시 타입을 체크해 주는 기능
- 객체의 타입 안정성을 높이고, 형변환의 번거로움을 줄여준다.
ArrayList<Tv> tvList = new ArrayList<Tv>();
tvList.add(new Tv()); // OK
tvList.add(new Audio()); // 컴파일 에러. Tv외에 다른 타입은 저장 불가
- 실행시에 발생하는 런타임 에러를 컴파일 타임의 컴파일에러로 바꿀 수 있다
- 여러 데이터 타입을 저장하려면 Object를 적어주면 된다.
- 대신 형변환을 해야한다.
타입 변수
- 클래스를 작성할 때, Object타입 대신 타입 변수(E)를 선언해서 사용
private transient E[] elementData;
public boolean add(E o) {}
pulbic E get(int index) {}
타입 변수에 대입하기
- 객체를 생성시, 타입 변수(E) 대신 실제 타입(Tv)을 지정(대입)
제네릭 용어
Box<T> - 제네릭 클래스. 'T의 Box' 또는 'T Box'라고 읽는다.
T - 타입 변수 또는 타입 매개변수(T는 타입 문자)
Box - 원시 타입(raw type)
iterator<E>
- 클래스를 작성할 때, Object타입 대신 T와 같은 타입 변수를 사용
HashMap<K, V>
- 여러 개의 타입 변수가 필요한 경우, 콤마(,)를 구분자로 선언
제한된 제네릭 클래스
- extends로 대입할 수 있는 타입을 제한
class FruitBox<T extends Fruit> {
// Fruit의 자손만 타입으로 지정가능
}
제네릭스의 제약
- 타입 변수에 대입은 인스턴스 별로 다르게 가능
1. static 멤버에 타입 변수 사용 불가
2. 배열 생성할 때 타입 변수 사용불가. 타입 변수로 배열 생성은 가능
와일드 카드
- 하나의 참조 변수로 대입된 타입이 다른 객체를 참조 가능
<? extends T> 와일드 카드의 상한 제한. T와 그 자손들만 가능
<? super T> 와일드 카드의 하한 제한. T와 그 조상들만 가능
<?> 제한 없음. 모든 타입이 가능
제네릭 메서드
- 제네릭 타입이 선언된 메서드(타입 변수는 메서드 내에서만 유효)
- 메서드를 호출할 때마다 타입을 대입해야 한다. (대부분 생략 가능)
- 메서드를 호출할 때 타입을 생략하지 않을 때는 클래스 이름 생략 불가
제네릭 타입의 형변환
- 제네릭 타입과 원시 타입 간의 형변환은 바람직 하지 않다. (경고 발생)
제네릭 타입의 제거
- 컴파일러는 제네릭 타입을 제거하고, 필요한 곳에 형변환을 넣는다.
- 컴파일 타임에 제네릭 타입이 제거된다 . ( 왜일까? )
열거형(enum)
- 관련된 상수들을 같이 묶어 놓은것. Java는 타입에 안전한 열거형을 제공
- Java는 타입에 안전하기 때문에 값이랑 타입을 같이 체크한다.
- java.lang.Enum 을 상속한다.
열거형을 정의하는 방법
enum 열거형 이름 { 상수명1, 상수명2, ... }
열거형 타입의 변수를 선언하고 사용하는 방법
Direction dir;
dir = Direction.EAST;
열거형에 멤버 추가하기
- 불연속적인 열거형 상수의 경우, 원하는 값을 괄호()안에 적는다.
- 열거형의 생성자는 묵시적으로 private로 외부에서 호출할 수 없다.
어노테이션
- 주석처럼 프로그래밍 언어에 영향을 미치지 않으며, 유용한 정보를 제공
표준 어노테이션
@Override
- 오버라이딩을 올바르게 했는지 컴파일러가 체크하게 한다.
- 오버라이딩을 할 때 메서드이름을 잘못적는 실수를 하는 경우가 많다.
@Deprecated
- 앞으로 사용하지 않을 것을 권장하는 필드나 메서드에 붙인다.
- @Deprecated의 사용 예, Date클래스의 getDate()
@FunctionalInterface
- 함수형 인터페이스에 붙이면 컴파일러가 올바르게 작성했는지 체크
- 함수형 인터페이스에는 하나의 추상메서드만 가져야 한다는 제약이 있음.
@SuppressWarnings
- 컴파일러의 경고메시지가 나타나지 않게 억제한다.
- 괄호()안에 억제하고자 하는 경고의 종류를 문자열로 지정
메타 어노테이션
- 메타 어노테이션은 '어노테이션을 만들기 위한 어노테이션'
@Target
- 어노테이션을 정의할 때, 적용대상 지정에 사용
@Retention
- 어노테이션이 유지(retention)되는 기간을 지정하는데 사용
- 컴파일러의에 의해 사용되는 어노테이션의 유지 정책은 SOURCE이다.
- 실행시에는 필요없기 때문
- 실행시에 사용 가능한 어노테이션의 정책은 RUNTIME이다.
@Repeatable
- 반복해서 붙일 수 있는 어노테이션을 정읳라 때 사용
어노테이션 타입 정의하기
- 어노테이션을 직접 만들어 쓸 수 있다.
@interface 어노테이션이름 {
타입 요소이름(); // 어노테이션의 요소를 선언한다.
}
- 어노테이션의 메서드는 추상 메서드이며, 어노테이션을 적용할 때 지정
어노테이션의 요소
- 적용시 값을 지정하지 않으면, 사용될 수 있는 기본값 지정 가능(null제외)
- 요소가 하나이고 이름이 value일 때는 요소의 이름 생략가능
- 요소의 타입이 배열인 경우, 괄호{}를 사용해야 한다.
마커어노테이션
- 요소가 하나도 정의되지 않은 어노테이션
어노테이션 요소의 규칙
- 어노테이션의 요소를 선언할 때 아래의 규칙을 반드시 지켜야 한다.
- 요소의 타입 : 기본형, String, enum, 어노테이션, class만 허용
- 괄호() 안에 매개변수를 선언 불가
- 예외 선언불가
- 요소를 타입 매개변수(제네릭) 정의 불가
'자바의정석' 카테고리의 다른 글
자바의 정석 - 컬렉션 프레임워크(Collections Framework) (0) | 2021.12.26 |
---|---|
자바의정석 - 예외처리(Excepption handling) (0) | 2021.12.22 |
자바의정석 - 객체지향개념2 (0) | 2021.12.19 |
자바의 정석 - 객체지향개념 1 (0) | 2021.12.16 |
자바의 정석 - 배열(Array) (0) | 2021.12.14 |