실습 문제
Q1. Weather { sunny, cloudy, rainy } enum 만들기
Q2. switch문으로 각각 다른 메시지 출력

💡
실습 문제
Q1. Weather { sunny, cloudy, rainy } enum 만들기
Q2. switch문으로 각각 다른 메시지 출력
문제 풀이의 정답은 아래와 같았다.
enum Weather { sunny, cloudy, rainy }
void main() {
Weather today = Weather.sunny;
switch (today) {
case Weather.sunny:
print('날씨가 맑아요!');
break;
case Weather.cloudy:
print('흐려요.');
break;
case Weather.rainy:
print('비가 내려요 ☔️');
break;
}
}
// 날씨가 맑아요!하지만 나는 더 해보고 싶었다.
/* 목표:
"날씨가 맑아요."
"오늘은 흐려요."
"비가 오네요." 를 순차적으로 출력하기*/enum Weather { sunny, cloudy, rainy }
void main () {
for (var today in Weather) {
if (Weather.sunny) {
print("날씨가 맑아요.");
} if else (Weather.cloudy) {
print("오늘은 흐려요.");
} if else (Weather.rainy) {
print("비가 오네요.")
}
}
// error : The type 'Type' used in the 'for' loop must implement 'Iterable'.야심차게 for문을 활용해보려고 했지만, 1차 시도는 실패했다.
실패한 이유는 : for문에는 iterable한, 즉 반복 가능한 것을 넣어야 하는데, 나는 거기에 Type을 넣었다는 것이다.
요거를 수정하자면 이렇게 수정할 수 있다.
[예제1] 성공
enum Weather { sunny, cloudy, rainy }
void main () {
for (var today in Weather.values) {
if (today == Weather.sunny) {
print("날씨가 맑아요.");
} else if (today == Weather.cloudy) {
print("오늘은 흐려요.");
} else if (today == Weather.rainy) {
print("비가 오네요.");
}
}
/*
날씨가 맑아요.
오늘은 흐려요.
비가 오네요. */수정하고 나니 확실히 알겠다.
if ( ) 괄호 안에는 true/false로 판별 가능한 조건식을 써야 하는데, 나는 그저 상수를 써놓은 셈이구나.
(today == Weather.sunny) 등의 조건식으로 수정하니, 문제가 해결되었다.
나는 이걸 TIL작성하면서 GPT에게 물어봐서 해결했다.
문제를 풀 때는 이 생각을 못 했어서, 다른 방법을 시도했었다.
enum Weather { sunny, cloudy, rainy }
void main () {
List<String> weather = Weather.values.toList();
/* error: A value of type 'List<Weather>' can't be assigned to a variable of type 'List<String>'.
Try changing the type of the variable, or casting the right-hand type to 'List<String>'. */시작부터 에러 작렬.
튜터님께 여쭤보니, enum이 List로 바뀔 때는 Weather라는 enum type으로 잡힌다는 것이다! 그러니 List<String>이 아닌 List<Weather>이라고 설정했어야 한다고.
enum Weather { sunny, cloudy, rainy }
void main () {
List<Weather> weather = Weather.values;
print(weather); // [Weather.sunny, Weather.cloudy, Weather.rainy]
for (int count = 0; count < 3; count++) {
switch (weather[count]) {
case (Weather[0]):
print("날씨가 맑아요.");
break;
case (Weather[1]):
print("오늘은 흐려요.");
break;
case (Weather[2]):
print("비가 오네요.");
break;
}
}
/* error : The expression of a constant pattern must be a valid constant.
Try making the expression a valid constant.*/List<Weather>까지는 잘 했는데 또 뭐가 문제인가!?
하니, case() 안에 들어가는 요소는 constant, 즉 상수여야 한다는 것이다.
weather[0]는 상수가 아닌, 컴파일러에서 연산을 해야하는 변수인 것!
또 하나 배웠다.
그리하여 나의 최종 실습 코드는 아래와 같다.
[예제2] 성공
enum Weather { sunny, cloudy, rainy }
void main () {
List<Weather> weather = Weather.values;
print(weather); // [Weather.sunny, Weather.cloudy, Weather.rainy]
for (int count = 0; count < 3; count++) {
switch (weather[count]) {
case (Weather.sunny):
print("날씨가 맑아요.");
break;
case (Weather.cloudy):
print("오늘은 흐려요.");
break;
case (Weather.rainy):
print("비가 오네요.");
break;
}
}[예제1] 성공
enum Weather { sunny, cloudy, rainy }
void main () {
for (var today in Weather.values) {
if (today == Weather.sunny) {
print("날씨가 맑아요.");
} else if (today == Weather.cloudy) {
print("오늘은 흐려요.");
} else if (today == Weather.rainy) {
print("비가 오네요.");
}
}
[예제2] 성공
enum Weather { sunny, cloudy, rainy }
void main () {
List<Weather> weather = Weather.values;
print(weather); // [Weather.sunny, Weather.cloudy, Weather.rainy]
for (int count = 0; count < 3; count++) {
switch (weather[count]) {
case (Weather.sunny):
print("날씨가 맑아요.");
break;
case (Weather.cloudy):
print("오늘은 흐려요.");
break;
case (Weather.rainy):
print("비가 오네요.");
break;
}
}두 코드의 결과는 동일하지만, 한 눈에 보아도 예제1이 훨씬 깔끔하다.
예제2는 enum을 List로 변환하고, 이걸 또 for문을 돌리기 위해 count까지 만들어가며 돌린 느낌.
[예제3] BEST
enum Weather { sunny, cloudy, rainy }
void main () {
for (var today in Weather.values) {
switch (today) {
case Weather.sunny:
print("날씨가 맑아요.");
break;
case Weather.cloudy:
print("오늘은 흐려요.");
break;
case Weather.rainy:
print("비가 오네요.");
break;
}
}
}GPT가 추천하는 BEST는 이거다.
enum은 switch랑 궁합이 좋다는 것이 핵심.
var today in Weather.values를 통해
enum은 enum끼리 비교해야 한다는 걸 배웠다.
if문의 조건식은 bool 판단이 가능해야 한다.
enum은 List로 변환 시 enum name 자체가 Type이 된다.
enum Weather → Weather.values.toList() == List<Weather>
switch문에서 case에 들어가는 항목은 상수constant만 가능하다.
enum은 switch랑 궁합이 좋다.
enum은 enum끼리 작업해야 한다.
나새끼메이커