Swift

[Swift] 옵셔널 (Optional), nil

효니로그 2024. 1. 6. 15:39
  • nil
  • Non-optional Type (넌옵셔널 타입)
  • optional Type (옵셔널 타입)

 

nil

값이 없다는 것을 나타내는 특별한 키워드.

옵셔널 변수에 특수한 값 nil을 지정하면 값이 없는 상태를 나타낼 수 있다.

nil은 타입이 없기 때문에 nil만으로는 타입을 추론할 수 없다.

let stock: Int? = nil

 

 

Non-optional Type (넌옵셔널 타입)

변수와 상수는 값을 읽기 전에 반드시 초기화해야 하며, 항상 타입에 맞는 값을 가지고 있어야 한다.

이런 타입을 Non-optional Type(넌옵셔널 타입)이라 부른다.

Non-optional Type(넌옵셔널 타입)에는 항상 값을 가지고 있어야 하므로 nil을 저장할 수 없다.

nil은 값이 없다는 것을 나타내는 특별한 값이므로 항상 값을 가져야 하는 Non-optional Type(넌옵셔널 타입)에는 저장할 수 없다.

let stock: Int = 10

 

옵셔널 (Optional)

옵셔널은 보통 값이 없는 경우 사용하는데,

값이 있을 수도 있고, 없을 수도 있는 상태의 타입을 옵셔널이라 한다. 

옵셔널 변수를 선언할 때 초기값을 지정하지 않으면 해당 변수의 값은 nil로 설정된다.

값이 nil이라면 값을 가지지 않은 것이다.

let optionalStr: String?

위 코드처럼 타입뒤에 공백없이 ?(물음표)를 붙여주면 옵셔널타입이 된다.

옵셔널 타입은 값을 저장하지 않아도 되고, nil을 저장해도 된다. (nil == 값이 없다.)

 

var optionalInteger: Optional<Int>
var optionalInteger: Int?

 

물음표를 붙인 문법은 단축 문법을 사용한 것으로 위 두 가지 문법은 동일한 코드이다.

 

 

언래핑 (Unwrapping)

옵셔널 타입의 값을 사용하려면 값을 꺼내서 사용해야 하는데 이때 값을 추출하는 작업을 언래핑이라 한다.

// Optional Type
var num: Int? = nil
num = 123
print(num) // Optional(123)

// Non-optinal Type
let n = 123
print(n) // 123

옵셔널 타입의 값과 넌옵셔널 타입의 값 둘 다 동일하게 123이 저장되어 있지만 다른 결과가 출력됨을 확인할 수 있다.

옵셔널 타입의 값은 언래핑을 통해 값을 추출해야 한다.

 

 

값 강제 추출하기(Forced Unwrapping)

OptionalExpression!

 

값을 추출하는 방법은 옵셔널 표현식 뒤에 느낌표를 붙이면 된다.

!(느낌표)는 반드시 공백 없이 붙여야 한다.

nil이 아닌 값에 강제 언래핑을 하면, 언래핑된 값을 얻을 수 있다.

nil 값을 강제 추출할 경우 에러가 발생하므로 주의해야한다.

 

강제추출은 반드시 필요한 경우에만 제한적으로 사용하는 것이 좋다.

 

 

if문으로 값 확인하기

if num != nil{
    print(num!)
}

강제추출을 안전하게 사용하는 방법은 값을 꺼내기 전에 값을 확인하는 방법이다.

 

위 예제는 if문으로 값을 확인하는 코드이다.

값이 저장되어 있으면 nil이 아니므로 true가 되고

값이 저장되어 있지 않다면 nil과 같아서 false가 된다.

이렇게 하면 값이 있는 경우에만 추출하기 때문에 안전하게 추출할 수 있다.

 

하지만 if문으로 값을 확인하는 방법은 거의 사용되지 않으며 다른 방법으로 옵셔널 바인딩을 사용한다.

 

 

옵셔널 표현식을 언래핑하면 결과는 항상 넌옵셔널 타입이 된다.