Coding Log


스위프트 찔러보기 - (5) 열거형과 구조체(Enumerations and Structures)

본 블로그에 올라가는 포스팅은 애플의 공식 사이트를 대강 번역해서 작성하는 것이기 때문에 아래 링크에서 찔러보기 포스팅에서 쓸 예제 코드를 받을 수 있다.

참고 애플의 Playground를 이용한 Swift Example 다운로드 링크

열거형(Enumerations)

enum 키워드를 사용하여 열거형을 작성할 수 있다.

클래스와 다른 타입들과 마찬가지로 열거형에도 메소드가 포함될 수 있다.

enum Rank: Int {
    case ace = 1
    case two, three, four, five, six, seven, eight, nine, ten
    case jack, queen, king
    func simpleDescription() -> String {
        switch self {
        case .ace:
            return "ace"
        case .jack:
            return "jack"
        case .queen:
            return "queen"
        case .king:
            return "king"
        default:
            return String(self.rawValue)
        }
    }
}
let ace = Rank.ace // ace 
let aceRawValue = ace.rawValue // 1 

Swift는 열거형은 기본적으로 0부터 시작해서 1씩 증가하여 모든 요소들에게 값(원시값, raw value)을 부여하지만 위의 ace의 경우처럼 명시적으로 지정할수도 있다.

따라서 two는 2, three는 3등의 값을 가지게 되고, 후반부의 jack은 11, queen은 12, king은 13의 값을 가지게 된다.

let aceRawValue = ace.rawValue // 1 

rawValue를 이용해 해당 열거형 요소의 원시값에 접근할 수 있다.

enum Rank: Int

위의 열거형의 기본 타입은 Int이다.

첫 번째 요소인 one의 원본값을 가지고 있기 때문에 나머지 요소들도 순차적으로 할당된 값을 가지데 된다.

물론 문자열, 실수(부동소숫점)와 같은 타입들로도 열거형을 작성할 수 있다.

열거형의 initializer

클래스와 유사하게 init?(rawValue:) 키워드를 사용하여 열거형의 인스턴스를 만들 수 있다.

if let convertedRank = Rank(rawValue: 3) {
    let threeDescription = convertedRank.simpleDescription()
}

열거형을 구성하는 값(case values)들은 실제 값에 접근하기 위한 방법 뿐만 아니라 실제 값이기도 하다.

윈시값과 실제값이 다르지 않은 경우 굳이 첫 번째 요소값을 지정할 필요가 없다.

enum Suit {
    case spades, hearts, diamonds, clubs
    func simpleDescription() -> String {
        switch self {
        case .spades:
            return "spades"
        case .hearts:
            return "hearts"
        case .diamonds:
            return "diamonds"
        case .clubs:
            return "clubs"
        }
    }
}
let hearts = Suit.hearts // hearts 
let heartsDescription = hearts.simpleDescription() // hearts 

열거형의 참조

위의 코드에서 열거형의 선언부를 확인해보자.

enum Suit

그리고 hearts 요소에 접근한 두 가지 방법을 살펴보자.

let hearts = Suit.hearts // hearts 
let heartsDescription = hearts.simpleDescription() // hearts 

위에서 알 수 있다시피 열거형의 이름인 Suit의 형태가 지정되지 않았기 때문에 Suit.hearts이라는 전체 이름으로 써서 참조한다.

switch self {
case .spades:
    return "spades"
case .hearts:
    return "hearts"
case .diamonds:
    return "diamonds"
case .clubs:
    return "clubs"
}

switch문의 내부에서 self는 이미 내부적으로 Suit임을 알고 있기 때문에 축약된 형태인 .hearts로 참조한다.

열거형과 인스턴스

만약 열거형의 요소에 원시값이 초기화되어 있는 경우엔 해당 열거형의 모든 인스턴스가 항상 동일한 값을 가지게 된다.

하지만 열거형의 요소에 원시값이 초기화되어 있지 않은 경우엔 인스턴스를 생성할때 값이 결정되기 된다.

아래 코드에서 예시를 보자.

enum ServerResponse {
    case result(String, String)
    case failure(String)
}
 
let success = ServerResponse.result("6:00 am", "8:09 pm")
let failure = ServerResponse.failure("Out of cheese.")
 
switch success {
case let .result(sunrise, sunset):
    print("Sunrise is at \(sunrise) and sunset is at \(sunset).")
case let .failure(message):
    print("Failure...  \(message)")
}

위의 코드에서 열거형 ServerResponse는 원시값을 가지지 않고 있다.

하지만 상수 success와 failure가 선언과 동시에 초기화되며 열거형 인스턴스의 요소들이 초기화되게 된다.

구조체

구조체를 생성하려면 struct키워드를 사용한다.

구조체는 메소드, 이니셜라이저와 같은 클래스와 유사한 기능들을 제공한다.

구조체와 클래스의 가장 큰 차이점은 프로그램 코드 내에서 전달될 때 구조체는 값이 전부 복사되서 전달되지만 클래스의 경우엔 값을 참조하는 형태로 전달된다는 것이다.

struct Card {
    var rank: Rank
    var suit: Suit
    func simpleDescription() -> String {
        return "The \(rank.simpleDescription()) of \(suit.simpleDescription())"
    }
}
let threeOfSpades = Card(rank: .three, suit: .spades)
let threeOfSpadesDescription = threeOfSpades.simpleDescription()


DISQUS 로드 중…
댓글 로드 중…

트랙백을 확인할 수 있습니다

URL을 배껴둬서 트랙백을 보낼 수 있습니다