■열거형
enum은 열거형(enumerated type) 즉, 서로 관련된 자료들을 번호를 매겨 관리하는 것을 뜻한다.
예를 들어 아래와 같은 것들을 열거형으로 만들 수 있다.
- 직업 : 기사, 궁수, 마법사, 힐러 등
- 한국지역 : 제주도, 경상도, 경기도 등
- 날씨 : 봄, 여름, 가을, 겨울 등
■열거형의 정의
위에서 언급했 듯이 enum(열거형)은 서로 같은 개념을 가진 상수들의 집합이다. enum을 정의하는 방법은 아래와 같다.
enum 열거형이름 { 상수명1, 상수명2, 상수명3}
RPG게임의 직업을 예로 들어보자, RPG 게임의 직업을 열거형으로 선언하면 아래와 같다.
enum RpgJob { KNIGHT, AHCHER, WIZARD, HEALER}
//상수들은 대문자,소문자 모두 사용할 수 있지만 관례적으로 "대문자"를 사용하여 작성한다.
enum에 정의된 상수를 참조하는법은 클래스에서 static 키워드를 참조하는 것과 동일하다. 즉, (열거형.상수명) 으로 참조가 가능하다.
enum RpgJob {
JOB_NONE, // 1부터 선택할 수 있게 0은 빈값으로 넣어준다.
JOB_KIGHT,
JOB_ARCHER,
JOB_WIZARD,
JOB_HEALER,
JOB_END
}
class Main{
public static void main(String[] args){
System.out.println(RpgJob.KIGHT)
}
}
위 코드에 RpgJob.KIGHT은 RpgJob 타입에 변수에 할당 될 수 있다.
enum RpgJob {
JOB_NONE, // 1부터 선택할 수 있게 0은 빈값으로 넣어준다.
JOB_KIGHT,
JOB_ARCHER,
JOB_WIZARD,
JOB_HEALER,
JOB_END
}
class Main{
public static void main(String[] args){
RpgJob myjob = RpgJob.KIGHT; // 인스턴스화
System.out.println(myjob);
}
}
아래 예제를 봐보자.
enum Level{
LEVEL_NONE,
LEVEL_EASY,
LEVEL_NORMAL,
LEVEL_HARD,
LEVEL_END,
}
public class enumTest {
public static void main(String[] args) {
RpgJob myjob = RpgJob.JOB_KNIGHT;
System.out.println(myjob);
Level level = Level.LEVEL_HARD;
switch (level){
case LEVEL_EASY:
System.out.println("쉬움");
break;
case LEVEL_NORMAL:
System.out.println("보통");
break;
case LEVEL_HARD:
System.out.println("어려움");
break;
case LEVEL_END:
System.out.println("종료");
break;
default:
System.out.println("잘못된 입력입니다");
break;
}
}
Level 열거형을 level로 변수에 할당하고 case문에 조건에 따라서 출력값을 다르게 만들어주었다. 열거형은 몇가지의 한정된 데이터 타입을 나누어 사용하는 데이터 타입이기 때문에 이렇게 경우를 나눠야 할 시에 많이 사용한다.
■열거 객체 메소드
열거 객체는 열거 상수형의 문자열을 내부 데이터로 가지고있다. 아래 표는 열거형이 가지는 데이터 및 메서드이다.
리턴타입 | 메서드(매개변수) | 설명 |
String | name() | 열거 객체가 가지고 있는 문자열을 리턴하며, 리턴되는 문자열은 상수를 정의할 때 사용되었던 상수이름과 동일하다. |
int | ordinal() | 열거 객체의 순변(0부터 시작)을 리턴한다. |
int | compareTo(비교값) | 주어진 매개값과 비교하여 순번 차이를 리턴한다. |
열거타입 | valueOf(String name) | 주어진 문자열의 열거 객체를 리턴한다. |
열거배열 | values() | 모든 열거 객체들을 배열로 리턴한다. |
■에너테이션(Annotation)
에너테이션은 주석과 같은 역항을 한다, 즉 코드 내부에는 아무런 영향을 끼치지 않으며 정보를 전달하는 것 이다. 이런 에너테이션과 주석의 차이점은 누구에게 정보를 전달하냐에 있어서 차이를 드러낸다
- 주석 : 소스코드를 읽는 사람에게 정보를 전달
- 에너테이션 : 컴퓨터에게 정보를 전달
에너테이션(Annotation)은 코드사이에서 주석 처럼 프로그래밍언어에 아무 영향도 끼치지 않으며, 다른 프로그램에게 유용한 정보를 제공할 수 있다.
@Test //아래 코드가 테스트임을 알리는 에너테이션
public void test(){ ... }
■에너테이션(Annotation)의 용도
앞서 에너테이션은 다른 프로그램에게 정보를 제공해주기 위해서 사용한다고 하였다. 그렇다면 에너테이션에겐 구체적으로 어떠한 기능이 있을까?
- 컴파일러에게 문법 오류를 체크 할 수 있도록 정보를 제공
- 프로그램을 빌드할 떄 코드를 자동으로 생성 할 수 있도록 정보를 제공
- 런타임에 특정 기능을 실행 할 수 있게 정보를 제공
■에너테이션(Annotation)의 종류
- 표준 에너테이션 : 자바에서 기본으로 제공하는 에너테이션
표준 에너테이션 | 기능 |
@override | 컴파일러에게 메서드를 오버라이드 하는 것이라 알림 |
@Deprecated | 앞으로 사용하지 않을 대상을 알릴 때 사용 |
@FuntionalInterface | 함수형 인터페이스 임을 알림 |
@SuppressWarning | 컴파일러가 경고를 나타내지 않음 |
- 메타 에너테이션 : 에너테이션에 붙는 에너테이션으로, 에너테이션을 정의할 떄 사용
메타 에너테이션 | 기능 |
@Target | 에너테이션을 정의할 때 적용되는 대상 지정 |
@Documented | 에너테이션 정보를 javadoc으로 작성된 문서에 저장 |
@Inherited | 애너테이션이 하위클래스에 상속되도록 만듬 |
@Retention | 에너테이션이 유지되는 기간을 정하는데에 사용 |
@RepeaTable | 에너테이션을 반복적으로 적용시킨다. |
- 사용자 정의 에너테이션 : 사용자가 정의하는 에너테이션
'Programming > java' 카테고리의 다른 글
[Java] 제네릭 (0) | 2022.05.17 |
---|---|
[Java] Field 와 static keyword (0) | 2022.05.10 |
[Java] Type (0) | 2022.05.04 |
[JAVA] IF문 IF ELSE 문 중첩 실행 (0) | 2022.04.26 |