본문 바로가기
Swift

3. 옵셔널

by 루에 2015. 9. 30.
반응형

옵셔널(Optional)


Swift에서 일반적인 변수나 상수는 값이 설정돼있어야 한다. 값이 설정되지 않은 상태를 nil이라고 하고 옵셔널로 선언해야 한다.

Swift에서 객체형 변수외에도 nil은 Int나 Float와 같은 원시 타입에도 사용할 수 있다. 그러나 다음과 같이 변수에 nil을 대입하는 방식은 에러가 발생한다.

var i = nil  // error


nil을 다루려면 옵셔널 타입으로 선언해야 한다. 옵셔널로 변수나 상수를 정의하려면 타입에 물음표를 붙여서 선언하며 타입 선언을 생략할 수 없다.

var i : Int? = nil



옵셔널 사용하기


nil에 함수를 호출하거나 프로퍼티를 접근하려고 하면 런타임 에러가 발생한다. 컴파일러는 nil이 될 수 있는 옵셔널 타입에 프로퍼티나 메소드를 호출하려고 하면 에러를 발생한다.

var optionalStr : String?

optionalStr?.toInt()    // 컴파일 에러



if-let패턴


if문을 이용해 옵셔널의 nil여부를 판단할 수 있다. if문에 let을 결합하는 옵셔널 바인딩(Optional Binding)은 옵셔널을 사용할 때 자주 사용하는 코드 패턴이다. if문의 바디에서 옵셔널이 아닌 일반 타입으로 사용할 수 있다.

if let str = optionalStr {

    // optionalStr 옵셔널이 아닌 경우

}

else {

    // optionalStr nil 경우

}



nil 결합 연산자


nil 결합 연산자(nil coalescing operator)는 ??(물음표 2개)로 사용한다. 연산자 앞의 값이 nil이 아니면 그 값을 사용하고 nil이면 연산자 오른쪽의 값을 사용한다. 마치 변수가 nil일 때를 대비한 기본값처럼 사용한다.

var userColor : String?

//nil이면 Red 사용

var color = userColor ?? "Red"



옵셔널 체인과 강제 언래핑


옵셔널로 선언된 변수를 사용할 때마다 if let을 이용한 옵셔널 바인딩 코드를 작성하는 것은 번거로운 일이다.

옵셔널 변수의 메소드나 프로퍼티를 사용할 때 물음표를 이용한 옵셔널 체인과 느낌표를 이용한 강제 언래핑을 사용할 수 있다.

옵셔널 체인은 객체가 nil이면 더 이상 객체에 접근하지 않고 nil을 반환한다. 따라서 옵셔널 체인의 결과도 옵셔널 타입이다. 이에 비해 강제 언래핑으로 객체에 접근한 결과는 옵셔널 타입이 아니지만, 객체가 nil인 경우에는 에러가 발생한다.

var optionalStr1 : String? = "aaaa"


// 옵셔널 체인 : str1 옵셔널

let str1 = optionalStr1?.uppercaseString

let num1 = optionalStr1?.toInt()?.successor()

// 강제 언래핑 : str2 옵셔널이 아니다.

let str2 = optionalStr1!.uppercaseString

let num2 = optionalStr1!.toInt()!.successor()


// nil 대한 강제 언래핑 - 에러

optionalStr1 = nil

let str3 = optionalStr1!.uppercaseString



암시적 언래핑 옵셔널(Implicitly Unwrapped Optionals)


옵셔널을 사용하다 보면 코드의 많은 부분에 if let을 이용한 옵셔널 바인딩이나 느낌표 혹은 물음표를 작성하게 된다. 암시적 언래핑 옵셔널은 강제 언래핑이 자동으로 발생하는 옵셔널 타입으로 타입 선언에 느낌표를 사용한다.

// 암시적 언래핑 옵셔널 타입

var optionalStr2 : String!


// 암시적 언래핑 옵셔널 타입은 일반적인 메소드나 프로퍼티에 접근 가능

optionalStr2 = "123"

optionalStr2.toInt()    // 가능




반응형

댓글