티스토리 뷰

프로그래밍/iOS

[SWIFT]옵셔널

KYU 2017. 12. 18. 14:33
반응형

Swift을 처음 접하였을 때 옵셔널 타입이 나옵니다. 자바로 프로젝트 하다보면 가장 많이 나오는 부분이 "Null Pointer Exception"입니다. 이 옵셔널에 대해서 간단히 설명하겠습니다.


Swift인 경우 일반 변수/상수는 nil(null) 대입 불가 합니다.  그래서 나온 타입이 옵셔널 타입입니다.


* 옵셔널 타입 : nil을 넣어줄 수 있습니다.



1. 옵셔널 타입을 선언

옵셔널 타입을 선언하는 방법에 대해서 설명하겠습니다.

nil 값이 될 수 있는 변수/상수에 해당하며 타입 뒤에 물음표(?) 로 선업합니다.


1
var value : Int?



* 옵셔널 타입의 특징은 

   1) nil 대입 가능

   2) 자동 초기화

두 가지로 구성됩니다. 초기 값을 정확히 없을 경우 옵셔널 타입 선언으로 자동 초기화 해주는 것도 방법으로 판단됩니다.


명시적으로 옵셔널을 선언하지 않아도 옵셔널로 나오는 경우도 있습니다. 

 과가 nil이 되는 행위을 경우 가 해당되며 결과가 nil 이 될 수 있는지 체크하여 소스를 구성하는 것도 필요합니다. 



2. 언래핑

옵셔널 타입을 사용하기 위해서는 언래핑을 해야합니다. 


언래핑 : 옵셔널 타입의 변수에서 유효한 값 얻어오기


강제 언래핑은 옵셔널 뒤에 ! 을 붙이면 됩니다. 하지만 강제 언래핑 결과로 nil 이면 error를 호출하게 되니 언래핑 대상이 nil 이 아닌지 체크한 후에 언래핑 해줘야 합니다.


1
2
var optional : String= nil
print(optional!)  //error



강제 언래핑은 객체 생성, 메소드호출, 프로퍼티 접근, 옵셔널 체인에 사용됩니다.


3. 옵셔널 바인딩 기법 소개

옵셔널 바인딩의 다양한 기법을 소개하겠습니다.


3.1. if let문을 이용한 옵셔널 바인딩 기법

  if let 을 하게되면 if 문 안에서 let 변수에 넣어주는 값이 nil  인지 체크하고 nil 이 아닐 경우 옵셔널 바인딩을 하여 값을 가져오게 됩다.


1
2
3
4
5
if let realStr = optionalStr {
    print("A")
else {
    print("null")
}


3.2. guard을 이용한 옵셔널 바인딩

  swift 의 문법중 guard 가 나오게 됩니다. 이 guard을 이용하면 nil 체크와 함께 조건문도 작성할 수 있습니다.


1
2
3
4
5
6
func bindingWithWhere(){
    guard let val = nilAvailable, val > 0 else {
        return;
    }
    print("val 은 nil이 아니고 0 보다 큰 값이다.")
}


3.3. 다중 바인딩, 함수 호출

  swift는 다중 바인딩도 가능합니다. 따라서 아래 소스 처럼 let 을 ','로 구분하여 바인딩 할 수 있습니다. 또한 조건문에 함수를 넣을 수 있다는 것이 swift의 가장 큰 특징으로 보입니다.


1
2
3
if let val1 = func1(), let val2 = func2(){
    // code..
}


3.4. 옵셔널 바인딩 체인

  swift는 바인딩 체인과 형변환을 동시에 할 수 있습니다.


1
2
3
if let val1 = func1(), let val2 = Float(val1){
    // code..
}


3.5. 옵셔널 바인딩과 조건 비교

  옵셔널 바인딩과 조건 비교을 동시에 할 수 있습니다.


1
2
3
if let val1 = func1(), condition == true{
    // code..
}


4. nil 연산자 "??"

nil 이면 ?? 연산자 이후의 값 사용하게 됩니다.


1
2
var selectedColor : String?
var colorName = selectedColor ?? "Red"


위와 같이 구성이 된 경우 selectedColor 값을 가져오게 되는데, 만약 nil이면 ?? 뒤에 있는 "Red"을 가져오게됩니다.


5. 옵셔널 체인

옵셔널 객체는 ? 기호를 이용해서 직접 사용하게 되는데, 평가 결과가 nil이면 진행하지 않고 nil을 반환하고 평가 결과가 nil이 아니면 계속 진행하게 됩니다.


최종 결과는 옵셔널로 진행이 되며 메소드 호출, 프로퍼티 접근, 배열 원소 접근 등에 사용됩니다.


저 같은 경우는  Json으로 REST API로 통신하다보면 nil 값을 대응하기 위해서 ? 을 많이 사용합니다.


[ 옵셔널 호출 예제 ]


1
2
3
4
5
6
7
var optional : String= "AB"
let str = optional?.lowercased()
//결과는 옵셔널
 
var optional : String= nil
let str = optional?.lowercased()
//결과는 nil



[ 프로퍼티 접근, 배열 원소 접근 등 사용 예제 ]


1
2
let array : [String]? = ["A""B"]
let str = array?[1].lowercased()



6. 강제 언래핑과 옵셔널 체인

옵셔널 체인과 같은 방식으로 사용하는데 ? 대신에 ! 을 사용합니다.

nil 일 경우 error가 발생됩니다. 따라서 사용하는데 있어서 확실히 nil 이 아닌 경우만 사용할 것을 권장합니다.


1
2
var optionalStr : String= nil
let str = optionalStr!.lowercased()  // error


7. 강제 언래핑과 옵셔널 체인

Implicitly unwrapping Optional 줄여서 IUO 방식입니다. 쉽게 말해서 타입 선언 뒤에 ! 을 사용하게 됩니다. 

타입 선언 뒤에 "!"을 포함하게 되면 nil 다루기 가능하며,  nil로 자동 초기화 됩니다.

nil로 자동 초기화 되다는 말은 값이 없을 경우 nil이 들어간다는 것이며 위에서 언급 했듯이 nil로 자동으로 언래핑 되기에 확실히 nil 이 아닌 경우에는 주의를 해야 합니다.


1
2
3
4
5
let iuoStr : String! = "Hellow"
iuoStr.lowercased()
 
iuoStr = nil
iuoStr.lowercased() // error




정리

옵셔널은 Null로 인한 오류를 최대한 방지하기 위해서 나온 개념으로 타입 뒤에 ? 을 붙는 방식으로 사용합니다. 언래핑, 옵셔널 바인딩, 옵셔널 체인 등 다양한 기법들이 있으며 실제 소스에서도 자주 사용하는 기법입니다. 이번 포스트로 조금이나마 도움이 되면 좋겠습니다.




참고 














반응형
댓글