inblog logo
|
나새끼메이커
    TIL (Today I Learned)

    열거형 (Enumerations) - 실습

    Eungae's avatar
    Eungae
    Dec 09, 2025
    열거형 (Enumerations) - 실습
    Contents
    trial 1 : for문 활용trial 2. enum을 List로 바꿔보자.평가TIL 요약

    💡

    실습 문제
    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;
      }
    }
    // 날씨가 맑아요!

    하지만 나는 더 해보고 싶었다.

    /* 목표:
    "날씨가 맑아요."
    "오늘은 흐려요."
    "비가 오네요." 를 순차적으로 출력하기*/

    trial 1 : for문 활용

    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에게 물어봐서 해결했다.

    문제를 풀 때는 이 생각을 못 했어서, 다른 방법을 시도했었다.

    trial 2. enum을 List로 바꿔보자.

    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끼리 비교해야 한다는 걸 배웠다.

    TIL 요약

    1. if문의 조건식은 bool 판단이 가능해야 한다.

    2. enum은 List로 변환 시 enum name 자체가 Type이 된다.
      enum Weather → Weather.values.toList() == List<Weather>

    3. switch문에서 case에 들어가는 항목은 상수constant만 가능하다.

    4. enum은 switch랑 궁합이 좋다.

    5. enum은 enum끼리 작업해야 한다.

    Share article
    Contents
    trial 1 : for문 활용trial 2. enum을 List로 바꿔보자.평가TIL 요약

    나새끼메이커

    RSS·Powered by Inblog