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 발생
}
}
'Language > Java' 카테고리의 다른 글
[Java] switch/case 문 (0) | 2022.08.01 |
---|---|
[Java] if 문 (0) | 2022.08.01 |
[Java] 집합 (Set) (0) | 2022.07.31 |
[Java] 맵 (Map) (0) | 2022.07.31 |
[Java] 리스트 (List) (0) | 2022.07.31 |