Study/IOS 스터디

IOS 필수 Optional 이란?

Bbell428 2024. 6. 4. 00:22

Swift는 안전한 코딩을 할 수 있게 해주는 언어로 안전성의 기본 바탕에 있는 중요한 요소 중 하나가 바로 Optional이라는 개념이다.

옵셔널(Optional)이란 과연 무엇일까?

옵셔널을 이해하기 전에 nil이라는 것을 먼저 알아두는 것이 좋다.

nil은 무엇일까?

nil은 '값이 없음'을 뜻한다. 다른 언어에서 쓰이는 ‘null’ 과 유사하다.

예시로 문자열에 “과일”은 문자열의 값이 있는 것을 알 수 있다.

그러면 “”는 무엇일까? nil일까? 아니다. “”도 값이 있는 문자열이다.

즉, “” 또한 허용하지 않는, 값이 없는 문자열을 nil이라고 한다.

그리고 nil은 옵셔널이외의 사용할 수 없다.

var optionalString: String?
var optionalString2: String? = nil
// 두 값 모두 nil

옵셔널은 어떻게 적용해야 하는가?

가장 기본이 되는 형태

let myInt: Int?

위처럼 변수의 타입의 뒤에 ?를 붙여주면 해당 변수는 Optional이 된다.

변수에 값이 들어갈 수도 있고, 아닐 수도 있다.

즉, myInt가 정수일수도 있고 아닐수도 있다라고 생각하면 편하다.

Swift에서는 기본적으로 변수 선언시 nil 값이 들어가는 것을 허용하지 않는다.

var myString: String = nil        // 에러
var myString: String? = nil      // 정상작동

Wrapping - (Swift 3.0에서 반영된 사항)

Optional에 대해 보다보면, 많은 곳에서 Wrapping이라는 개념이 나온다.

Optional 타입은 기본적으로 wrap되어 있는 상태이다.

즉, Optional로 선언된 변수들은 값이 있는 것인지, nil인 것인지 wrap되어 있어서 모르는 상태이다.

그렇기 때문에(컴파일러 입장에서는 변수가 nil일 수도 있기 때문에) wrap된 상태에서는

설령 변수에 value값이 있다고 하더라도 바로 value가 출력되지 않는다.

아래 예제를 보시면,

var optionalString: String? = “Hello”
print(optionalString)
// 출력 결과: Optional(“Hello”)

이 경우, optionalString이 nil일 수도 있기 때문에, 결과값 “Hello”가 출력되지 않고, Optional(“Hello”) 가 콘솔창에 출력된다.

Forced Unwrapping

출력 결과가 Optional(“Hello”)처럼 나오는 것은 대부분의 경우 원하는 출력값일수도 있다. 이 때 올바른 출력을 위해 사용하는 것이 !(exclamation mark), 즉 느낌표이다.

즉, optional로 선언했지만, 값이 확실한 경우 느낌표(!)를 쓰면 우리가 원하는 Hello을 출력할 수 있다.

var optionalString: String? = “Hello”
print(optionalString!)
// 출력 결과: Hello

변수명 뒤의 느낌표는 Optional을 unwrap합니다. Optional은 unwrap된 상태에서만 값을 제대로 출력할 수 있다.

let value1: String? = nil
let value2: String! = nil // 여기서는 에러가 아님.
print(value1) // nil 출력
print(value2) // 에러

value1과 value2는 모두 Optional 타입이다. 다만 value1은 아직 wrap되어 있는 상태이므로 print에서 문제가 되지 않는다. 값이 있다면 **Optional(값)**형태로 출력이 될 것이다.

다음으로 value2의 경우 unwrap된 상태에서 값을 출력하면 런타임 에러가 발생한다.

그러므로 if를 통해 값이 nil인 경우를 체크하고 출력을 해야한다.

밑에 예시를 보여주면,

let value2: String! = nil
if value2 != nil {
	print(value2)
}

위 예시처럼 if를 통해 값이 nil인 경우를 체크하고 출력할 수 있다.

참고 출처

https://medium.com/@codenamehong/swift-optional-1-54ae4d37ee09

https://seolhee2750.tistory.com/10

→ iden의 조언

nil과 null에 차이점 (메모리 유무)

nil 메모리에는 있지만 값은 없는 상태

null 메모리에도 없고 완전히 무의 상태

  • 언래핑

Forced Unwrapping (웬만해선 멀리함)

IUO

if ~ let OR guard ~ let (2가지 방법을 조사해볼 것)

Nil-Coalescing (닐 코얼레싱)

Optional Chaining

 

 

https://docs.swift.org/swift-book/documentation/the-swift-programming-language/thebasics/ 참고