본문 바로가기
iOS/Swift 문법 심화 학습

Optional

by 황민우 2022. 4. 12.

정의

- 값이 있을 수도 없을 수도 있는 것을 나타내는 것

- 옵셔널을 ?와 !를 사용해 변수를 선언하고 실행할 수 있습니다.

- 옵셔널로 선언된 변수의 값은 일반 (Int, Double, String) 자료형이 아닌, Optional 자료형이 됩니다. 

 

선언문에 사용할 때

- ?와 ! 모두 동일하게 옵셔널 변수 선언을 목적으로 사용합니다, 하지만 !는? 와 또 다른 기능이 있습니다.

더보기

? - 옵셔널 변수 선언

! - 옵셔널 변수 선언, 옵셔널로 사용되지 않을 것 같으면 자동으로 옵셔널을 언래핑합니다.


옵셔널 실습

 

선언부에서 ?,! 사용

- ?,! 동일하게 옵셔널 변수 선언으로 실행돼, 변수 x의 값이 Optional(10)으로 초기화됩니다.

var x : Int? = 10 // 선언문에서 ?는 옵셔널 변수 선언.
print(x)
print(type(of:x))

실행결과
// Optional(10)
// Optional<Int>
--------------------------------------------------------------------------------
var x : Int! = 10
print(x)
print(type(of:x))

실행결과
// Optional(10)
// Optional<Int>

 

 

실행부에서 ?, ! 사용

- x에 저장된 Optional(10)이 !를 만나 강제 언래핑되어 일반 정수 10의 값이 출력됩니다.

- 그와 반대로 실행부에서 ?를 사용하면 오류가 발생합니다. 그 이유는 실행부에서 ?를 사용하면 옵셔널 체이닝으로 사용되기 때문입니다.

var x : Int? = 10 // 선언문에서 ?는 옵셔널 변수 선언.
print(x!)
print(type(of:x))

실행결과
// 10
// Optional<Int>
-----------------------------------------------------------------
var x : Int? = 10 // 선언문에서 ?는 옵셔널 변수 선언.
print(x?)
print(type(of:x))

실행결과
// 에러 발생!

옵셔널 체이닝 [Optional Chaining]

- 옵셔널 체이닝은 옵셔널 선언된 변수에 대해 실행부에서 ?를 사용했을 때,

옵셔널 내부에 값이 있으면 옵셔널 값을 불러오고, 값이 없다면 nil을 출력하고 실행을 종료시키는 것입니다.

2022.02.10 - [iOS/Swift 문법 심화 학습] - 옵셔널 체이닝 [ Optional Chaining ]

 

옵셔널 체이닝 [ Optional Chaining ]

정의 - nil일 수도 있는 프로퍼티나 메서드 그리고 서브 스크립트에 질의를 하는 과정입니다. - 옵셔널이 프로퍼티나 메서드 혹은 서브스크립트에 대한 값을 가지고 있다면, 그 값을 반환합니다.

seagreen83.tistory.com

 

실습

- 다음과 같이 변수 x에 Optional("Hi")라는 값이 들어있을 때,

옵셔널 체이닝을 해보면, b1에는 "Hi"의 문자열 수를 count 해서 Optional(2)라는 값으로 출력합니다.

var x : String? = "Hi"

let b1 = x?.count        
print(type(of:b1),b1, b1!) 

실행결과
// Optional<Int> Optional(2) 2

 

- 그럼 옵셔널 내부에 값을 지우고 다시 실행해보겠습니다.

- 결과는 이전과 다르게 nil이 출력된 것을 확인할 수 있습니다.

var x : String?

let b1 = x?.count  
print(type(of:b1),b1) 

실행결과
// Optional<Int> nil

옵셔널 값을 푸는 3가지 방법

 

1, 옵셔널 바인딩 [Optional Binding]

- 옵셔널 바인딩은 옵셔널은 안전하게 처리하는 방법입니다.

- if let과 guard let과 같은 방법이 있습니다.

var x : Int? = 10

if let xx = x {     // 옵셔널 바인딩.
    print(x,xx)
}

실행결과
// Optional(10) 10

- 아래의 코드는 표현식이 참이므로 x의 값이 옵셔널 바인딩된, 정수 8이 출력됩니다.

func Num(x: Int?){
    guard let myNum = x, myNum < 10 else {
        print("잘못된 값이 입력되었습니다.")
        return
    }
    print(myNum)
}
Num(x:8)

실행결과
// 8

- 아래의 코드는 표현식이 거짓이므로 else문 블록 안에 "잘못된 값이 입력되었습니다."가 출력됩니다.

func Num(x: Int?){
    guard let myNum = x, myNum < 10 else {
        print("잘못된 값이 입력되었습니다.")
        return
    }
    print(myNum)
}
Num(x:12)

실행결과
// 잘못된 값이 입력되었습니다.

2022.01.28 - [iOS/Swift 문법 심화 학습] - guard

- guard 문은 아래에서 자세히 다루었습니다. 

 

guard

정의 - 코드를 안전하게 처리하기 위해 표현식을 검사하는 목적으로 사용합니다. - 잘못된 값이 전달 될 시에 ( =표현식이 거짓이라면 ) 특정 실행구문을 빠르게 종료하고, 표현식이 거짓이 아니

seagreen83.tistory.com

 

2, 강제 언래핑 [Forced Unwrapping]

- 강제 언래핑은 옵셔널 변수 뒤에 !만 붙여주면 돼 간단하지만, 프로그램이 비정상적으로 종료되는 위험이 있으니 주의하여 사용하여야 합니다.

var x : Int? = 10
print(x!)

실행결과
// 10

 

 

3, nil coalescing operator

- nil 병합 연산자는 var y = x ?? 0과 같은 식에서,

x의 값이 nil일 경우 x에 0 값을 초기화하고, nil이 아닐 경우 옵셔널을 푼 값을 초기화하는 것입니다.

- x가 옵셔널 값인 경우.

var x : Int? = 10   

var y = x ?? 0
print(x,y)

실행결과
// Optional(10) 10

- x가 nil인 경우.

var x : Int?   
var y = x ?? 0
print(x,y)

실행결과
// nil 0

내용 출처

https://www.youtube.com/channel/UCM8wseo6DkA-D7yGlCrcrwA/featured

 

Smile Han

 

www.youtube.com

 

'iOS > Swift 문법 심화 학습' 카테고리의 다른 글

Dictionary  (0) 2022.04.19
컬렉션 타입 [Collection Types]  (0) 2022.02.17
서브스크립트 [ Subscript ]  (0) 2022.02.15
프로퍼티 [ Properties ]  (0) 2022.02.14
옵셔널 체이닝 [ Optional Chaining ]  (0) 2022.02.10

댓글