3.3 Concept Note - Enumeration : 효과적으로 목록 관리하기

Jay·2025년 2월 6일

Level 3 - SingleView App

목록 보기
3/24

이전 챕터에서 시간을 설정할 때 다음과 같은 코드를 사용했다.

let formatter = DateFormatter()   
formatter.timeStyle = .short

여기서 timeStyle은 이너머레이션(Enumeration) 으로 만들어진 타입으로서 보통 ‘열거형'이라고 번역되지만 이 책에서는 이너머레이션이라는 키워드를 사용하는데 이제 이너머레이션이 왜 필요한지에 대해 알아보자.

나라를 입력하면 해당 수도를 출력하는 아래와 같은 함수가 있다.

func printCapital(nation: String) {
     
switch nation {   
	case "Korea":       
	 print("Seoul")   
	case "Japan":       
	 print("Tokyo") 
      case "France":
       print("Paris")  
	default:       
	 print("error")   
	}
}

printCapital(nation : “Korea”) 을 실행하면 “Seoul”이 출력될 것이다.

그런데 실수로 파라미터에 “korea” 라고 입력한다면 “error” 가 출력된다.

단편적인 예를 든것이지만 프로그램이 복잡해 질수록 이렇게 버그를 유발할 수 있는 요소들이 많아지면 개발이 상당히 힘들어 진다.

이번엔 나라에 대한 목록을 이너머레이션으로 구현해 보자.
간단하게 ‘enum’ 이란 키워드를 사용하면 된다.

enum nationType {   
    case Korea   
    case Tokyo
    case France
}

nationType. 을 입력하면 입력한 나라목록이 표시된다. 함수를 다시 만들어보자

nation 파라미터에 인자타입으로 미리 이너머레이션으로 만들어 놓은 nationType 으로 지정한다.


func printCapital(nation : nationType ) {       

     switch nation {   
       case nationType.Korea:       
        print("Seoul")   
       case .Tokyo:           // enum 으로 만든 타입은 이렇게 생략 가능하다.
        print("Japan")    
       case .France
        print("Paris")       
    }		 	// 모든 목록에 대한 case 를 구현하면 default문 생략 가능하다
}

printCapital(nation: .Korea)

이제 파라미터를 입력할때 .만 입력해주면 구현한 목록이 표시되므로 잘못 입력할 염려가 없다

더 나아가 원본값(rawValue)에 대해 알아보자.
enum 의 각 case 에 대해 값을 설정해 줄수 있다.

enum nationType : Int {      // rawValue의 타입을 Int로 지정한 것이다
     case Korea   	// 값을 설정하지 않을경우 기본값인 0부터 차례대로 증가한다
     case Tokyo
     case France = 10 		// rawValue의 값을 10으로 설정했다
}

nationType.Korea.rawValue 의 값은 0 이고 case 에 따라 자동으로 1씩 증가한다

이번엔 각 케이스에 값을 연동시킬수 있는 연관값(associated value)에 대해 알아보자.

enum nationType {     
     case Korea(String)  // () 안에 연관시킬값의 타입을입력한다. 
     case Tokyo(String)
     case France(String)
}

이제 각 나라의 수도를 연관값으로 입력해보자.

let korea = nationType.Korea(“Seoul”)  // () 안에 연관시킬 값의 타입을 입력한다. 

switch korea {
 
  case .korea(let captital) 
  print(capital) // “Seoul”
}

korea 케이스에 대한 인스턴스를 생성하면서 연관값으로 “Seoul” 을 입력했다.
입력된 연관값을 추출하려면 케이스를 판별할때 () 안에 값을 받을 변수를
선언해주면 입력된 연관값에 들어온다. 여기서는 capital 로 선언해서 프린트해보았다.

원본값과 달리 각 인스턴스에 대해 다른값을 입력할 수 있고 복수로도 설정이 가능하지만 원본값과 동시 사용은 불가한점을 알아두자.

profile
Software Engineer Specialized on iOS

0개의 댓글