[iOS / Swift] Swift 문법을 알아보자! - 13편 : 암시적으로 벗겨진 옵셔널 (Implicitly Unwrapped Optional)

프린스송·2021년 6월 28일
2

Swift 문법

목록 보기
13/21
post-thumbnail
post-custom-banner

안녕하세요! 이때까지 다양한 옵셔널 언래핑 방법을 배웠습니다. 옵셔널 바인딩, 옵셔널 체이닝, nil 병합 연산을 배웠었는데 오늘 공부할 내용은 암시적으로 벗겨진 옵셔널이라는 것입니다. 그럼 더 자세하게 알아보겠습니다.


암시적으로 벗겨진 옵셔널 (Implicitly Unwrapped Optional)

이때까지는 값이 있을 수도 없을 수도 있는 옵셔널을 공부했고 이것을 안전하게 unwrapping하는 방법들을 배웠습니다. 하지만 암시적으로 벗겨진 옵셔널을 사용한다면 이러한 unwrapping 과정을 과감하게 생략을 할 수 있습니다.

암시적으로 벗겨진 옵셔널을 한마디로 정리해보자면 옵셔널에 값이 무조건 들어있다는 것을 명확하게 알 수 있을 때 간결한 코드를 위해서 쓰는 방식입니다.

  • 암시적으로 벗겨진 옵셔널 선언
let a : Int? = 1 //일반적인 옵셔널
let b : Int! = 1 //암시적으로 벗겨진 옵셔널
print(a)
print(b)

위의 코드처럼 암시적으로 벗겨진 옵셔널은 일반적인 옵셔널과는 다르게 뒤에 !를 붙여서 선언을 해줍니다. 이때 a는 옵셔널 이긴하지만 nil이 아닌 값이 무조건 들어있다는 상황에서 쓸 수 있습니다. 결과를 출력하면 다음과 같이 둘은 같은 옵셔널이라는 것을 확인할 수 있습니다.
하지만 둘은 명백히 다릅니다. 암시적으로 벗겨진 옵셔널은 일반적인 옵셔널과는 다르게 언래핑을 하지 않아도 일반적인 변수나 상수로 쓸 수 있다는 점이죠! 간단한 코드를 작성해서 좀 더 쉽게 이해 해보도록 하겠습니다.

let a : Int! = 1
let b : Int = a  //이게 되고 1나옴 a!안해도됨
let c : Int = a!
let d = a        //이거는 옵셔널
let e = a + 1    //이게 되고 2나옴 a! + 1안해도 됨

print(a,b,c,d,e)
print(type(of: a))
print(type(of: b))
print(type(of: c))
print(type(of: d))
print(type(of: e))

암시적으로 벗겨진 옵셔널 a를 선언했습니다. 하지만 a는 언래핑을 거치지 않고 사용할 수 있는 암시적으로 벗겨진 옵셔널이므로 Int형인 b에 값을 할당할 수 있습니다. 그리고 물론 언래핑을 통해서 값에 할당을 해줄수도 있고요!! (여기서는 force umwrapping) 그리고 당연히 언래핑을 거치지 않고 바로 값에 접근할 수 있으므로 a+1과 같은 연산을 언래핑을 하지 않고도 수행할 수 있죠.
결과를 천천히 확인을 해보겠습니다. 언래핑의 과정을 보여주지 않은 a,d만 타입이 옵셔널로 된 것을 확인할 수 있습니다.


암시적으로 벗겨진 옵셔널이 가장 좋은 방법?

그렇다면 언래핑을 하는 수고스러움도 없는 암시적으로 벗겨진 옵셔널을 사용하는 것이 가장 좋은 방법일까요? 결과는 결국 완전히 안전한 사용은 아니라는 것입니다! 코드를 통해서 살펴보죠.

var a : Int! = 1 //암시적으로 벗겨진 옵셔널

a = nil

print(a)
print(a!)

다음과 같이 암시적으로 벗겨진 옵셔널 a를 선언해주었습니다. 그런다음 a를 nil로 바꾸고 a를 그냥 출력해보고 강제 언래핑을 해서 출력을 해보겠습니다. 만약 일반적인 옵셔널로 선언했더라면 처음은 nil값이 출력되고 두번째 출력문은 에러가 날것입니다. nil값을 강제로 언래핑 했기 때문이죠!

하지만 암시적으로 벗겨진 옵셔널에도 똑같은 결과가 나왔습니다. 강제로 언래핑을 하는 순간 에러가 떴네요..
여기서 알 수 있는 사실은 암시적으로 벗겨진 옵셔널도 옵셔널이기 때문에 nil값을 강제 언래핑할 경우 오류가 난다는 것입니다! 어차피 언래핑이 필요하지 않은 암시적으로 벗겨진 옵셔널에 강제 언래핑을 할 일이 없겠지만 iOS앱개발에 익숙하지 않은 개발자들은 충분히 실수를 할 수 있는 부분일 수 있습니다!

그러니 항상 강제 언래핑을 할때는 항상 조심!


암시적으로 벗겨진 옵셔널은 어디서 자주 쓸까?

암시적으로 벗겨진 옵셔널은 전에 배웠던 @IBOutlet에서 자주 쓰입니다.
한번 생성된 객체는 코드 내에서 항상 연결되어 있고 값이 할당되어 있기 때문에 암시적으로 벗겨진 옵셔널으로 선언을 한다고 합니다.


오늘은 암시적으로 벗겨진 옵셔널에 대해서 배웠습니다. 옵셔널에 대한 다양한 컨트롤 방법을 배웠는데 아직 실제는 어떤식으로 쓸지 개념이 잘 안잡히네요.. 그래도 오류를 일으킬 수 있는 옵셔널은 항상 잘 숙지하고 있어야 할 것 같습니다. 그럼 오늘 하루도 수고하셨습니다!

profile
[iOS / Swift] [React Native]
post-custom-banner

0개의 댓글