[Swift]Optional

한상욱·2024년 9월 9일

Swift문법

목록 보기
10/12
post-thumbnail

들어가며

이 글은 Swift 문법 정리글입니다.

옵셔널(Optional)이란?

Optional은 해당 데이터가 nil이 될 수 있음을 의미합니다. nil은 Swift에서는 NULL을 의미하게 되며, Optional을 활용하여 프로그래밍을 진행하면 효율적인 코딩이 가능합니다.

옵셔널을 왜 쓸까?

Optional을 사용하지 않는다면, NULL이 될 수 있는 가능성을 문서 또는 주석으로 작성할 것이지만, Optional을 이용하면 컴파일러가 nil이 될 수 있는 가능성을 확인하여 에러를 반환하기 때문에 예외 상황을 최소화하고 효율적으로 코딩을 할 수 있을 것입니다.

옵셔널 선언(Declare Optional Value)

Optional은 아래와 같이 표현됩니다.

enum Optinal<Wrapped> : ExpressibleByNilLiteral {
	case none
    case some(Wrapped)
}

let optionalVal : Optional<Int> = nil
let optinalVal : Int? = nil

enum과 general이 합쳐진 형식으로 표현되는데요. 이러한 Optional 데이터를 선언하기 위해서는 Optional에 general 표현을 같이 써야 하나, ?를 이용해서 간단하게 표현할 수 있습니다.

암시적 추출 옵셔널(Implicitly Unwrapped Optional)

암시적 추출 옵셔널은 !를 이용하여 해당 데이터를 선언하는 것을 의미합니다.

let optionalVal : Int! = 10

이렇게 선언한 변수는 정수 또는 nil을 둘다 할당할 수 있으나, 잘못사용하여 연산을 진행하면 런타임 오류가 발생할 수 있습니다.

var optionalValue : Int! = 10
switch optionalValue {
  case .none:
      print("This Optional Value is Nil")
  case .some(let value):
      print("Value is \(value)")
}
>> "Value is 10"

옵셔널 타입 자체는 열거형이기 때문에 switch case 구문을 통해 구분이 가능합니다.

옵셔널 추출(Optional Unwrapping)

옵셔널을 통해 선언된 변수나 상수는 값이 기본적으로 어떠한 상자안에 안전하게 보관된 방식이라고 생각하면 편합니다. 일반적인 변수, 상수는 바로바로 값을 가져올 수 있지만, 옵셔널 값들은 상자를 제거해야 값에 접근이 가능합니다.

Swift에서 Optional 타입은 switch case 구문으로 구분이 가능하나
실질적인 값 추출은 옵셔널 바인딩(Optional Binding), 강제 추출(Force Unwrapping)방식으로 할 수 있습니다.

Optional Binding

옵셔널 바인딩은 nil체크를 하며 안전하게 값을 가져오는 추출방법입니다.
일반적으로 if let 구문을 통해서 옵셔널 바인딩을 할 수 있습니다.

var optionalValue : Int! = 10
if let value: Int = optionalValue {
    print(value)
} else {
    print("Value is Nil")
}
>> 10

if let 구문은 동시에 여러값에 대해서 옵셔널 바인딩을 수행할 수 있습니다.

var first : Int? = 10
var second : Int? = 20
if let x: Int = first, let y : Int = second {
    print("x value is \(x), y value is \(y)")
}

>> "x value is 10, y value is 20"

하지만 하나라도 조건을 만족하지 않는 경우 즉, 둘 중 하나라도 nil이 할당된 경우에는 스코프를 실행할 수 없습니다.

var first : Int? = 10
var second : Int? = nil
if let x: Int = first, let y : Int = second {
    print("x value is \(x), y value is \(y)")
}

>> 실행 안됨

Force Unwrapping

옵셔널 값에 !를 붙이게 되면 강제로 값을 끄집어낼 수 있게 됩니다.

var optionalValue : Int? = 10

print("optionalValue is \(optionalValue!)")

>> "optionalValue is 10"

하지만 이 경우에 값이 nil인 경우에 안전한 예외처리를 보장하지 않기 때문에 런타임 오류가 발생하게 됩니다.

var optionalValue : Int? = nil

print("optionalValue is \(optionalValue!)")

>> 런타임 오류
profile
자기주도적, 지속 성장하는 모바일앱 개발자의 기록

0개의 댓글