본문 바로가기
공부/java

자바(java)의 열거형 표현

by 샤샤샤샤 2023. 1. 23.

열거형

 

열거형: 함수 밖, 클래스 안에서 선언하는 형식

어떤 값을 1이나 2처럼 숫자로 정의하기보다, 문자로 값을 정의하면 가독성이 향상되는 경우 사용한다.

다만 거의 쓰이지 않는다.

예) 문자 야구게임:

0== 스크라이크

1== 볼 

변경 전) if( ball == 0 )   => 스트라이크 

변경 후)  if( ball == Ball.Strike )

 

형식

   enum 열거형이름 {  상수1, 상수2, ... }   //; 을 안쓴다.

 

순서에 맞추서 정수값이 부여된다.

    //         정수값 0      1        2
    enum Hero { Ironman, Superman, Batman  }
    enum SRP { Sissors, Rock, Paper }
    enum Ball { Strike, Ball }

 

열거형 타입을 정수로 출력하고 싶으면 ordinal함수를 사용하면 된다.

System.out.println( Hero.Ironman.ordinal() );      출력값 => 0

솔직히 잠시 다뤄본 소감으로는 그냥 짜증나기만 한다.

ordinal함수를 사용해서 값을 구한다고 하더라도, 그게 정수형으로 변형되거나 인덱스 번호를 추출해낸 것이 아니다. 그래서 정수형이 대다수인 코드에서는 다루는데 너무 제약이 많다. 더군다나 보기에는 편할지 몰라도 수정할때는 아주 고역이다. 가능하면 안쓰는걸 추천한다.

import java.util.Random;

public class ex54 {
    //열거형의 선언 : 함수 밖 + 클래스 안에서 선언한다.
    //형식
    // enum 열거형이름 {  상수1, 상수2, ... }

    //         정수값 0      1        2
    enum Hero { Ironman, Superman, Batman  }
    enum SRP { Sissors, Rock, Paper }
    enum Ball { Strike, Ball }

    public static void main(String[] args) {
        // 열거형 Enumeration enum
        // 사용하는 이유 : 어떤 값을 0,1,2 숫자로 정의하기보다
        //               문자로 값을 정의하면, 가독성이 향상!
        // 예) 문자 야구게임 : 0 스크라이크 1 볼
        //   if( ball == 0 ) //스트라이크
        // 변경예)
        //   if( ball == Ball.Strike )
        // 상수로 지정할 때는 이렇게 사용했다.
        // public static final int HERO_IRONMAN = 0;
        // public static final int HERO_SUPERMAN = 1;
        // public static final int HERO_BATMAN = 2;

        //열거형 타입을 문자열로 출력
        System.out.println( Hero.Ironman );
        System.out.println( Hero.Superman );
        System.out.println( Hero.Batman );
        //열거형 타입을 숫자로 출력
        System.out.println( Hero.Ironman.ordinal() );
        System.out.println( Hero.Superman.ordinal() );
        System.out.println( Hero.Batman.ordinal() );
        //열거형 변수를 선언한다.
        Hero myHero = Hero.Ironman;
        if( myHero == Hero.Ironman ){
            System.out.println("아이언맨입니다~");
        }
        //열거형은 내부적으로 정수형변수이므로, 
        //switch문과 연결하면 좋다.
        switch ( myHero ) {
            case Ironman:
                System.out.println("아이언맨!");
                break;
            case Superman:
                System.out.println("수퍼맨!");
                break;
            case Batman:
                System.out.println("배트맨!");
                break;
            default:
                System.out.println("그외의 값!");
                break;
        }
        //연습문제 36 - 열거형
        // 랜덤값 0,1,2를 발생시켜,
        // 0이면 가위, 1이면 바위, 2이면 보로 열거형변수를 설정한다. 
        // switch문장으로 열거형변수를 가위,바위,보로 출력하시오.
        Random rand = new Random();
        int randomInt = rand.nextInt(3); //0~2
        SRP srp = SRP.Sissors;
        if( randomInt == 0 ){
            srp = SRP.Sissors;
        }else if( randomInt == 1 ){
            srp = SRP.Rock;
        }else{
            srp = SRP.Paper;
        }
        switch (srp){
            case Sissors:
                System.out.println("가위!");
                break;
            case Rock:
                System.out.println("바위!");
                break;
            case Paper:
                System.out.println("보!");
                break;
        }
    }
}
import java.util.Random;

