Language/Java

[Java] 상수집합 (Enum)/형변환과 final

arajo 2022. 8. 1. 01:22
728x90

Enum은 서로 관련이 있는 여러 개의 상수 집합을 정의할 때 사용하는 자료형이다.

Enum 만들기

예를 들어 어떤 커피숍에서 판매하는 커피의 종류가 다음과 같다고 가정한다.

  • 아메리카노
  • 아이스 아메리카노
  • 카페라떼

이와 같이 3종류의 커피를 판매한다고 하면 다음과 같이 Enum 으로 상수집합을 만들 수 있다.

enum CoffeeType {
    AMERICANO,
    ICE_AMERICANO,
    CAFE_LATTE
};

정의한 상수 집합은 다음과 같이 사용할 수 있다.

public class Sample {
    enum CoffeeType {
        AMERICANO,
        ICE_AMERICANO,
        CAFE_LATTE
    };

    public static void main(String[] args) {
        System.out.println(CoffeeType.AMERICANO);  // AMERICANO 출력
        System.out.println(CoffeeType.ICE_AMERICANO);  // ICE_AMERICANO 출력
        System.out.println(CoffeeType.CAFE_LATTE);  // CAFE_LATTE 출력
    }
}

또는 다음과 같이 반복문에서 사용할수도 있다.

public class Sample {
    enum CoffeeType {
        AMERICANO,
        ICE_AMERICANO,
        CAFE_LATTE
    };

    public static void main(String[] args) {
        for(CoffeeType type: CoffeeType.values()) {
            System.out.println(type);  // 순서대로 AMERICANO, ICE_AMERICANO, CAFE_LATTE 출력
        }
    }
}

Eunm을 사용하는 이유(장점)

  • 매직넘버(1과 같은 숫자 상수값)를 사용할 때보다 코드가 명확해진다.
  • 잘못된 값을 사용함으로 인해 발생할 수 있는 위험성이 사라진다.
※ 프로그래밍에서 상수로 선언하지 않은 숫자를 매직넘버라고 한다.

형변환

String num = "123";

자료형은 문자열이지만 그 내용은 숫자로 이루어진 값이다. 이럴 경우에 문자열을 정수(integer)로 바꿀수 있다. 문자열을 정수로 바꾸려면 다음과 같이 Integer 클래스를 사용한다.

※ Integer는 int자료형의 Wrapper 클래스이다.
public class Sample {
    public static void main(String[] args) {
        String num = "123";
        int n = Integer.parseInt(num);
        System.out.println(n);  // 123 출력
    }
}

이번에는 반대로 정수 123을 문자열 "123"으로 바꾸는 방법이다. 정수를 문자열로 바꾸는 가장 쉬운 방법은 정수 앞에 빈문자열("")을 더해 주는 것이다.

public class Sample {
    public static void main(String[] args) {
        int n = 123;
        String num = "" + n;
        System.out.println(num);  // 123 출력
    }
}

또는 다음과 같이 변환할 수도 있다.

public class Sample {
    public static void main(String[] args) {
        int n = 123;
        String num1 = String.valueOf(n);
        String num2 = Integer.toString(n);
        System.out.println(num1);  // 123 출력
        System.out.println(num2);  // 123 출력
    }
}

실제 프로젝트에서 정수와 문자열 사이의 변환은 매우 자주 사용한다.

그리고 소숫점이 포함되어 있는 숫자형태의 문자열은 마찬가지 방법으로 Double.parseDouble 또는 Float.parseFloat를 사용하여 형변환할 수 있다.

public class Sample {
    public static void main(String[] args) {
        String num = "123.456";
        double d = Double.parseDouble(num);
        System.out.println(d);
    }
}

자주 사용하지는 않지만 다음처럼 정수와 실수 사이의 형 변환도 가능하다.

public class Sample {
    public static void main(String[] args) {
        int n1 = 123;
        double d1 = n1;.  // 정수를 실수로 바꿀때에는 캐스팅이 필요없다.
        System.out.println(d1);  // 123.0 출력

        double d2 = 123.456;
        int n2 = (int) d2;. // 실수를 정수로 바꿀때에는 반드시 정수형으로 캐스팅해 주어야 한다.
        System.out.println(n2);  // 소숫점이 생략된 123 출력
    }
}

실수를 정수로 변환하면 실수의 소숫점은 제거된다.

그리고 실수 형태의 문자열을 정수로 변경하려고 하면 NumberFormatException이 발생하므로 주의해야 한다.

public class Sample {
    public static void main(String[] args) {
        String num = "123.456";
        int n = Integer.parseInt(num);  // 실수 형태의 문자열을 정수로 변환할 경우 NumberFormatException이 발생한다.
    }
}

final

자바의 final은 자료형에 값을 단 한번만 설정할수 있게 강제하는 키워드이다. 즉, 값을 한번 설정하면 그 값을 다시 설정할 수 없다는 말이다.

public class Sample {
    public static void main(String[] args) {
        final int n = 123;  // final 로 설정하면 값을 바꿀수 없다.
        n = 456;  // 컴파일 에러 발생
    }
}

리스트의 경우도 final로 선언시 재할당은 불가능하다.

import java.util.ArrayList;
import java.util.Arrays;

public class Sample {
    public static void main(String[] args) {
        final ArrayList<String> a = new ArrayList<>(Arrays.asList("a", "b"));
        a = new ArrayList<>(Arrays.asList("c", "d"));  // 컴파일 에러 발생
    }
}

final은 프로그램 수행 도중 그 값이 변경되면 안되는 상황에 사용한다.

Unmodifiable List

리스트의 경우 final로 선언시 리스트에 값을 더하거나(add) 빼는(remove) 것은 가능하다. 다만 재할당만 불가능할 뿐이다. 만약 그 값을 더하거나 빼는 것도 불가능하게 하고 싶은 경우에는 List.of로 수정이 불가능한 리스트(Unmodifiable List)를 생성해야 한다.

import java.util.List;

public class Sample {
    public static void main(String[] args) {
        final List<String> a = List.of("a", "b");
        a.add("c");  // UnsupportedOperationException 발생
    }
}