안녕하세요~~ 벌써 스위프트 문법도 15번째 포스트입니다. 언제가 마지막이 될지는 모르겠지만 항상 초심을 잃지 않고 열심히 공부를 해야겠습니다. 오늘은 스위프트에서 자료형의 한 종류인 열거형에 대해 공부를 해보겠습니다!
열거형인 enum은 enumerations의 약자입니다. 애플 개발자 문서에서는 enumerations를 다음과 같이 정의합니다. "열거형에서는 관련 값 그룹의 공통 유형을 정의하며 코드 내에서 형식별로 안전한 방식으로 값을 사용할 수 있습니다." 쉽게 한마디로 정리해보면 관련있는 데이터들이 멤버로 구성되어 있는 자료형 객체입니다.
열거형을 쓰는 이유
- 원치 않는 값이 잘못 입력되는 것 방지
- 입력 받을 값이 한정되어 있을 때
- 특정 값 중 하나만 선택하게 할 때
열거형의 형태는 다음과 같습니다.
enum 열거형명 {
//열거형 정의
}
enum Compass {
case North
case South
case East
case West
}
//하나의 case문에 멤버들 나열하는 것도 가능
enum Compass {
case North, South, East, West
}
위의 코드는 열거형을 정의하는 코드입니다. 첫번째는 열거형의 형태를 나타낸거고 두번째는 일반적인 열거형의 정의방법입니다. 보시다시피 case를 써서 정의를 할 수 있습니다. 세번째의 코드처럼 하나의 case문에 멤버들을 나열하는 것도 가능하죠.
그렇다면 이런 열거형에 어떻게 접근하는지 코드를 짜보고 실행을 해보겠습니다.
print(Compass.North)
var x : Compass = Compass.South
print(x)
x = .North
print(x)
클래스나 구조체에서 프로퍼티나 메소드에 접근하는 방식이랑 똑같은 방법으로 접근을 할 수 있습니다. 그리고 변수나 상수안에 열거형의 값들을 넣어줄 수도 있습니다. 약간의 차이점이라고 한다면 열거형에서는 프로퍼티에 .을 써 접근을 할 수 없었습니다. Compass를 상속받는 프로퍼티를 만들어도 x.South처럼 쓸 수 없다는 것이죠. 그리고 Compass라는 타입이 명확하다면 .North만 써서 열거형에 접근할 수 있습니다. 그럼 코드를 실행해보겠습니다.
잘 실행되었습니다.
그리고 열거형은 스위치문과 같이 많이 쓰인다고 합니다. 열거형과 switch문이 같이 쓰일때 가장 큰 특징은 switch의 비교값에 열거형 타입이 위치할 때 모든 열거형 케이스를 포함한다면 default를 작성할 필요가 없다는 점입니다. 코드로 살펴보죠!
switch x {
case .North:
print("북")
case .South:
print("남")
case .East:
print("동")
case .West:
print("서")
}
위에 코드에서 x = .North라고 해주었으므로 "북"이 출력됩니다.
열거형 안에는 메소드를 쓸 수도 있습니다.
enum Week : String {
***
## 열거형의 rawValue
열거형의 멤버들은 정수값을 가질 수도 있습니다. rawValue를 사용하면 됩니다. case별로 각각 다른 값을 가져야합니다
case Mon, Tue, Wed, Thur, Fri, Sat, Sun
func printWeek() {
switch self {
case .Mon, .Tue, .Wed, .Thur, .Fri:
print("주중")
case .Sat, .Sun:
print("주말")
}
}
}
Week.Sun.printWeek()
Week.Tue.printWeek()
Week 열거형 속에 일곱 요일을 멤버로 정의하고 안에 주말이냐 주중이냐를 출력해주는 메소드를 만들었습니다. 실행을 해보면 잘 실행되는 것을 확인할 수 있었습니다.
열거형의 멤버들은 정수값을 가질 수도 있습니다.중요한 점은 case별로 각각 다른 값을 가져야합니다. 이것을 바로 rawValue라고 부릅니다.
//Int형 rawValue
enum Color: Int {
case red = 1
case green = 2
case blue = 3
}
print(Color.red) // red
print(Color.red.rawValue) // 1
print(Color.blue) // blue
print(Color.blue.rawValue) // 3
위 코드에서 확인할 수 있듯이 각 case에 rawValue를 정해주었습니다. 이 값들은 .rawValue로 접근이 가능한 것을 확인할 수 있었습니다. 마치 딕셔너리와 비슷한 구조이군요!
enum Color: String {
case red = "빨"
case green = "초"
case blue
}
print(Color.red) //red
print(Color.red.rawValue) //빨
print(Color.blue) //blue
print(Color.blue.rawValue) //blue
이렇게 정수형 뿐만아니라 문자열 rawValue도 설정을 해줄 수 있습니다. 여기서 중요한 점은 만약 rawValue값을 지정해주지 않았다면(위 코드에서는 blue) .rawValue값이 그냥 멤버 이름으로 나온다는 것입니다.
오늘은 열거형에 대해 알아보았습니다. 데이터들을 잘 관리하기 위해서는 꼭 잘 알고 넘어가야 겠습니다. 그럼 오늘도 수고 많으셨습니다!