-
java 열거형 / 박싱 / 어노테이션대학/객체지향프로그래밍 2022. 12. 9. 21:16
- 열거형 (enumeration)
이름을 가진 상수들의 리스트
enum Apple { Jonathan, GoldenDel, RedDel, Winesap, Cortland }
열거형: Apple
열거형 상수: Jonathan, GoldenDel ...
Apple ap; switch(ap) { case Jonathan: ... case Winssap: ... }
열거형은 class타입으로 간주되지만, 객체를 생성하지는 않는다. (new 키워드 미사용)
for (Apple i : Apple.values()) { System.out.println(i); } System.out.println("RedDel value: " + Apple.valueOf("RedDel")); // Jonathan // GoldenDel // RedDel // Winesap // Cortland // RedDel value: RedDel
values(), valueOf() 메서드.
enum Apple { Jonathan(10), GoldenDel(9), RedDel(12), Winesap(15), Cortland(8); private final int price; Apple(int p) { price = p; } Apple() { price = -1; } int getPrice() { return price; } } System.out.println(Apple.Winesap.getPrice()); // 15
인스턴스 변수는 상수별로 개별 할당된다. (열거형이 클래스 타입이라 가능한 일)
생성자 오버로딩도 가능.
enum Apple { Jonathan(10), GoldenDel(9), RedDel(12), Winesap(15), Cortland(8); private final int price; Apple(int p) { price = p; } Apple() { price = -1; } int getPrice() { return price; } } Apple ap1 = Apple.RedDel; Apple ap2 = Apple.GoldenDel; System.out.println(ap1.ordinal()); // 2 System.out.println(ap1.compareTo(ap2)); // 1 System.out.println(ap1.equals(ap2)); // false
A.ordinal(): 열거형 상수의 순서 값을 리턴
A.compareTo(B): 열거형 상수간의 순서 값을 비교 (A-B)
A.equals(B): 열거형 상수가 같은지 비교
- 박싱 (Boxing)
기초 타입을 클래스 타입으로 캡슐화 하는 것
Character character = Character.valueOf('b'); // boxing char c = character.charValue(); // unboxing
valueOf(기초타입): 박싱하는 메서드
charValue(), intValue, booleanValue() ...: 언박싱하는 메서드
Integer integer = 100; // auto boxing int i = integer; // auto unboxing
형식이 맞을 경우 자동으로 박싱/언박싱 처리를 해줌.
// autounboxing -> ++ -> autoboxing ++integer; // autounboxing -> /3 -> autounboxing(another one) -> + -> autoboxing Integer int2 = integer + (integer / 3)
필요한 순간에 박싱/언박싱이 일어남.
하지만, 불필요한 오토박싱의 남용은 성능 저하의 원인이 됨.
- 어노테이션 (annotation)
코드에 대해 추가적인 정보를 제공함.
필요에 따라 런타임에도 실행이 된다는 점이 주석과의 차이점.
리텐션 정책
SOURCE: 소스파일까지 유효 -> 컴파일시 버려짐(.class 파일에는 없어짐)
CLASS: 클래스 파일까지 유효 -> 실행시에 버려짐(실행 중인 코드에는 없어짐)
RUNTIME(기본값): 클래스 파일, 실행시에도 유효
import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.reflect.Method; @Retention(RetentionPolicy.RUNTIME) // retention policy @interface MyAnno { String str(); // 생긴건 추상 메서드인데 변수처럼 동작함. int val(); } public class AnnotationTest { @MyAnno(str = "Example", val = 100) // 멤버가 변수처럼 동작함. public static void myMeth(String str, int i) { AnnotationTest ob = new AnnotationTest(); try { // reflection: c 는 public class AnnotationTest {} 클래스를 참조하게 된다. Class<?> c = ob.getClass(); // m 은 c 클래스 내부의 myMeth 메서드를 참조하게 된다. // myMeth 메서드 중에 String, int 2개의 인자를 받는 메서드를 가리킨다. Method m = c.getMethod("myMeth", String.class, int.class); // anno 는 m 메서드에 선언된 MyAnno 어노테이션에 접근한다. MyAnno anno = m.getAnnotation(MyAnno.class); System.out.println(anno.str() + " " + anno.val()); // Example 100 } catch (NoSuchMethodException exc) { System.out.println("Method Not Found: " + exc); } } public static void main(String[] args) { myMeth("test", 10); } }
사용자 어노테이션의 예시코드
// A marker annotation. @Retention(RetentionPolicy.RUNTIME) @interface MyMarker { } ... @myMarker psv myMath() { ... m.isAnnotationPresent(MyMarker.class); // true }
멤버를 가지지 않는 마커 어노테이션
// A single-member annotation. @Retention(RetentionPolicy.RUNTIME) @interface MySingle { int value(); // 무조건! value라는 이름이어야 함. } ... @MySingle(100) psv myMath() { ... System.out.println(anno.value()); // 100 }
단일 멤버를 갖는 싱글 멤버 어노테이션
@interface AnnoConfigTest{ int id = 100; // 상수 ok String major(int i, int j) // 매개변수 x String minor() throws Exception; // 예외 x ArrayList<T> list(); // 요소의 타입을 매개변수 x } // 출처: https://velog.io/@jkijki12/annotation
사용자 정의 어노테이션의 제한 사항
1. 어노테이션 멤버로 기초 데이터, 클래스 타입, 어노테이션, enum만 허용됨.
2. 멤버의 괄호 안에 매개변수를 선언할 수 없음.
3. 예외를 선언할 수 없음.
4. 요소의 타입을 제네릭과 같은 매개변수로 정의할 수 없음.
// 지정된 메서드는 슈퍼클래스의 메서드를 반드시 오버라이드 해야함. // 아닐 경우 컴파일 에러 @Override // java 업데이트 이후 사용을 권장하지 않는 메서드. @Deprecated // 컴파일러의 경고 메세지 무시 (@Override의 컴파일 에러도 무시함) @SuppressWarnings
주요 빌트인 어노테이션
'대학 > 객체지향프로그래밍' 카테고리의 다른 글
java transient / volatile / instanceof / native / assert (0) 2022.12.09 java I/O (0) 2022.12.09 java 멀티스레딩 (2) 2022.10.18 java 예외 처리 (0) 2022.10.09 java 인터페이스 (0) 2022.10.09