public class ex55 {
    enum SRP { SISSORS, ROCK, PAPERS }
    public static void main(String[] args) {
        //연습문제 37 - enum과 if else문, switch문
        //
        //철수가 AI로봇과 가위바위보 게임을 한다.
        //철수가 가위를 낼 확률은 1/10이고, 바위를 낼 확률은 5/10,
        //보를 낼 확률은 4/10이다.
        //AI로봇은 동일한 확률로 가위바위보를 낸다.
        // 팁) 1~10까지 랜덤수를 발생하여 1이면 10%, 2~6이면 50%,
        //    7~10이면 40%의 확률임.
        //철수가 이길 때까지 가위바위보 게임을 한다고 할때
        //과정과 결과를 출력하시오.
        Random rand = new Random();
        while (true){
            int randomCholsu = rand.nextInt(10) + 1;
            int randomAI = rand.nextInt(10) + 1;
            int srpCholsu = 0; //가위 0 바위 1 보 2
            int srpAI = 0;
            SRP srpEnumC = SRP.SISSORS;
            SRP srpEnumAI = SRP.SISSORS;
            if( randomCholsu == 1 ){
                srpCholsu = 0;
                srpEnumC = SRP.SISSORS;
                System.out.println("철수:가위");
            }else if( randomCholsu >= 2 && randomCholsu <= 6 ){
                srpCholsu = 1;
                srpEnumC = SRP.ROCK;
                System.out.println("철수:바위");
            }else {
                srpCholsu = 2;
                srpEnumC = SRP.PAPERS;
                System.out.println("철수:보");
            }
            if( randomAI == 1 ){
                srpAI = 0;
                srpEnumAI = SRP.SISSORS;
                System.out.println("AI:가위");
            }else if( randomAI >= 2 && randomAI <= 6 ){
                srpAI = 1;
                srpEnumAI = SRP.ROCK;
                System.out.println("AI:바위");
            }else {
                srpAI = 2;
                srpEnumAI = SRP.PAPERS;
                System.out.println("AI:보");
            }
            //가위 바위 보
            //가위 : 가위 = 무승부
            //바위 : 바위 = 무승부
            //보 : 보 = 무승부
            if( srpCholsu == srpAI ) {
                System.out.println("무승부");
            }
            else if( srpCholsu == 0 ){
                if(srpAI == 1){
                    System.out.println("AI 승");
                }else{
                    System.out.println("철수 승");
                    break;
                }
            }
            else if( srpCholsu == 1 ){
                if(srpAI == 0){
                    System.out.println("철수 승");
                    break;
                }else{
                    System.out.println("AI 승");
                }
            }
            else if( srpCholsu == 2 ){
                if(srpAI == 0){
                    System.out.println("AI 승");
                }else{
                    System.out.println("철수 승");
                    break;
                }
            }

            if(srpEnumC == srpEnumAI ){
                //무승부
            }
            else if( srpEnumC == SRP.SISSORS ) {
                if( srpEnumAI == SRP.ROCK ){

                }else{

                }
            }
            else if( srpEnumC == SRP.ROCK ) {
                if( srpEnumAI == SRP.SISSORS ){

                }else{

                }
            }
            else {
                if( srpEnumAI == SRP.SISSORS ){

                }else{

                }
            }

        }


        //출력결과
        //철수:가위 AI로봇:가위
        //무승부
        //철수:바위 AI로봇:보
        //로봇 승
        //철수:보 AI로봇:주먹
        //철 수 승!

    }
}