열거형(enum)
관련된 상수들을 같이 묶어 놓은 것, java는 타입에 안전한 열거형을 제공
C언어의 열거형은 값이 같은지만 체크
자바는 값과 타입 둘다 체크
열거형의 정의와 사용
enum 열거형 이름{ 상수명1, 상수명 2, ...}
enum Direction { EAST, SOUTH, WEST, NORTH }
열거형 상수의 비교에 ==와 compareTo()를 사용가능, 비교연산자는 사용 불가
열거형의 조상 java.lang.Enum 클래스
모든 열거형은 Enum 클래스의 자손이며, 아래의 메서드를 상속받는다.
values(), valueOf()는 컴파일러가 자동으로 추가한다.
values() : 열거형의 모든 상수를 배열로 반환
값이 기본적으로 0, 1, 2, 3...으로 할당 되어 ordinal()가 반환하는 순서와 값이 일치하지만 열거형 상수에 다른 값을 주었을 때는 ordinal의 값과 열거형 상수의 값이 다를 수 있다.
열거형에 멤버 추가하기
불연속적인 열거형 상수의 경우, 원하는 값을 괄호()안에 적는다.
enum 열거형 이름{ 상수명1(값), 상수명 2(값) , ...}
괄호() 생성자를 호출하는 것으로 사용하려면, 인스턴스 변수와 생성자를 새로 추가해 줘야 한다.
enum Direction {
EAST(1, ">"), SOUTH(2, "V"), WEST(3, "<"), NORTH(4, "^"); // 끝에 ';'를 추가해야 한다.
private final int value; // 정수를 저장할 필드(인스턴스 변수)를 추가
private final String Symbol; // 정수를 저장할 필드(인스턴스 변수)를 추가
Direction(int value, String Symbol) {
// 정수를 저장할 필드(인스턴스 변수)를 추가
this.value = value;
this.Symbol = Symbol;
}
public int getValue() {return value;}
}
열거형의 생성자는 묵시적으로 Private이므로, 외부에서 객체생성이 불가능하다.
Direction d = new Direction(); // 에러, 열거형의 생성자는 외부에서 호출 불가
애너테이션
애너테이션은 주석처럼 프로그래밍 언어에 영향을 미치지 않으며, 유용한 정보를 제공한다.
애너테이션의 등장 배경
기존에는 소스코드와 관련 문서를 따로 작성하여 소스코드 변경시 문서 내용도 변경해야 했지만 그러지 않는게 빈번하게 발생했다. 이로 인해 소스코드와 문서의 불일치 발생하여 소스코드에 주석을 넣어 문서와 소스코드를 합쳐 하나로 만들게 되었다.
- javadoc.exe 프로그램이 소스파일에서 주석을 추출해 문서를 작성
/**
* The common interface extended by all annotation interfaces. Note that an
* interface that manually extends this one does <i>not</i> define
* an annotation interface. Also note that this interface does not itself
* define an annotation interface.
*
* More information about annotation interfaces can be found in section
* {@jls 9.6} of <cite>The Java Language Specification</cite>.
*
* The {@link java.lang.reflect.AnnotatedElement} interface discusses
* compatibility concerns when evolving an annotation interface from being
* non-repeatable to being repeatable.
*
* @author Josh Bloch
* @since 1.5
*/
// /** ~ */ : javadoc.exe를 위한 주석
// 소스코드와 소스코드에 대한 설명
public interface Annotation {
...
마찬가지로 소스코드와 설정파일(XML)을 따로 작성하여 소스코드와 문서와 같이 문제가 빈번하게 발생했다. 이를 해결하기 위해 문서와 설정에 대한 정보를 합쳐서 작성한 것이 애너테이션이다.
설정파일(XML)은 여러 사람이 공유해야하는 경우 동시에 수정할 수 없는 불편함이 있음 애너테이션을 사용하면 각자 자기 프로그램에 설정정보를 애너테이션으로 추가하면 된다.
애너테이션은 특정 프로그램을 위한 정보로 예를 들어 @Test는 Junit이라는 특정 프로그램에 정보 제공(설정 정보)을 위한 것이라는 의미
- Junit : Java 단위 테스트 프로그램
@Test // 이 메서드가 테스트 대상임을 테스트 프로그램에게 알린다.
public void method() {
}
표준 애너테이션
Java에서 제공하는 애너테이션
@Override : 오버라이딩을 올바르게 했는지 컴파일러가 체크하게 한다.
- 오버라이딩시 메서드 이름을 잘못적는 실수를 하는 경우가 많다.
- 오버라이딩시 메서드 선언부에 붙여야 한다.
class Parent {
public void method() {}
}
class Child extends Parent{
@Override // 이 메서드가 테스트 대상임을 테스트 프로그램에게 알린다.
public void method() {}
}
@Deprecated : 앞으로 사용하지 않을 것을 권장하는 필드나 메서드에 붙인다.
@Deprecated
public int getDate() {
return normalize().getDayOfMonth();
}
@FuncthionalInterface : 함수형 인터페이스에 붙이면, 컴파일러가 올바르게 작성했는지 체크
- 함수형 인터페이스에는 하나의 추상메서드만 가져야 한다는 제약이 있음
- 함수형 인터페이스임을 알리는 효과를 가진다.
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
@SuppressWarnings : 컴파일러의 경고메시지가 나타나지 않게 억제한다.
- 괄호()안에 억제하고자하는 경고의 종류를 문자열로 지정한다.
- 컴파일러가 알려준 경고를 확인하고 문제가 없음을 알리는 효과가 있다.
@SuppressWarnings("unchecked")
public static void main(String[] args) {
Object obj = new Object();
ArrayList list = new ArrayList();
list.add(obj);
}
- 둘 이상의 경고를 동시에 억제할 수 있다.
@SuppressWarnings({"경고종류1", "경고종류2","경고종류3"}) // 배열과 같이 중괄호 사용
메타 애너테이션
메타 에너테이션은 '애너테이션을 위핸 애너테이션'으로 애너테이션을 만들때 사용한다.
메타 애너테이션은 java.lang.annotation패키지에 포함되어있다.
@Target : 애너테이션을 정의할 때, 적용 대상 지정에 사용한다.
- @SuppressWarnings
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE, MODULE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
String[] value();
}
@Retention : 애너테이션이 유지(retention)되는 기간을 지정하는데 사용
RUNTIME은 실행시까지, CLASS는ClassLoar까지 (ClassLoar : 클래스 파일을 메모리에 올려주는 역할)
- 컴파일러에 의해 사용되는 애너테이션의 유지 정택책은 SOURCE이다.
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
- 실행시에 사용 가능한 애너테이션의 정책은 RUNTIME이다.
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface FunctionalInterface {
@Documented
- javadoc으로 작성한 문서에 포함시키려면 @Documented를 붙인다.
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface FunctionalInterface {
@Inherited
- 애너테이션을 자손 클래스에 상속하고자 할 때,
@Inherited
@Target(ElementType.TYPE)
@interface SuperAnno{}
@SuperAnno
class Parent {}
// Child 클래스에 @SuperAnno 애너테이션이 붙은 것으로 인식
class Child extends Parent{}
@Repeatable
- 반복해서 붙일 수 있는 애너테이션을 정의할 때 사용
@Repeatable(ToDos.class) // 애너테이션을 여러 번 반복해서 쓸 수 있게 만든다.
@interface ToDo {
String value();
}
- @Repeatable인 애너테이션을 하나로 묶을 컨테이너 애너테이션을 정의해야한다.
@interface ToDos { // 여러 개의 ToDo애너테이션을 담을 컨테이너 애너테이션
ToDo[] value(); // ToDo애너테이션 배열타입의 요소를 선언, 이름이 반드시 value여야 함;
}
- @Repeatable인 애너테이션을 반복해서 붙일 수 있다.
@ToDo("one")
@ToDo("two")
'Java' 카테고리의 다른 글
[JAVA] 쓰레드(thread) (0) | 2024.01.18 |
---|---|
[JAVA] 애너테이션(Annotation) (0) | 2024.01.10 |
[JAVA] 제네릭(Generics) (0) | 2023.11.25 |
[JAVA] Collections 클래스 (0) | 2023.11.24 |
[JAVA] Map 인터페이스 (0) | 2023.11.11 |