1. 지네릭스 (Generics)
- 지네릭스란?
- 다룰 객체의 타입을 미리 명시해줌으로써 형변환을 줄여줌
- 지네릭 클래스의 선언
- class Box 와 같이 선언
- T는 임의의 문자도 상관없고, <K, V> 처럼 여러개 해도 됨
- 단, 이는 임의의 참조형 타입을 의미 → 원래는 원시 타입은 안됨
- Box 과 Box는 별도의 클래스를 의미하는 것이 아님 → 타입 매개변수이므로 add(1,2)와 add(3,4)가 다른 함수가 아니라는 것으로 이해하면 됨
- 제한
- static 멤버에는 T 사용 불가 → 인스턴스 변수로 간주하므로
- new T[] 불가 → 컴파일 타입에 타입을 추정할 수 없으므로
- 지네릭 클래스의 객체 생성과 사용
- Apple이 Fruit의 자손인 경우
- Box box = new Box(); 불가능하다
- 그러나 지네릭 클래스 자체의 상속관계에서는 가능하다
- FruitBox box = new AppleBox(); 가능
- 제한된 지네릭 클래스
- 타입 매개변수 T에 지정할 수 있는 타입 종류를 제한하는 방법
- 와 같이 설정하면 Fruit의 자손들만 담을 수 있다
Box<Fruit> box = new Box<>(); // 가능 Box<Apple> appleBox = new Box<>(); // 가능 Box<B> bBox = new Box<B>(); // 불가능
- 심지어 자손 타입이라면 다른 클래스여도 삽입이 가능해짐
Box<Fruit> box = new Box<>(); box.add(new Apple()); // 가능 box.add(new Grape()); // 가능 box.add(new B()); // 불가능
- 인터페이스를 구현해야하는 경우에도 extends 키워드 사용
- 만약 여러개를 넣어야 하는 경우 &를 사용 → 주의: 쉼표를 사용하면 또 하나의 타입 매개변수를 선언한 것이 됨
- 와일드 카드
- 위 코드에서 FruitBox와 같은 문법은 사용이 불가능하다 → static에는 타입 매개변수를 사용할 수 없고, 애초에 클래스가 지네릭 클래스가 아님
- 또한 그렇다고 오버로딩이 가능하지도 않음 → 컴파일 타임에 <>는 지워지므로 시그니처가 같음
- 이때 사용하는 것이 와일드카드 → <?>
- extends, super를 사용할 수 있고, super는 T와 조상들만 가능, extends는 T와 자손들만 가능
- &는 사용할 수 없다.
class FruitBox<T> { } class A { static String makeJuice(FruitBox<String> box) { return ""; } static Integer makeJuice(FruitBox<Integer> box) { return 1; } static String makeJuice(FruitBox<?> box) { return ""; } }
- 지네릭 메서드
- 메서드에 와 같이 붙인 것 → static 아니어도 가능함
- 주의 : 메서드에 붙인 T는 만약 타입 매개변수명이 T여도 서로 다른 것임
- 지네릭 타입의 형변환
- Box<? extends Object> box = new Box(); 는 가능하다.
- 지네릭 타입의 제거
- 라면 컴파일 시 Fruit로 치환 → 그냥 T일 경우 Object로 치환
- 지네릭을 제거한 후 타입이 일치하지 않으면, 형변환을 추가함
- 만약 와일드 카드가 포함되어 있는 경우 적절한 타입으로 형변환 추가
2. 열거형
- 열거형이란?
- 타입에 안전한 열거형 → 실제 값이 같아도 타입이 다르면 false
- 열거형의 정의와 사용
- 열거형은 equals 대신 ==가 사용 가능 → 시간 절약
- 그러나 >, < 는 사용 불가능 → compareTo 메소드를 통해 가능 → 같으면 0, 왼쪽이 크면 양수, 오른쪽이 크면 음수 반환
- 열거형에 멤버 추가하기
- 열거형은 생성자가 내부적으로 private → new로 생성 불가능
- 열거형에 추상 메소드
- 열거형의 이해
3. 애너테이션
- 애너테이션이란?
- 소스코드 안에 다른 프로그램을 위한 정보를 미리 약속된 포맷으로 포함시킨 것
- 표준 애너테이션
- 메타 애너테이션 : 애너테이션을 정의하는데 사용되는 애너테이션의 애너테이션
- @Override : 메서드 앞에만 붙일 수 있고, 조상 메서드를 오버라이딩하는 것이라는 걸 컴파일러에게 알림
- 안 붙이면 메서드 이름 틀렸을 때 오류 메시지 안보냄 → 새로운 메서드로 간주
- @Deprecated : 다른 것으로 대체되었으니 더 이상 사용하지 않을 것을 권한다
- 매타 애너테이션
- 애너테이션 타입 정의하기
- 요소들의 값을 빠짐없이 지정해줘야함
- default 를 붙여 기본값 설정 가능
- 애너테이션은 상속 불가능
- 모든 애너테이션의 조상은 java.lang.annotation.Annotation → 그냥 인터페이스
enum TestType { FIRST,FINAL } @interface TestInfo { int count(); String testedBy(); String[] testTools(); TestType testType(); DateTime testDate(); } @interface DateTime { String yymmdd(); String hhmmss(); } @TestInfo(count = 3, testedBy = "kim", testTools = {"a", "b"}, testType = TestType.FINAL, testDate = @DateTime(yymmdd = "sdfsdf", hhmmss = "sdfsdf")) class NewClass {}
https://product.kyobobook.co.kr/detail/S000001550352