정의: 상수 선언 시 입력하는 값에 대한 범위를 제역하기 위한 자료형
- 어떤 클래스가 상수로만 이루어져 있을 땐 반드시 클래스로 선언할 필요는 없다.
-> 이럴 때, class를 enum이라고 선언하면 이 객체는 상수의 집합이다.
- 생성방법
접근제한자 enum enum명{
대문자enum상수명1, 대문자enum상수명2, ...;
}
- 예제
public enum Animals {
TIGER, LION, CAT, DOG;
}
valueOf( ), name( )
- valueOf( ): 문자열을 enum으로 전환
- name( ): enum을 문자형으로 전환
public class MainEx {
public static void main(String[] args) {
// valueOf(): 문자열을 enum으로 만들어 줌.
Animals tiger= Animals.valueOf("TIGER");
System.out.println(tiger);
// tiger -> eunm 자료형
// Animals.TIGER -> enum 자료형
System.out.println(Animals.TIGER.equals(tiger));
// TIGER -> String 자료형
System.out.println(tiger.equals("TIGER"));
// name(): eunm을 문자형으로 만들어 줌.
String name_tiger= tiger.name();
System.out.println(name_tiger.equals("TIGER"));
}
}
--------------Console----------------------------------
TIGER
true
false
true
ordinal( ): 전체 중에 해당 열거 객체가 몇 번째인지 알려준다.
import kr.co.tj.Animals;
public class MainEx {
public static void main(String[] args) {
int idx = Animals.CAT.ordinal();
System.out.println(idx);
}
}
------------------Console--------------------
2
- 하지만 enum 상수 사이에 값을 추가하거나 이미 사용한 정수에 대응되는 새로운 enum 상수값을 사용할 수가 없는 단점이 있다
생성 예제(객체필드에 따로 저장)
public enum Numbers {
TEN(10), TWENTY(20), THIRTY(30);
private final int num;
// 생성자를 만든 후 아래와 같이 설정
private Numbers(int num) { // 접근제한자가 private!! 매개변수는 위의 값의 자료형
this.num = num;
}
public int getNum() { // get메서드
return num;
}
}
활용 예제
public interface HeroSpec {
// public static final은 생략(복습)
int HERO_LEV_1_ATTACK_POWER = Numbers.TEN.getNum(); //Numbers enum의 Ten의 값을 가져온다.
int HERO_LEV_2_ATTACK_POWER = Numbers.TWENTY.getNum();
int HERO_LEV_3_ATTACK_POWER = Numbers.THIRTY.getNum();
}
메인메서드에 적용
public class Hero {
private int attackPower;
public Hero(int attackPower) {
this.attackPower = attackPower;
}
}
---------------------------------------------------------
public class MainEx {
public static void main(String[] args) {
// 자료형 주의!!
int what = Numbers.TEN.getNum();
System.out.println(what);
String what1 = Numbers.TEN.name();
System.out.println(what1);
Hero hero = new Hero(HeroSpec.HERO_LEV_1_ATTACK_POWER); // hero객체에 파워 부과
}
}
------------------Console-------------------------------
10
TEN
Scanner, nextLine( )
- 선언공식
Scanner 변수명 = new Scanner(System.in);
~~~~
sc.close();
- 예제 (switch~case에서 enum 사용)
import kr.co.tj.Animals;
public class Test2 {
public static void me1(String likeAnimal) {
Animals what = Animals.valueOf(likeAnimal); // 문자열을 enum으로 바꿈
switch (what) {
case TIGER:
System.out.println("호랑이 기운");
break;
case LION:
System.out.println("사자의 눈물");
break;
case CAT:
System.out.println("장화 신은 고양이");
break;
default:
System.out.println("몰라");
break;
}
}
}
--------------------------------------------------
import java.util.Scanner;
import kr.co.tj.Animals;
public class MainEx {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("좋아하는 동물을 대문자로 적으시오.");
String likeAnimal = sc.nextLine();
Test2.me1(likeAnimal);
sc.close();
}
}
----------------Console------------------------------------------
좋아하는 동물을 대문자로 적으시오.
CAT
장화 신은 고양이
- Scanner(System.in): 콘솔 창 내에서 값을 입력받겠다
- next() : 띄어쓰기(공백) 기준으로 데이터를 입력받는다.
- nextLine() : 라인(한 줄) 기준으로 데이터를 입력받는다.
- sc.close(): Scanner를 닫는다.
연습
1.
public class Test {
enum Weapon{
BOW("활"), SWORD("검"), GUN("총");
private final String name;
// 생성자 만든 후 아래같이 설정
// 매개변수->위의 자료형
// this.name = name;
private Weapon(String name) {
this.name = name;
}
// get메서드
public String getName(){
return name;
}
}
}
------------------------------------------------------------------------
public class MainEx {
public static void main(String[] args) {
// BOW 출력
String what = Weapon.BOW.name(); //name -> enum안의 자료 가져오기
System.out.println(what);
// 검 출력
what = Weapon.SWORD.getName(); //get메서드 -> enum안의 자료의 값 가져오기
System.out.println(what);
}
}
------------------Console------------------------------------------
BOW
검
2.
public enum Testa {
PORK("돼기고기", "갈매기살"), BEEF("소고기", "소갈비살");
private final String name1;
private final String name2;
private Testa(String name1, String name2) {
this.name1 = name1;
this.name2 = name2;
}
public String getName() {
return name1+name2;
}
}
----------------------------------------------------------------
public interface Meat {
String KIND_OF_MEAT1 = Testa.PORK.getName();
String KIND_OF_MEAT2 = Testa.BEEF.getName();
}
-----------------------------------------------------------------
public class MainEx {
public static void main(String[] args) {
String what = Testa.PORK.name();
System.out.println(what);
what = Testa.BEEF.getName();
System.out.println(what);
}
}
--------------------------Console----------------------------------
PORK
소고기소갈비살
'자바(java)' 카테고리의 다른 글
예외처리(Exception) (1) | 2023.03.13 |
---|---|
내부클래스(Inner Class) (0) | 2023.03.13 |
람다식(Lambda) (0) | 2023.03.10 |
DTO(Data Transfer Object) 클래스 (0) | 2023.03.09 |
인터페이스(Interface) (0) | 2023.03.09 |