본문 바로가기

공부/iOS

Swift - Optional(옵셔널) 기본

잡설...

처음에 iOS개발을 Objective-C로 시작했다.

2015년이여서 그 당시에 생각은 많은 회사들의 기존 프로젝트들이 Objective-C일꺼라고 생각했기 때문이다.

 

그리고 현재 회사에 16년도에 입사했을때 Objective-C와 Swift 가 병행하여 사용되고 있었다.

Swift를 시작하면서 제일 낯설었던 기능중 하나가 Optional이였고,

현재는 무리 없이 사용하지만 Swift공식 문서를 보고 한번더 정리하려고 이 글을 쓴다.

 

잡설은 이제 끝! 그럼 시작해 볼게요!

검정글씨는 공식문서를 번역한거고 보라색은 책과 제 생각을 정리한 글입니다.

 


스위프트는 Optional Type을 소개하고 있는데, Optional Type은 값의부재(nil)을 처리 하는 방법입니다.

 

Optional은 "값이 있고 x와 같다" 또는 "값이 없다"라고 말합니다.

(Optional은 오직 2가지 타입의 값을 갖는데, 한개는 nil이며 다른 한개는 옵셔널로 감싸진 값(옵셔널래핑)이에요)

 

Optional을 사용하는 것은 Objective-C에서 포인터가 있는 nil을 사용하는 것과 유사하지만,

Optional에서는 클래스뿐만 아니라 어떤 유형에서도 작동합니다.

(Obj-C에서 nil은 클래스 객체를 참조하는데 사용되고, NULL은 그 밖에 다른 포인터 자료형에서 사용됩니다. 
Swift에서는 NULL이 정의되어 있지 않아요)

 

Optional은 Objective-C의 nil pointer보다 안전하고 표현력이 뛰어나며, Swift의 가장 강력한 특징의 핵심입니다.

 

당신은 값이 없을 수있는 상황에서 옵셔널을 사용할 수 있습니다.

 

옵셔널은 두가지 가능성을 나타냅니다.

 

1. 값이 있던 없던 옵셔널 값은 포장해제(unwrap)할 수 있다.

2. 값이 전혀 없는 경우(nil)이다.

 

잠깐.. 포장해제할수 있다는데 그럼 옵셔널 값은 포장이 되어 있다는 것인가??

let optionalTest: Int? = 3
print(optionalTest) // Optional(3)

Optional(3) 이구나... 아하 위에서 옵셔널로 감싸진 값이라는게 이런거구나! 

 

다음은 Optional을 사용하여 값의 부재(nil)을 처리하는 방법을 보여주는 예입니다.

스위프트의 Int유형에 String 값을 Int값으로 변환하는 초기화 구문이 있습니다. 

그러나 모든 문자열을 정수로 변환할 수는 없습니다. 

String value "123"은 Int형으로 변환하면 123이 되지만 String value "hello"를 Int형으로 바꿀수는 없습니다.

let possiblenumber = "123" // "123"
let convertedNumber = Int(possiblenumber) // 123
let errorNumber = Int("hello") // nil

초기화에서 실패할 수 있기 때문에 Int가 아닌 Optional Int를 반환합니다.

위의 코드를 보면 "hello"가 Int형이 안되기 때문에 nil을 반환했습니다. 

 

Optional Int는 Int?로 작성합니다. Int 와 Int? 는 다른거에요!

 

물음표는 Optional 값을 포함하는지를 나타냅니다. 이것은 Int의 값이 포함될 수도 있고 아예 값이 포함되지 않을 수도 있습니다.

(Int? 는 Bool 값이거나 String 값과 같은 다른 항목은 포함할 수 없습니다. Int이거나 아무것도 없거나를 표현하는 것입니다.)

 

nil

당신은 Optional 값을 값없음 상태인 nil을 할당할 수 있습니다.

(옵셔널 변수가 아닌 일반 변수에 nil을 넣으면 안됩니다.)

var serverResponseCode: Int? = 404
// serverResponseCode contains an actual Int value of 404
serverResponseCode = nil
// serverResponseCode now contains no value

 

만약 당신이 기본값(초기값)을 제공하지 않는다면 optional 변수는 자동으로 nil로 설정됩니다.

var surveyAnswer: String?
// surveyAnswer is automatically set to nil 

 

 

 

If Statements and Forced Unwrapping(분기문과 강제 언래핑)

if문을 사용하여 선택한 항목을 nil과 비교하여 Optional에 값이 포함되어 있는지 여부를 판단할 수 있습니다.

여기서 == 오퍼레이터는 같음이고 != 오퍼레이터는 같지않음을 뜻합니다.

옵셔널 밸류의 값이 있다면 nil과 같지 않음으로 간주됩니다. 

if convertedNumber != nil {
    print("convertedNumber contains some integer value.")
}
// Prints "convertedNumber contains some integer value."

 

옵셔널 밸류가 값이 있다고 확실해 지면 옵셔널 이름 끝에 !를 붙일수 있습니다.

느낌표에는 "이 옵셔널 값은 무조건 값을 가집니다. 사용하세요!" 라는 뜻을 가지고 있습니다.

이를 forced unwrapping(옵셔널 강제 해제)라고 합니다.

 

if convertedNumber != nil {
    print("convertedNumber has an integer value of \(convertedNumber!).")
}
// Prints "convertedNumber has an integer value of 123."

 

글을 쓰다보니 너무 길어질것 같아서 여기서 한번 끊을게요 ㅠ 

다음 글에서는 Optional Binding(옵셔널 바인딩) 과 Implicitly Unwrapped Optionals(암묵적 옵셔널 해제)에 대해서 정리해보겠습니다.

 

출처

https://docs.swift.org/swift-book/LanguageGuide/TheBasics.html

꼼꼼한 재은씨의 Swift 문법편

'공부 > iOS' 카테고리의 다른 글

iOS - Cocoa Touch Framework  (0) 2020.07.03
Swift - Optional 2 ( Optional Binding, Implicitly Unwrapped Optionals)  (0) 2020.06.26
Objective-C typedef에 대해서  (0) 2020.06.09
iOS 계층구조  (0) 2020.06.04
Swift - typealias  (0) 2020.05.20