본문 바로가기
Swift Study

Optional

by 창브로 2024. 2. 21.
728x90

오늘은 Swift의 옵셔널(Optional)에 대해 알아보겠습니다!

한 번 알면 쉬운데 처음에는 이해하기 어려운 내용 같습니다.

시작할게요!

 

Optional이 뭐예요?

let age: Int?

이런 물음표 많이 보셨죠?

물음표가 옵셔널입니다.

 

쉽게 말하자면 옵셔널은 nil을 값으로 사용할 수 있는 타입입니다.

그럼 또 궁금한 게 생기죠

 

그럼 nil은 뭔데요??

nil은 값이 없다는 것을 뜻 합니다.

이해가 안 되시죠?

예를 들어 오류가 나서 앱을 멈춰야 하는데 멈추면 심각한 오류로 되니까

오류는 안 낼 테니 nil 값을 넣어주고 개발자가 오류인 것을 알 수 있게 만들어 줍니다!

 

이러면 앱이 잘 꺼지는 일이 없이 되게 안정적이게 되겠죠?

 

하지만 옵셔널 타입을 사용할 때는 옵셔널이란 것을 벗겨주고 사용해야 합니다.

아래 예시를 보시죠

let optionalName: String?
let name: String

optionalName = "옵셔널창브로"
name = "창브로"

print(optionalName)
print(name)

 

 

print문이 어떻게 찍힐까요??

 

 

위 예시를 쉽게 설명하면 optinalName은 옵셔널이라는 포장지로 String타입을 감싸고 있는 형태입니다.

그러므로 사용할 때 옵셔널을 벗겨서 사용을 해야 합니다.

 

그럼 옵셔널은 어떻게 벗기나요?

옵셔널을 벗겨주는 여러 가지 행동들을 옵셔널 언래핑(Optional Unwrapping)이라고 하는데요

지금부터 알아봅시다!

 

옵셔널 언래핑에는 대표적으로 두 가지 방법이 있습니다.

1. 강제 추출

2. 옵셔널 바인딩

하나씩 알아보죠!

 

첫째 강제추출은 옵셔널 타입 뒤에 느낌표(!)를 붙이는 것으로 옵셔널을 해제하는 방식입니다.

되게 간단하죠??

아래 예시를 보겠습니다

let optionalName: String?
let name: String

optionalName = "옵셔널창브로"
name = "창브로"

print(optionalName!)
print(name)

 

 

결과는 어떻게 나올까요?

 

 

예상하는 것과 같이 옵셔널이 해제돼서 print 된 것을 확인할 수 있습니다 ☺️

하지만 이렇게 간단한 만큼 주의해야 할 점이 있습니다!

만약 optionalName에 nil값이 들어가 있다면 어떻게 될까요??

예시로 확인해 보겠습니다.

 

let optionalName: String?

optionalName = nil

print(optionalName!)

 

결과는 어떻게 될까요??

 

오류가 나며 실행이 되지 않습니다.

만약 앱을 구동 중이라면 어떻게 될까요? 앱이 꺼지겠죠??🤯

 

강제 언래핑은 정말 무조건 값이 있는 상황이 아니면 사용하지 않는 것을 추천드립니다!!!

이렇게 끝나면 아쉬우니 강제 언래핑이랑 비슷하지만 강제 언래핑보다 안전한 것을 알려드리겠습니다.

 

옵셔널 체이닝입니다. 강제 언래핑의 느낌표(!) 대신 물음표(?)를 사용해 주면 됩니다!

 

예시를 보시죠

struct Contacts {
    var phoneNum: String
    var address: [String: String]
}

struct Person {
    var name: String
    var contacts: Contacts
}


var changbro: Person? = Person(name: "창브로", contacts: Contacts(phoneNum: "010-0000-0000", address: ["home": "달나라"]))

 

이러한 구조체들이 있습니다. 그리고 옵셔널 Person타입인 changbro를 선언했습니다.

이제 changbro에 접근해서 사용해 보겠습니다.

changbro?.contacts.address

 

 

당연히 강제 언래핑이랑 하는 역할은 같으니

 

 

이렇게 출력됩니다. 하지만 강제 언래핑이랑 다른 점은 changbro의 값이 nil이어도 실행이 중단되지 않는다는 점입니다!

예시로 확인해 볼게요

 

 

 

nil 값을 반환하면 구동을 멈추는 강제 언래핑보단 옵셔널 체이닝을 더 자주 써야겠죠?!

이렇게 오류가 나지 않고 nil 값을 반환하는 것을 확인할 수 있습니다 ☺️

 

이제 두 번째 옵셔널 바인딩에 대해 알아보겠습니다.

옵셔널 바인딩에는 if let 구문 guard let 구문이 있습니다.

 

if let부터 알아봅시다!

 

// 옵셔널 타입 생성
let optionalName: String? = "창브로"

// if let 구문
if let name = optionalName {
    print("이름은 \(name)입니다.")
} else {
    print("nil 값 입니다.")
}

// OUTPUT: 이름은 창브로입니다.

 

if let을 통해 상수를 선언하고 그 상수 안에 옵셔널을 해제시키고 싶은 값을 넣고 nil이 아니라면 옵셔널을 벗고 if 구문이 실행되고

if let을 통해 선언된 상수가 nil 값이라면 else 구문이 실행됩니다! 또한 if let으로 생성된 상수는 지역변수로 사용됩니다!

 

guard let도 알아보죠

 

guard let은 특성상 함수에서만 쓰입니다.

쉽게 설명해서 guard 구문의 조건을 만족하지 못하면 else문으로 빠져서 함수의 실행을 종료시킵니다.

만족하면 당연히 옵셔널을 벗고 사용 가능 하겠죠.

예시를 보겠습니다.

 

func guardTest() {
    var optionalName: String? = "창브로"
    optionalName = nil
  
    // nil 값인지 확인 후 nil 값이면 else문 실행 후 함수 탈출
    // nil 값이 아니라면 아래 문장 실행
    guard let name = optionalName else {
        print("nil 값 입니다")
        return
    }
    print("여기 실행 될까?")
}

guardTest()

 

guard let으로 생성된 상수는 전역변수로 활용 가능합니다!

 

옵셔널에 대해 조금 이해가 되시나요??

수고하셨습니다💯

'Swift Study' 카테고리의 다른 글

MVC  (0) 2024.02.24
Error Handling  (0) 2024.02.23
weak, unowned  (0) 2024.02.20
Strong Reference Cycle  (0) 2024.02.20
ARC  (0) 2024.02.20