열거형, 박싱, 어노테이션

2022. 12. 7. 20:03자바

728x90

<열거형>

1. 특징

- 이름을 가진 상수들의 리스트, 각 상수들을 열거형 상수라고 함, public static final 멤버로 간주

(final 멤버: 값 할당을 딱 한번 할 수 있다.)

- 각 상수들은 특정 값을 가짐

enum fruit{
Apple,banana,melon}

fruit ap; 
ap=fruit.Apple;

switch(ap){
case Apple: 
	//..
case banana:
	//..
} //case문에서는 ap.Apple같은 '.' 연산자 생략 가능

 

- 새로운 데이터 타입으로 사용 가능 -> fruit이라는 새로운 데이터 타입 선언됨.

- 열거형은 클래스 타입으로 간주됨(그러나 오브젝트를 생성하지는 않음, new 키워드 미사용)

- 열거형도 클래스 내에 인스턴스 변수, 생성자, 메서드 등 적용 가능

 

2. 열거형 메서드

 1) public static enum-type[] values() //열거형 상수들을 리스트로 반환하는 메서드

2)  public static enum-type valueOf( string str) //열거형 상수들 중 str 이름을 가진 상수 반환

*java.lang.Enum //모든 열거형의 슈퍼클래스

  1) final int ordinal() //열거 상수의 순서 값을 리턴(0부터 시작)

  2) final int compareTo (enum-type e)

//열거 상수의 순서값을 다른 상수와 비교

   해당 열거형 상수에서 e를 빼서 비교 -> e보다 작으면 음수, 크면 양수, 같으면 0 리턴

 


 

<박싱>

1. 특징

박싱: 기초 타입을 클래스 타입으로 캡슐화 하는 것 -> 클래스의 기능을 사용하게 해줌(래퍼 클래스라고 함)

언박싱: 래퍼 클래스를 기본 타입으로 

 

2. 래퍼 클래스 종류

 1) Character : 문자형 변수의 래퍼 클래스

   static Character valueOf(char ch)// char 변수를 받아 Character 오브젝트를 생성하는 정적 메서드

  # Character(char ch)는 같은 기능이지만 deprecated 됨( 사용을 권장하지 않음, 호환성을 위해 삭제하지 않고 남겨뒀음)

    char charValue() //Character 오브젝트의 값을 기초타입으로 반환

 

2) Boolean :논리형 변수의 래퍼 클래스

  static Boolean valueOf(boolean boolvalue) //기초타입  boolean을 받아서 박싱

 static Boolean valueOf(String boolstring) // 기초타입 스트링으로 "true" 혹은 "false" 입력받으면 래퍼타입으로 박싱

boolean booleanValue() // 기초타입으로 반환

 

3) Byte, Short, Integer,Long,Float,Double :숫자형 래퍼 클래스 ( 앞글자만 대문자로 바꾼거) 

 static Integer valueOf(String valstr) throws NumberFormat Exception // 스트링으로 숫자를 받아서 래퍼클래스로 박싱,

잘못된 형식의 숫자 들어가면 예외처리됨

 

3. 오토박싱

: 기초타입을 래퍼 클래스로 자동 변환 (생성자나 정적 메서드를 호출할 필요 없음)

Integer i0b=100; //명시적 박싱 없이 기초타입 100을 Integer 오브젝트로 자동 생성

반대의 경우도 가능-> 오토 언박싱

int i =i0b; //Integer 오브젝트를 자동으로 언박싱해서 int에 대입
static int m(Integer v){
	return v;
}

Integer i0b=m(100); //100이 인자로 들어올 시 오토 박싱, 리턴 시 오토 언박싱

*주의할 점: 오토박싱 남용은 성능 저하의 원인이 됨(불필요한 변환을 유발)

 


<어노테이션>

: 자바 소스 파일의 메타 데이터( 코드에 대해 추가적인 정보를 제공)

1. 특징 

주석과의 차이점? 필요에 따라 런타임에 유지 가능

 

2. 종류

 1) 사용자 정의 어노테이션: 사용자가 직접 정의하는 어노테이션

@interface MyAnno{
String str();
int val();
}
/**MyAnno라는 어노테이션이 정의됨
   두 멤버 str(), val()을 가짐
   어노테이션 인터페이스를 상속함**/

 선언된 어노테이션은 클래스, 메서드, 멤버 변수, 매개 변수등에 사용될 수 있음

 -어노테이션 사용할 곳 위에 접두어 @을 붙여 선언, 사용 시 어노테이션의 멤버 초기화 해줘야함

@MyAnno(str="example", val=100)

 

// java.lang.Class : 자바의 모든 클래스가 상속하는 빌트인 클래스

// Method 클래스의 getAnnotation()을 이용하여 빌트인 어노테이션에 접근 가능

import java.lang.annotation.*;
import java.lang.reflect.*;

@Retention(RetentionPolicy.RUNTIME)
@interface MyAnno {
    String str();
    int val();
}

