Swift

[Swift] 옵셔널 타입은 열거형 타입이다

Jade-Lee 2024. 3. 20. 12:42

안녕하세요!
오늘은 옵셔널(Optional) 타입에 대해 조금 자세히 알아보는 시간을 가져보도록 할 거예요.

옵셔널 타입에 대해서는 많이들 사용하셔서 다들 알고 계시죠?

옵셔널 타입은 값이 존재하지 않을 수도 있음을 나타내는 키워드예요.

값이 존재하지 않을 때는 nil 키워드로 나타내고 있죠.

그런데!

사실 이 옵셔널 타입이 열거형 타입이라는 것을 알고 계셨나요??

(저도 1년 넘게 모르고 있다가 최근에 문법 공부를 다시 하면서 알게 되었어요 😅)

그렇다면 옵셔널 타입이 어떤 식으로 구현되어 있는지 한번 알아볼까요?

 

 

열거형 타입으로 정의된 옵셔널 타입

열거형 타입은 뭐였죠?

특정 케이스(case)들로 묶어둔 타입이에요.

예를 들어 월(Month)은 1월부터 12월까지 총 12달의 케이스로, 방향은 동, 서, 남, 북으로 총 4가지 케이스로 묶어둘 수 있죠.

위 예시처럼 옵셔널은 값이 있음, 없음 총 2가지의 케이스로 분류했어요.

 

보이시는 바와 같이 애플이 옵셔널을 제네릭 타입의 열거형 타입으로 정의했고,

값이 있음을 나타내는 some, 값이 없음(nil)을 나타내는 none 케이스로 각각 분류했어요.

보통 열거형 타입을 switch문에서 많이들 활용하시죠?

한번 옵셔널 타입을 switch문에서 활용해 볼까요~?

 

 

switch문에서 활용하는 옵셔널 타입

enum Direction {
    case east
    case west
    case south
    case north
}

var direction: Direction? = .east

switch direction {
case .some(let dir):
    print(dir)
case .none:
    print("nil")
}

// 결과: east

 

Direction이라는 열거형 타입을 만들고, direction 변수에 옵셔널 타입으로 Direction.east의 값을 넣어줬어요.

direction 변수에 값이 있는지, 없는지를 판변하기 위해 switch문에서 some 케이스와 none 케이스로 분류해서 처리를 해줬어요.

some 케이스의 결과값으로는 옵셔널이 제거된 값으로 나오게 됩니다.

그런데 만약 방향에 따른 처리를 또 하고 싶다고 하면은 어떻게 해야 될까요?

switch direction {
case .some(let dir):
    switch dir {
    case .east:
        print("동")
    case .west:
        print("서")
    case .south:
        print("남")
    case .north:
        print("북")
    }
case .none:
    print("nil")
}

 

위와 같이 switch문 안에 또 switch문을 넣어서 각 케이스에 따른 처리를 해줘야 할 거예요.

중첩 switch문을 사용한다니... 보기도 좀 어렵고 구현하기 귀찮지 않나요??😔

그래서! 애플은 옵셔널 타입을 switch문에서 활용할 때 좀 더 편하게 사용할 수 있도록 해줬어요!

switch direction {
case .east:
    print("동")
case .west:
    print("서")
case .south:
    print("남")
case .north:
    print("북")
case nil:
    print("nil")
}

 

어때요?? 아까보다 훨씬 간편하고 보기도 쉽지 않나요???

값이 있는지, 없는지를 따로 확인하지 않아도 각 케이스별로 처리할 수 있는 것이죠!

(값이 없을 수도 있기 때문에 nil 케이스도 추가를 해줘야 해요.)

그렇기 때문에 저희는 옵셔널 타입을 switch문에서 활용할 때 some, none 케이스에 대한 처리를 따로 해주지 않아도 돼요!

 

 

some 케이스를 좀 더 간편하게

switch direction {
case .some(let dir):
    print(dir)
case .none:
    print("nil")
}

 

만약 값이 존재하는지만 판단하기 위해 switch문을 활용할 때

.some(let dir)처럼 작성하는 것이 꽤 귀찮게 느껴지실 수 있습니다.

그래서 이 또한 애플에서 좀 더 편리하게 사용할 수 있도록 해줬어요!

switch direction {
case let dir?:
    print(dir)
case nil:
    print("nil")
}

 

어때요? 아까보다 훨씬 간편하죠??