본문 바로가기

Swift-IOS

옵셔널 변수

스위프트 언어의 특징 중 하나인 옵셔널(Optional) 변수를 활용한 널(Null) 체크를 진행하는 법을 확인해보겠습니다.

 

자바에서 가장 많이 나는 Exception으로 NullPointerException이 있는데 옵셔널 변수를 활용하면 이러한 빈도를 눈에 띄게 줄일 수 있습니다.


var myNum1: Int = 10 // 10이라는 실제값으로 초기화 했으므로 nil이 아님

var myNum2: Int? = nil // 명시적으로 null일 수도 있음 --> 옵셔널 변수 선언

 

 

앞에 예제는 명시적으로 값을 넣어 초기화한 경우는 널체크를 할 필요가 없지만 구체적인 값을 명시하지 않을 경우 

옵셔널 변수를 통해 널 체크를 하면 됩니다. (myNum2 처럼)

 

허나, myNum2를 출력하면 오류가 날 것입니다.  명시적인 값이 아니라 nil이기 떄문에 오류나는 것이므로 이를 해결해야합니다.

옵셔널 변수를 안전하게 사용하는 방법은 다음과 같습니다.

 

  • 옵셔널 바인딩 - if let 구문(1)
  • 가드 문장 - guard let, guard else 구문(2)

 

옵셔널 바인딩 - if let 구문을 쓸 경우 다음과 같습니다.

(if let 구문을 사용할 변수는 반드시 옵셔널 변수를 통해 초기화를 해놔야 합니다! 옵셔널 변수가 아닌 경우 if let 구문을 사용할 수 없습니다!)


myNum2 = 20

if let newMyNum2 = myNum2 {

    // null(nil)

    print("is not null")

} else {

    // not null

    print("is null")

}

 

앞서 nil로 초기화하고 아래 20이라는 값을 명시적으로 부여할 경우 if let 옵셔널 바인딩 구문을 통해 "is not null"이 출력될 것입니다.

하지만 myNum2에 값을 넣지 않고 nil로 옵셔널 변수를 활용해서 초기화한걸 그대로 if let 구문으로 표현할 경우 "is null"이 출력될 것입니다.

 

 

  • 강제 언래핑 forced unwrapping

null(nil)임을 감수하고 또는 확신하고 해당 실제 값을 추출해오는 것을 의미합니다.

위에 내용 그대로 이어져서 다음 변수를 출력하면 다음과 같습니다.

 

print(myNum2) // Optional(20)\n

 

이에 대해서 값을 강제해서 뽑을 경우 ! 연산자를 넣으면 됩니다.

print(myNum2!)  // 20 추출 

 

이러한 강제 언래핑을 사용하기 위해서는 해당 변수가 확실하게 값이 있어야 하며, nil일 경우는 오류가 발생합니다.

 


guard let - else 구문(2)

 

guard 뒤에 붙은 내용이 true일 때 코드가 지속됩니다.  if 구문과는 다르게 guard let은 else 구문을 반드시 포함시켜야 합니다.

guard 뒤에 붙은 내용이 false일 때 else로 빠져서 코드가 진행됩니다.

else로 빠질 경우 상위 블록까지 모두 종료시키는 return 구문이 필요합니다.

그 외로는 continue, break, throw 등으로 else 쪽에서 처리해도 됩니다. 


isNotNilCheck()

 

func isNotNilCheck(){

    var myStr: String? = nil

    myStr = "test"

    guard let newMyStr2 = myStr else {

        print("nil!!")

        return

    }

    print("not nil!!")

}

 

다음처럼 isNotNilCheck 함수로 블록을 만든뒤 그 안에서 guard let 구문을 쓰는데, let 다음에 나오는 로직이 true이면 쭉 진행되어서 not nil이 출력되고, 만약 false일 경우 else 블록으로 빠져서 nil이 출력되면서 함수가 리턴됩니다.

 

이러한 방식으로 옵셔널 변수를 안전하게 사용할 수 있고 추가로 ?? 연산자를 활용하게 된다면 nil이어도 이후 선언한 디폴트값이 결과로 출력됩니다. 


var name: String? = nil

print(name ?? "test") 

--> test 출력

 

 

이상 옵셔널 관련 내용을 정리하였습니다. 

 

감사합니다.

 
반응형

'Swift-IOS' 카테고리의 다른 글

Swift : func (함수)에 대해서  (0) 2023.01.17
Swift: array, dictionary, set, tuple, enum  (0) 2023.01.17
문자열 관리  (0) 2023.01.17
반복문  (0) 2023.01.17