class Meta {
    @MyAnno(str = "Example", val = 100)
    public static void myMeth() {
        Meta ob = new Meta(); //메타 클래스 생성
        try {
            Class<?> c = ob.getClass(); //Meta 클래스의 오브젝트를 가져옴
            Method m = c.getMethod("myMeth");
            //myMeth 이름을 가진 메서드 리턴
            MyAnno anno = m.getAnnotation(MyAnno.class);
            //myMeth메서드에 선언된 어노테이션에 접근가능
            System.out.println(anno.str() + " " +
                    anno.val());// 어노테이션에 저장된 값 출력
        } catch (NoSuchMethodException exc) {
            System.out.println("Method Not Found."); //메서드 찾지 못하면 예외 던지기
        }
    }

    public static void main(String[] args) {
        myMeth();
    }
}
Method m = c.getMethod("myMeth", String.class,int.class);
  // 인자가 필요한 메서드를 얻어올 때는 이렇게

2) 빌트인 어노테이션: 자바가 기본적으로 제공하는 표준 어노테이션.

java.lang에 정의되어 있음.

#1 @Override

:지정된 메서드는 슈퍼클래스의 메서드를 반드시 오버라이드 해야함, 아닐 경우 컴파일 에러 발생

#2 @Deprecated

: 어노테이트된 것의 사용을 권장하지 않을 때

#3 @FunctionalInterface

: 인터페이스가 함수형 인터페이스임을 표시

#4 @safeVarargs

: 메서드의 가변인자(var)에 관한 표시

 

 3) 메타 어노테이션: 어노테이션을 위한 어노테이션

java.lang.annotation에 정의되어 있음

#1 @Retention: 어노테이션이 유지되는 기간을 지정

#2 @Documented: 어노테이션을 javadoc로 작성한 문서에 포함시킬 때

#3 @Target: 어노테이션의 적용 대상을 지정할 때 

#4 @Inherited: 어노테이션을 상속시킬 때

#5 @Repeatable: 반복해서 붙일 수 있는 어노테이션을 정의할 때

 

4) 마커 어노테이션: 멤버를 가지지 않는 어노테이션 

  -단지 표시를 위해 사용

   ex)  @Override, @Test

import java.lang.annotation.*;
import java.lang.reflect.*;

// A marker annotation.
@Retention(RetentionPolicy.RUNTIME)
@interface MyMarker {
}

class Marker {
    @MyMarker
    public static void myMeth() {
        Marker ob = new Marker();
        try {
            Method m = ob.getClass().getMethod("myMeth");
            if (m.isAnnotationPresent(MyMarker.class)) 
            // Mymeth 메서드에 어노테이션이 있는지 확인한다.
                System.out.println("MyMarker is present.");
        } catch (NoSuchMethodException exc) {
            System.out.println("Method Not Found.");
        }
    }

    public static void main(String[] args) {
        myMeth();
    }
}

5) 싱글 멤버 어노테이션

: 어노테이션이 단일 멤버만을 가질 때 

간단하게 멤버 이름 없이 값 명시 가능

**단일 멤버만 가지는 경우 int value(); 라고 표기해야함 . 다른 타입, 다른 변수명 안됨**

import java.lang.annotation.*;
import java.lang.reflect.*;

@Retention(RetentionPolicy.RUNTIME)
@interface MySingle {
    int value(); //싱글멤버
}

class Single {
    @MySingle(100) //멤버 이름 없이 값 명시 가능
    public static void myMeth() {
        Single ob = new Single();
        try {
            Method m = ob.getClass().getMethod("myMeth");
            MySingle anno = m.getAnnotation(MySingle.class);
            System.out.println(anno.value());
        } catch (NoSuchMethodException exc) {
            System.out.println("Method Not Found.");
        }
    }

    public static void main(String[] args) {
        myMeth();
    }
}

사용자 정의 어노테이션 제한 사항:

- 멤버는 기초 데이터, String, enum, 어노테이션, 클래스 타입만 허용됨

- int value()같은 괄호 안에 매개변수를 선언할 수 없음

- 예외를 선언할 수 없음

- 요소의 타입을 매개변수로 정의할 수 없음

 

3. 리텐션(retention) 정책 

: 어노테이션이 언제까지 유효한지 결정

- @Retention 어노테이션 사용

- 아래 정책 중 하나를 사용

SOURCE : 소스 파일까지 유효, 컴파일 중 버려짐

CLASS: 클래스 파일까지 유효, 실행 시 버려짐

RUNTIME: 클래스 파일까지 유효, 실행 시에도 적용

@Retention(RetentionPolicy.RUNTIME)
@interface MyAnno{
String str();
int val();
}

*리텐션 정책이 RUNTIME인 어노테이션에 리플렉션을 이용하여 실행 중 활용 가능

*리플렉션(reflection)? 런타임에 클래스 정보를 얻게 하는 자바의 기능

 

 

 

 

 

 

                                                           

 

 

 

 

 

 

 

 

728x90

'자바' 카테고리의 다른 글

try-with-resources문  (0) 2022.12.08
입출력 기본  (0) 2022.12.07
디폴트 메서드  (0) 2022.12.07
(자바) valueOf()  (0) 2022.11.17
(자바) 버퍼 한줄씩 읽기-readLine()  (0) 2022.11.17