minghxx.blog
  • 자바의 정석 142~147강 ch12 지네릭스, 열거형, 애너테이션(2)
    2023년 09월 16일 02시 25분 41초에 업로드 된 글입니다.
    작성자: 민발자
    728x90

    자바의 정석 기초편(2020최신)

    ch 12-17~20 열거형

    1. 열거형 enum

    관련 상수들을 같이 묶어 놓음, java는 타입에 안전한 열거형 제공

    열거형은 값과 타입 모두 체크

    class Card {
    	enum Kind {CLOVER, HEART, DIAMOND, SPADE}
    	enum Value {TWO, THREE, FOUR}
    }
    if(Card.CLOVER == Card.TWO) // false
    // 0 == 0 인데 왜 false?
    // 타입이 달라서 비교 불가 Kind == Value라서 false

     

    2. 열거형의 정의와 사용

    열거형 인스턴스를 생성해 사용

    열거형 상수의 비교에 ==와 compareTo() 사용 가능, 비교연산자는 사용 불가

    // 열거형 정의
    enum 열거형 이름 { 상수1, 상수2, ... }
    
    // 열거형 사용
    enum En { a, b, c, ... }
    class Ex{
    	En e; // 열거형 인스턴스 변수 선언
        
    	void init() {
    		e = En.a; // a로 초기화
    	}
    }

     

    3. 열거형의 조상 java.lang.Enum

    모든 열거형은 Enum의 자손, 메서드 상속 받음

    메서드 설명
    Class<E> getDeclaringClass() 열거형의 Class 객체 반환
    String name() 열거형 상수의 이름을 문자열로 반환
    int ordinal() 열거형 상수가 정의된 순서를 반환(0부터 시작)
    T valueOf (Class<T> enumType, String name) 지정된 열거형에서 name과 일치하는 열거형 상수 반환
    static E[] values() 컴파일러가 자동 추가, 열서형 모든 상수를 배열로 반환
    static E valueOf(String name) 컴파일러가 자동 추가, 열서형 상수의 이름을 넣으면 그 상수를 반환

     


    ch 12-21~22 열거형 멤버 추가

    1. 열거형에 멤버 추가하기

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

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

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

    enum Direction { 
    	EAST(1), SOUTH(5), WEST(-3), NORTH(0); // NORTH(0, ">") 값 여러 개도 가능
    	
        private final int value; // 상수를 저장할 필드(인스터스 변수) 추가
    	Direction(int value) { this.value = value; } // 생성자 추가
        // 열거형 생성자는 묵시적으로 privae 이므로 외부에서 객체 생성 불가
    	
        public int getValue() { return value; }
    }

    ch 12-23~24 애너테이션

    1. 애너테이션

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

    소스코드와 문서의 버전 불일치로 합쳐서 관리하기 위한 것

     

    2. 표준 애너테이션

    분류 애너테이션 설명
    표준 애너테이션 @Override 컴파일러에게 오버라이딩하는 메서드라 알림
    @Deprecated 앞으로 사용하지 않을 것을 권장하는 대상에 붙임
    @SuppressWarnings 컴파일어의 특정 경고메세지를 나타나지 않게 해줌
    @SafeVarargs 지네익스 타입의 가변인자에 사용(JDK1.7)
    @FunctionalInterface 함수형 인터페이스(JDK1.8)
    @Native native메서드에서 참조되는 상수 앞(JDK1.8)
    메타 애너테이션 @Target 애너테이션이 적용사능한 대상 지정
    @Documented 애너테이션 정보가 javadoc으로 작성된 문서에 포함되게 함
    @Inherited 애너테이션이 자손 클래스에 상속되도록 함
    @Retention 애너테이션이 유지되는 범위를 지정하는데 사용
    @Repeatable 애너테이션을 반복해서 적용 가능하게 해줌(JDK1.8)

     


    ch 12-25~26 표준 애너테이션

    1. @Override

    메서드 이름 오타 등 오버라이딩을 올바르게 했는지 컴파일러가 체크

     

    2. @Deprecated

    앞으로 사용하지 않을 것을 권장하는 필드나 메서드에 붙임

    ex) Date클래스의 getDate()

    하위호환성으로 생김, @Deprecated 이용해 더이상의 사용을 막고 이전 버전에선 계속 동작할 수 있게함

     

    3. @FunctionalInterface

    함수형 인터페이스, 컴파일러가 올바르게 작성했는지 체크

    하나의 추상 메서드만 가져야 하는 제약있음

    @FunctionalInterface // 함수형 인터페이스는 하나의 추상 메서드만 가능
    interface Testable{
    	void test(); 
    //	void check();
    }

     

    4. @SuppressWarnings

    컴파일러의 경고 메세지를 억제, ()안에 억제하고자 하는 경고 종류 지정, 구분자 ' , ' 이용해 여러 개 지정 가능

    경고를 억제하는 기능도 있지만 경고 확인용으로도 사용

    @SuppressWarnings("unchecked") // 지네릭스와 관련 경고 억제
    ArrayList list = new ArrayList(); // 지네릭 타입 없음
    list.add(obj); // 경고 발생

    ch 12-29~33 메타 에너테이션

    1. 메타 애너테이션

    애너테이션을 위한 애너테이션, java.lang.annotation패키지에 포함

     

    2. @Target

    애너테이션을 정의할 때 적용대상 지정에 사용

    대상 타입 의미
    ANNOTATION_TYPE 애너테이션
    CONSTRUCTOR 생성자
    FIELD 필드(멤버변수, enum상수)
    LOCAL_VARIABLE 지역변수
    METHOD 메서드
    PACKAGE 패키지
    PARAMETER 매개변수
    TYPE 타입(클래스, 인터페이스, enum)
    TYPE_PARAMETER 타입 매개변수(JDK 1.8)
    TYPE_USE 타입이 사용되는 모든 곳(JDK 1.8)
    @Target({FIELD, TYPE, TYPE_USE}) // 적용대상이 FIELD, TYPE, TYPE_USE
    public @interface MyAnnotation {} // myAnnotaion 정의
    
    @MyAnnotaion 	// 적용대상이 TYPE인 경우
    class MyClass {
    	@MyAnnotaion // 적용대상이 FIELD인 경우
    	int i;
    	
    	@MyAnnotaion // 적용대상이 TYPE_USE인 경우
    	MyClass mc;
    }

     

    2. @Retention

    애너테이션의 유지되는 기간을 지정

    유지 정책 의미
    SOURCE 소스파일에만 존재, 클래스 파일에 존재 안함
    CLASS 클래스 파일에 존재, 실행시 사용 불가, 기본값으로 지정
    RUNTIME 클래스 파일에 존재, 실행시 사용 가능

    @Override는 컴파일러가 체크, 컴파일러 확인용이기 때문에 → 유지정책 SOURCE

    @FunctionalInterface → 유지정책 RUNTIME

     

    3. @Documented, @Inherited

    @Documented → javadoc으로 작성한 문서에 포함시킴

    @Inherited → 애너테이션도 상속 가능, 자손 클래스에 상속하기 위해 사용

     

    4. @Repeatable

    반복해서 붙일 수 있는 애너테이션을 정의

    @Repeatable을 하나로 묶을 컨테이너 애너테이션도 정의 필요


    ch 12-34~37 애너테이션 타입 정의하기, 애너테이션의 요소

    1. 애너테이션 타입 정의하기

    애너테이션을 직접 정의해 사용 가능, 애너테이션의 메서드는 추상 메서드, 자신이 아닌 다른 애너테이션 포함 가능

    // 애너테이션 정의
    @interface TestInfo {
    	int count(); // 애너테이션 요소 선언
    	TestType testType(); // enum TestType {FIRST, FINAL}
    	DateTime testDate(); // 자신이 아닌 다른 애너테이션 포함
    }
    
    // 사용
    @TestInfo(
    	count = 3;
    	testType = TestType.FIRST;
    	testDate = @DateTime(yyymmdd="230916")
    )
    public class NewClass{ ... }

     

    2. 애너테이션 요소

    적용시 값을 지정하지 않으면 사용될 수 있는 기본값 지정 가능, null은 불가

    @interface TestInfo {
    	int count() default 1; // 기본값 1 지정
    }
    
    @TestInfo // count 기본값으로 1
    public class NewClass { ... }

    요소가 하나이고 이름이 value면 요소 이름 생략가능

    @interface TestInfo {
    	String vlaue();
    }
    
    @TestInfo("passed") // 요소가 하나고 value면 이름 생략 가능
    public class NewClass { ... }

    요소 타입이 배열인 경우 괄호 사용 {}

    @TestInfo(count={1, 3, 5}) // 배열인 경우 괄호
    @TestInfo(count=1) // 값 하나면 괄호 생략 가능
    @TestInfo(count={}) // 값이 없을 때 괄호 생략 불가

     

    3. 애너테이션의 조상

    Annotation은 모든 애너테이션의 조상이지만 상속 불가

    Annotation이 가지고 있는 추상메서드는 구현할 필요 없고 사용 가능

     

    4. 마커 애너테이션 Marker Annotation

    요소가 하나도 정의되지 않은 애너테이션

     

    5. 애너테이션 요소의 규칙

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

    매개변수 불가

    예외 선언 불가

    요소를 타입 매개변수(지네릭)로 정의 불가

    @interface AnnoTest {
    	int id = 100; // 상수 가능
    	String major(int i); // 매개변수 불가
    	String minor() throws Exception; // 예외 선언 불가
    	ArrayList<T> list(); // 타입 매개변수 불가
    }
    728x90
    댓글