2022. 12. 7. 20:03ㆍ자바
<열거형>
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)? 런타임에 클래스 정보를 얻게 하는 자바의 기능
'자바' 카테고리의 다른 글
| 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 |