열거형(enum)은 관련 있는 여러 데이터를 하나의 이름으로 구성하여 사용하는 데이터 타입입니다.
또한 열거형은 사용자가 직접 정의하는 데이터 타입이기 때문에 커스텀 타입(Custom Type)이라고도 불립니다.
열거형(enum)은 "입력값이 한정적일 때", "특정 값 중 하나만 선택할 때" 주로 사용됩니다.
이러한 까다로운 권고? 사항이 있음에도 불구하고 열거형을 사용하는 이유는 다양하지만, 가장 큰 이유는 "원치 않는 값이 잘못 입력되는 것을 방지"할 수 있기 때문에 자주 사용된다고 생각됩니다.
즉, 안전성 때문에 사용한다고 생각(관련 있는 데이터를 하나로 묶어 사용하는 자료형이기 때문에 코드의 가독성을 높이는 장점도 있음)
열거형은 관련 있는 데이터를 하나로 구성하면서 한정적인 경우에만 사용하는 것을 권장하는데 이러한 조건을 만족하는 경우가 무엇이 있을까??🤔
아래와 같은 경우에만 열거형을 사용하는 것을 권장합니다.
위의 예시처럼 비슷한 성질의 여러 데이터를 하나로 구성할 수 있으며, 구성해야 할 데이터가 한정적(데이터의 수가 많지 않은 경우)인 경우에만 사용하는 것이 좋습니다.
✅ 열거형 사용 예시
enum Color{ case red case orange case yellow case green case blue case navy case purple //아래와 같이 콤마( ,)를 이용하여 case를 한 줄로 나열할 수 있습니다. //case red, orange, yellow, green, blue, navy, purple } print(Color.red) // red 출력 print(Color.blue) // blue 출력
여기서 출력된 값 red와 blue는 String type이 아니라 Color type입니다.
이는 열거형(enum)이 하나의 데이터 타입이기 때문입니다. (사용자가 사용자 편의에 맞게 설정하는 일종의 커스텀 타입)
print(type(of: Color.red)) //Color 출력 print(type(of: Color.blue)) //Color 출력
처음에 열거형을 변수(상수)에 바인딩하여 사용할 경우 뒤에 이어지는 코드는 열거형의 이름을 생략하여 사용할 수 있습니다. (컴파일러가 추론할 수 있기 때문)
var myFavoriteColor = Color.blue //처음 변수에 값을 초기화 할 때는 열거형명(열거형 타입)을 입력해야 한다. myFavoriteColor = .red //처음에 myFavoriteColor는 Color 타입으로 설정했기 때문에 열거형명을 생략할 수 있다.
각각의 케이스에 특정한 값(특정한 값은 Hashable한 타입만)을 지정하여 사용하는 방법입니다.
원시값에 접근하기 위해서는 .rawValue
속성을 사용해야 합니다.
✅ 열거형의 Int형 원시값
enum Color: Int{ //원시값의 데이터 타입을 명시해야 한다. case red = 0 //첫 케이스에 원시값을 할당하면, 뒤에 있는 케이스에는 자동으로 원시값이 할당된다. case orange //1 case yellow //2 case green = 5 case blue //6 case navy //7 case purple //8 } print(Color.red.rawValue) //0 print(Color.navy.rawValue) //7
✅ 열거형의 String형 원시값
원시값의 타입을 String으로 설정하고 원시값을 할당하지 않으면 case에 정의된 이름이 자동으로 할당됩니다.
enum Color: String{ case red //red -> String type case orange //orange case yellow //yellow case green = "G" //G case blue //blue case navy //navy case purple //purple } print(Color.red.rawValue) //red print(Color.green.rawValue) //G print(Color.navy.rawValue) //navy
✅ 원시값을 사용하여 case 출력
<열거형명>(rawValue: <원시값>) // 원시값과 매칭되는 열거형 case를 옵셔널타입으로 return print(Color(rawValue: 2)) // Optional(__lldb_expr_153.Color.yellow)
열거형의 case에 추가정보를 작성하여 사용하는 방법입니다.
연관값은 case를 정의한 뒤, 정의한 이름 옆에 특징의 자료형 타입과 특징의 이름을 부여하여 사용할 수 있습니다. (특징의 이름은 선택사항)
✅ 열거형의 연관값
enum Student{ case StudentName(이름: String) case StudentClass(학년: Int,반: Int) case StudentNumber(Int) //특징의 이름을 생략할 수 있다. } print(Student.StudentName(이름: "신짱구")) //StudentName(이름: "신짱구") print(Student.StudentClass(학년: 2, 반: 7)) //StudentClass(학년: 2, 반: 7) print(Student.StudentNumber(5)) //StudentNumber(5)
열거형의 기능과 사용법을 가지고 어떻게 활용할 수 있을까??🤔
연관 있는 데이터를 하나로 묶어 사용하는 열거형(enum)은 각각의 케이스마다 작업을 실행하는 switch문과 만날 때 높은 효율성과 성능을 발휘합니다. (switch문 뿐만 아니라 if문, guard문에서도 에서도 사용할 수 있음)
제어문과 함께 사용하는 방법 외에도 열거형에 메서드를 선언하여 사용하는 활용 방법 또한 존재합니다.
✅ 열거형과 switch문
enum SimplePay: String{ case naverPay case kakaoPay case samsungPay case applePay case otherPay } var mySimplePay = SimplePay.kakaoPay //kakaoPay switch mySimplePay{ case .naverPay: //변수 선언에서 타입을 결정했기 때문에 열겨형명 생략 가능 print("네이버페이로 결제") case .kakaoPay: print("카카오페이로 결제") case .samsungPay: print("삼성페이로 결제") case .applePay: print("애플페이로 결제") case .otherPay: print("기타 결제수단으로 결제") } /* 출력 결과 카카오페이로 결제 */
✅ 열거형의 메서드(func)를 선언
열거형 코드 블록 안에 메소드(method)를 선언하여 사용할 수 있습니다.
enum Rainbow: String{ case red, orange, yellow, green, blue, navy, purple func choiceColor() { switch self{ case .red, .blue, .green: print("My favorite color.") case .orange, .yellow, .navy, .purple: print("It's just...") } } } Rainbow.red.choiceColor() //My favorite color. Rainbow.yellow.choiceColor() //It's just...
참고자료: 앨런 Swift문법 마스터 스쿨