ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [자바의 정석] 12장 : 지네릭스, 열거형, 애너테이션
    책/자바의 정석 3판 2024. 2. 18. 21:35
    반응형

    1. 지네릭스 (Generics)

    1. 지네릭스란?
      • 다룰 객체의 타입을 미리 명시해줌으로써 형변환을 줄여줌
    2. 지네릭 클래스의 선언
      • class Box 와 같이 선언
      • T는 임의의 문자도 상관없고, <K, V> 처럼 여러개 해도 됨
      • 단, 이는 임의의 참조형 타입을 의미 → 원래는 원시 타입은 안됨
      • Box 과 Box는 별도의 클래스를 의미하는 것이 아님 → 타입 매개변수이므로 add(1,2)와 add(3,4)가 다른 함수가 아니라는 것으로 이해하면 됨
      • 제한
        • static 멤버에는 T 사용 불가 → 인스턴스 변수로 간주하므로
        • new T[] 불가 → 컴파일 타입에 타입을 추정할 수 없으므로
    3. 지네릭 클래스의 객체 생성과 사용
      • Apple이 Fruit의 자손인 경우
        • Box box = new Box(); 불가능하다
      • 그러나 지네릭 클래스 자체의 상속관계에서는 가능하다
        • FruitBox box = new AppleBox(); 가능
    4. 제한된 지네릭 클래스
      • 타입 매개변수 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 키워드 사용
      • 만약 여러개를 넣어야 하는 경우 &를 사용 → 주의: 쉼표를 사용하면 또 하나의 타입 매개변수를 선언한 것이 됨
    5. 와일드 카드
      • 위 코드에서 FruitBox와 같은 문법은 사용이 불가능하다 → static에는 타입 매개변수를 사용할 수 없고, 애초에 클래스가 지네릭 클래스가 아님
      • 또한 그렇다고 오버로딩이 가능하지도 않음 → 컴파일 타임에 <>는 지워지므로 시그니처가 같음
      • 이때 사용하는 것이 와일드카드 → <?>
      • extends, super를 사용할 수 있고, super는 T와 조상들만 가능, extends는 T와 자손들만 가능
      • &는 사용할 수 없다.
    6. 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 ""; } }
    7. 지네릭 메서드
      • 메서드에 와 같이 붙인 것 → static 아니어도 가능함
      • 주의 : 메서드에 붙인 T는 만약 타입 매개변수명이 T여도 서로 다른 것임
        • 메소드 종속적인 것
    8. 지네릭 타입의 형변환
      • Box<? extends Object> box = new Box(); 는 가능하다.
    9. 지네릭 타입의 제거
      1. 라면 컴파일 시 Fruit로 치환 → 그냥 T일 경우 Object로 치환
      2. 지네릭을 제거한 후 타입이 일치하지 않으면, 형변환을 추가함
        1. 만약 와일드 카드가 포함되어 있는 경우 적절한 타입으로 형변환 추가

    2. 열거형

    1. 열거형이란?
      • 타입에 안전한 열거형 → 실제 값이 같아도 타입이 다르면 false
    2. 열거형의 정의와 사용
      • 열거형은 equals 대신 ==가 사용 가능 → 시간 절약
      • 그러나 >, < 는 사용 불가능 → compareTo 메소드를 통해 가능 → 같으면 0, 왼쪽이 크면 양수, 오른쪽이 크면 음수 반환
    3. 열거형에 멤버 추가하기
      • 열거형은 생성자가 내부적으로 private → new로 생성 불가능
      • 열거형에 추상 메소드
        • 각 상수에 대한 구현체를 제공해야함
    4. 열거형의 이해
      • 생략

    3. 애너테이션

    1. 애너테이션이란?
      • 소스코드 안에 다른 프로그램을 위한 정보를 미리 약속된 포맷으로 포함시킨 것
    2. 표준 애너테이션
      • 메타 애너테이션 : 애너테이션을 정의하는데 사용되는 애너테이션의 애너테이션
      • @Override : 메서드 앞에만 붙일 수 있고, 조상 메서드를 오버라이딩하는 것이라는 걸 컴파일러에게 알림
        • 안 붙이면 메서드 이름 틀렸을 때 오류 메시지 안보냄 → 새로운 메서드로 간주
      • @Deprecated : 다른 것으로 대체되었으니 더 이상 사용하지 않을 것을 권한다
    3. 매타 애너테이션
      • 생략
    4. 애너테이션 타입 정의하기
      • 요소들의 값을 빠짐없이 지정해줘야함
      • default 를 붙여 기본값 설정 가능
      • 애너테이션은 상속 불가능
      • 모든 애너테이션의 조상은 java.lang.annotation.Annotation → 그냥 인터페이스
    5. 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

    반응형
Designed by Tistory.