본문 바로가기
공부/[iOS&Swift]

[Swift] Optional에 대하여

by 인생은아름다워 2022. 2. 19.

✏️ 옵셔널이란? : 안정성(Safty)을 문법적으로 담보하는 기능

옵셔널(Optional) 이란 두 가능성을 나타낸다: 값을 가지고 있어서 그 값을 풀어서(unwrap) 이용할 수 있거나 또는, 어떠한 값도 없는 것. (어떠한 값도 없는 것은 Swift에서는 nil)

다시 말 하면, 옵셔널을 이용하는 것 만으로도 이 값은 없을 수도 있는 값이다! 라는 것을 의미한다.

옵셔널로 선언된 곳에서만 nil을 할당할 수 있다.

✏️ 옵셔널 값 풀어쓰기(Unwrapping)

옵셔널 값을 풀어서 그 안의 값(value)을 추출하여 사용하는 것을 unwrapping한다고 한다.이 unwrapping방법은 몇가지가 있다.

  1. If문과 강제 언래핑(Forced Unwrapping)

아래와 같이 someOptional에 값이 있다는것을 확신할 때, someOptional뒤에 느낌표(!)를 붙여서 사용하며, 이 값은 절대로 nil이 아니니 사용해도 좋아~ 라는 의미를 동시에 가진다.

var someOptional: Int?
//자동으로 nil로 초기화

someOptional = 1

if someOptional != nil {
    print("someOptional is \\(someOptional!)")
}

그런데 뭔가, 이런 확신을 함부로 가져도 될지 모르겠다. 나라면 웬만하면 이런 방법을 사용하지 않을 것 같다.(이런 생각이 언젠간 잘못됐다고 느낄 수도 있겠지만, 일단은!)

  1. 옵셔널 바인딩(Optional Binding)

옵셔널 바인딩을 사용하여 옵셔널에 값이 포함되어 있는지 확인하고, 그렇다면 해당 값을 임시 상수나 변수로 사용할 수 한다.

if let someConstant = someOptional {
    print("someOptional is \\(someConstant)")
}

someOptional이 값을 가지고있냐, 그렇지 않냐에 따라서 if구문 안이 수행되거나 그렇지 않는데, 여기서 선언한 상수 someConstant는 if문 내부에서만 존재한다!

이 방법이 훨씬 안정적일 것 같다는 생각이 든다(1번의 방법에 비해서)

  1. 암시적 추출 옵셔널(Implicit Unwrapped Optionals)

옵셔널을 선언할 때 암시적으로 이 곳에는 값이 무조건 있을거야! 라는 표현으로 암시적으로 알려주는 것.그렇기 때문에 실제로 사용할 때 위의 두 예시와 같이, 강제 추출이나 옵셔널 바인딩의 과정을 거치지 않고도 일반 변수처럼 사용한다.

let possibleString: String? = "An optional string."
let assumedString: String! = "An implicitly unwrapped optional string."

let forcedString: String = possibleString! //꼭 느낌표를 사용해줘야 한다.(명시적 표현)
let implicitString: String = assumedString //느낌표를 사용하지 않아도 된다.(암시적 표현)

이렇게, 선언할 때 애초에 이 곳에는 무조건 값이 들어온다! 라고 (써 놓지는 않았지만) 암시적으로 알려주는 옵셔널이 되겠다.궁금해 하던 부분이 이 부분 이었는데, 공부 해 보니 이 방법 또한 좋아보이지 않는다는 생각이든다.(야곰 책에도 그렇게 적혀있군…!)

🍎 옵셔널 공부 전 궁금했던 점 1 : 옵셔널에서 암시적/명시적 이라는 말이 이해가 되질 않았다.

  • 타입의 뒤에 느낌표(!)를 붙여서 선언한 것을 옵셔널의 암시적(implicit)표현이라고 한다는데…

그런데 이상하게도 나는 이런 궁금증이 들었다.느낌표를 붙인것은 옵셔널을 풀 때 그냥 붙이는 값 아니던가? 이게 왜 암시적 표현이라는거지?

  • ⇒알고보니 암시적 표현이라는것은, 이미 옵셔널을 선언할 때 값이 있을 것이라고 암시적으로 써 놓았기 때문에, 사용자는 그냥 일반 변수처럼 사용해도 된다고 알려주는 그런 의미의 ‘암시적’ 이라는것 이었다.

🍎 옵셔널 공부 전 궁금했던 점 2 : 어떤 경우에 옵셔널을 사용해야하는지 몰랐다.

  • 언젠가 값이 있을 수도? 없을 수도? 있는 value를 다뤄야할 때가 있을테니…?

아직 이 부분은 명확하지는 않다, 스터디가 필요하다.언젠가 앱을 개발한다면 그 때 이 값이 있을수도, 없을수도 있을텐데… 이걸 어떻게 표현해야할까?

그럴 때 문법적으로 보장을 해주는 옵셔널을 사용하면 될 것이라는 아주 막연한 생각이 들 뿐이다.

추후에 직접 사례들을 더 다뤄봐야 할 것 같다.

참고했던 글

 

Why is the ! in Swift called an 'implicitly' rather than 'explicitly' unwrapped optional?

The name of the ! always confuses me: it's called an 'implicitly unwrapped optional'. However, what is implicit about it? Implicit means "implied though not plainly expressed." However, does not ad...

stackoverflow.com

 

The Basics — The Swift Programming Language (Swift 5.6)

The Basics Swift is a new programming language for iOS, macOS, watchOS, and tvOS app development. Nonetheless, many parts of Swift will be familiar from your experience of developing in C and Objective-C. Swift provides its own versions of all fundamental

docs.swift.org

 

댓글