안전한 Swift의 비결, 옵셔널(Optional)

Swift는 안전(Safety)를 무척 강조하는 언어다. 그리고 대표적인 안전 기능이 바로 '옵셔널'이다.

2022. 01. 12·published in Velog
swift

안전한 Swift의 비결, 옵셔널(Optional)

by eddy_song

안전, 안전, 안전!

Swift는 안전(Safety)를 무척 강조한다.

Swift 소개 페이지를 보자. 맨 처음부터 Safety라는 단어가 나온다. 기능(Feature) 챕터에서도 Safety만 따로 소개한다.

딱 봐도 안전을 최우선에 놓고 만든 언어라는 느낌이 온다.

자동차 브랜드로 치자면 볼보 같은 느낌이랄까?

IMG_PLACEHOLDER__volvo__SEP/Users/bumgeunsong/coding/writing-archiver/archiver/velog_md/eddy_song-swift-optional/assets/1e83df0feca846c167db5d08881c71d6f9160a2c.jpg__END__

자동차가 안전한 건 뭔지 알겠다. 하지만 프로그래밍 언어가 ‘안전’하다는 건 무슨 뜻일까?

프로그래밍 언어가 안전하다는 건, 예상치 못한 오류를 최대한 빨리 찾아낼 수 있다는 말이다. 실행하기 전, 코드를 컴파일하는 시점에 최대한 많은 오류를 잡아낸다.

실행 시점이 되어서야 에러가 터진다면, 굉장히 불안할 것이다. 디버깅하기도 더 어렵다.

자동차 주행 중에 문제가 생기면 큰 피해를 입는 것과 똑같다.

Swift는 코드를 컴파일하는 시점에 예상치 못한 상황을 잡아낼 수 있도록 여러 기능을 갖추고 있다.

마치 시동만 걸어도, 안전 벨트를 했는지 안했는지, 자동차 내부에 문제는 없는지 알려주는 계기판처럼 말이다.

Swift의 안전 기능, 옵셔널

**Swift의 대표적인 안전 기능이 바로 옵셔널(Optional)**이다. Swift 언어의 독특한 특징이기도 하다.

맨 처음 Swift를 배울 때 옵셔널이 싫었다. 조건문, 변수 선언 등이야 다른 언어에도 많이 있는 거니까 익숙하지만 옵셔널은 아니었다.

중간 중간 계속해서 물음표, 느낌표가 튀어나오고, Xcode가 한 줄 코딩할 때마다 끊임없이 에러 메세지를 뱉어내는데… 되게 귀찮았다.

그땐 옵셔널을 다루는데 익숙하지 않으니까 계속 컴파일 에러만 잡았다.

(원래 안전하면 사용할 때는 더 귀찮다.)

하지만 나중에 좀 익숙해지고 나니까, 옵셔널이 굉장히 좋은 녀석이란 걸 알게 되었다.

비록 코딩을 할 때 에러는 더 많이 뜨지만, 덕분에 예상치 못한 실행 시점의 충돌이나 디버깅 시간은 훨씬 줄어든다.

IMG_PLACEHOLDER____SEP/Users/bumgeunsong/coding/writing-archiver/archiver/velog_md/eddy_song-swift-optional/assets/6a60739350ccb3f0b44efdb012505580cc800492.jpg__END__

> 옵셔널… 너 좋은 놈이었구나.

nil: 비어있는 값

프로그래밍을 하다보면, ‘비어있는 값’을 표현해야 할 때가 있다.

예를 들어,

  • 사용자가 주소란에 주소를 입력하지 않았을 때
  • 배열에서 원하는 값을 찾을 수 없을 때
  • DB에서 데이터를 불러오는 데 실패했을 때

등등…

이럴 때 결과값으로 뭘 써야할까? 0이나 빈 스트링 ""을 쓸 수는 없다.

Swift는 비어있는 값을 nil로 표현한다.

옵셔널: nil일 수도 있는 타입

Swift에서는, 모든 타입의 인스턴스가 nil을 아예 가질 수가 없다.

다른 언어는 int 타입 변수에 undefined가 들어갈 수도 있고, string 타입에 null이 들어가기도 한다.

하지만 Swift에서는 안 된다.

어떤 변수에 nil을 넣으려면, 반드시 ‘옵셔널 타입’으로 선언해야 한다. 타입 이름 뒤에 ? 를 넣어서 옵셔널 타입을 표현한다.

Int는 비어있을 수가 없다. 0이든 -1이든 134098이든 항상 값을 가져야 한다. 하지만 Int?는 비어있을 수도 있고, 값이 들어있을 수도 있다.

다시 말해, nil이 될 가능성이 있는 변수는 반드시 옵셔널 타입이다.

따라서 타입 뒤에 ?‘이거 nil일 수도 있다!’라고 미리 알려주는 역할을 한다.

> Swift에는 타입 이름 외에도 옵셔널을 활용하는 경우가 있다. > as? init? try? 등이다. 하지만 결국 옵셔널 타입과 의도는 같다. > ‘실패할 가능성’이 있는 작업임을 미리 표시하는 것이다.

언래핑

이전에 다른 언어에선 어떤 변수는 비어있을 가능성이 있고, 어떤 변수는 가능성이 없다는 걸 미리 알 수 없었다.

하지만 Swift에서는…

  • nil은 옵셔널 타입에만 넣을 수 있다.
  • 옵셔널 타입은 처음부터 명시적으로 지정한다.

결과적으로 Swift는 nil이 될 가능성이 있는 변수를 코드만 보고 미리 알 수 있다. 그리고 이런 값을 사용할 때는 반드시 nil인지 아닌지 확인하도록 강제한다.

그냥 옵셔널 타입의 값을 조작하려고 하면 에러를 뱉는다.

혹시나 nil인데 조작하려고 하면 런타임 에러가 뜰 것이기 때문에, Swift 컴파일러가 미리 막는 것이다.

이 옵셔널 타입이 nil인지 아닌지 확인하고, 그 안에 든 값을 꺼내는 것을 **언래핑(Unwrapping)**이라고 한다.

Swift에서는 반드시 언래핑을 해야만 옵셔널 값을 다룰 수 있다.

언래핑을 하는 방법은 다른 글에서 알아보도록 하자.

요약 & 정리

  • Swift는 안전을 강조하는 언어다.
  • Optional은 Swift의 대표적인 안전 기능이다.
  • Optional 타입 때문에, nil이 될 가능성이 있는 변수인지 미리 알 수 있다.
  • Swift는 Optional 타입을 다룰 때 언래핑을 강제한다.
  • 결과적으로 런타임 시점에 nil을 조작하는 에러가 생기지 않는다.

다음 글

👉 옵셔널(Optional)은 어떻게 만들었을까  👉 옵셔널(Optional)을 언박싱.. 아니 언래핑(Unwrapping) 해보자