상수와 enum이란? 


1. 상수란?

public static final int AMELICANO_WATER = 180;
static final의 옵션을 사용하여 값을 변경하지 못하게 하는 것

 

간단한 예제

public class Recipe {
    /*
     *  아메리카노
     * */
    public static final int AMELICANO_WATER = 180;
    public static final int AMELICANO_ESPRESSO = 30;

    /*
     *  라떼
     * */
    public static final int LATTE_MILK = 180;
    public static final int LATTE_ESPRESSO = 30;

    public static void main(String[] args) {
        int type = AMELICANO_WATER;

        switch (type) {
        case AMELICANO_WATER :
            System.out.println(180+"g");
            break;
        case AMELICANO_ESPRESSO :
            System.out.println(30+"g");
            break;
        }
    }
}

콘솔 창

상수를 변경하려 한다면  아래와 같이 에러가 발생한다 


2. enum이란?

enum Americano{
    WATER(180), ESPRESSO(30);
}


상수와 같은역활을 하며 코드의 가독성을 높혀주고 코드의 양을 줄일 수 있다.
위 코드는 enum 이며 아래 코드는 static final로 선언한 것이다.

class Americano{
    public static final int WATER = 180;
    public static final int ESPRESSO = 30;
 }

3. 상수 vs enum

코딩을 할 때 쓰는 시간비율이  코드를 짜는 시간 50% 디버그를하는 시간 50% 라고 생각하고 컴파일 시 에러가 발생하는 코드를 작성할 경우 코드를 짜는시간비율이 증가 , 반대로 코드를 빨리 작성시  자신이 만든 서비스에서 에러가 발생하여 디버그하여 에러를 잡는다면 디버그를 하는 시간이 증가할 것이다. 나는 코드를 늦게 작성이 되더라도 컴파일 시 에러가 발생하는 경우를 더욱 선호한다 사실 그래도 서비스시 버그가 있는 경우가 많긴하다... ㅎㅎ 이렇게 컴파일 시 미리 에러를 알 수 있는 방법중 하나인 상수를 쓰거나 enum을 쓰는 것 좋은 방법인거같다.

하지만 상수를 사용할 경우에는 if문 보다는 switch문이 가독성이 높은편인데  아래 예제를 보자

public class Recipe {
    /*
     *  아메리카노
     * */
    public static final int AMELICANO_WATER = 180;
    public static final int AMELICANO_ESPRESSO = 30;

    /*
     *  라떼
     * */
    public static final int LATTE_MILK = 180;
    public static final int LATTE_ESPRESSO = 30;

    public static void main(String[] args) {

        if(AMELICANO_WATER == LATTE_MILK) {
            System.out.println("물과 우유는 같다");
        }


        int water = AMELICANO_WATER;

        switch (water) {
        case AMELICANO_WATER :
            System.out.println(180+"g");
            break;
        case AMELICANO_ESPRESSO :
             System.out.println(30+"g");
            break;
        }
    }
}

위 코드에서 if문에 물과 우유는 같지 않지만 같다고 나온다 이런것은 컴파일시 에러가 나지않지만 

서비스시 버그로 발생하게된다.

if(AMELICANO_WATER == LATTE_MILK) {
    System.out.println("물과 우유는 같다");
}

 

방법은? 

아래의 코드와 같이 데이터 타입을 자신의 클래스로 변환해주면된다.

class Americano{
    public static final Americano WATER = new Americano();
    public static final Americano ESPRESSO = new Americano();

}

class Latte {
    public static final Latte MILK = new Latte();
    public static final Latte ESPRESSO = new Latte();
}

아래처럼 서로를 비교할 수 없다고 뜬다.

하지만 상수는 말했다시피 switch문이 가독성을 높혀주는데 위처럼 자신의 클래스를 데이터 타입으로 갖는다면...

switch문을 사용할 수 없다.  

aa


enum 사용 예제

enum Americano{
    /*
    * 상수 생성
    * */
    WATER("아리수"), ESPRESSO("콜롬비아");
    
   
    /*
    * 변수 선언
    * */
    String country;

    /*
    * 생성자 생성
    * */
    Americano(String country) {
        this.country  = country;
    }

    /*
    * 메소드 생성
    * */
    String getCountry(){
        return this.country;
    }

}

enum Latte{
    MILK("서울우유"), ESPRESSO("브라질");
    String country;
    Latte(String country) {
        this.country = country;
    }

}

public class Recipe3 {
        public static void main(String[] args) {

            Americano type = Americano.ESPRESSO;

            switch (type) {
            case WATER:
                System.out.println("용량"+ 180 + "g 원산지 : "+ Americano.WATER.country);
                break;
            case ESPRESSO:
                System.out.println("용량"+ 30 + "g 원산지 : "+ Americano.ESPRESSO.getCountry());
                break;
            }
        }
}

 

간단한 설명

위 코드처럼 상수를 적은 코드양으로 작성 할 수 있으며 변수 및 생성자는 물론 메소드까지 생성이 가능하다.

그리고 아래 사진처럼 바로 에러을 잡을 수 있다.

 

위 예제를 돌리면 아래 사진처럼 콘솔에 찍힌다.

참고로 아래 코드는 같은 것이 찍힌다.

Americano.WATER.country
Americano.WATER.getCountry()

 

 

마지막으로.... 저도 공부하는중입니다. 만약 틀린 부분이 있으면 말씀해주세요 저도 공부한 내용을 제가 제 시야에서

이해한 정도로 적고있습니다. ㅎㅎ 

복사했습니다!