본문 바로가기
etc/Swift

옵셔널(Optional)

by IT learning 2021. 5. 17.
728x90

옵셔널이란?

값이 있을수도 있고, 없을수도 있음을 표현하는 것

nil이 할당될 수 있는지 없는지 표현

import Swift
//someOptionalPram에 nil이 할당 될 수 있다.
func someFunction(someOptionalParam: Int?) {
    //...
}

// someOptionalPram에 nil이 할당 될 수 없다.
func someFunction(someOptionalParam: Int) {
    
}


someFunction(someOptionalParam: nil)

위와 같이 형식에 ? 가 붙어있으면 nil이 할당될 수 있고, 없으면 할당될 수 없는 것이다.

 

 

옵셔널을 쓰는 이유

명시적 표현

nil의 가능성을 코드만으로 표현가능

문서/주석 작성 시간 절약 가능

 

안전한 사용

전달받은 값이 옵셔널이 아니라면 nil체크를 하지 않고 사용가능

예외 상황을 최소화 하는 안전한 코딩

효율적 코딩

 

옵셔널 문법과 선언

/*enum Optional<Wrapped>: ExpressibleByNilLiteral {
    
    case none
    case some(Wrapped)
}*/

let optionalValue: Optional<Int> = nil
let optionalValue: Int? = nil

 아래의 두 코드를 보면 둘다 nil을 할당 할 수 있는 코드들이다.

 

느낌표를 이용한 암시적 추출 옵셔널

var implicitlyUnweappedOptionalValue: Int! = 100

switch implicitlyUnweappedOptionalValue {
case .none:
    print("This Optional variable is nil")
case .some(let value):
    print("Value is \(value)")
}

// 기존 변수처럼 사용가능
implicitlyUnweappedOptionalValue = implicitlyUnweappedOptionalValue + 1

// nil 할당 가능
implicitlyUnweappedOptionalValue = nil

// 잘못된 접근으로 인한 런타임 오류 발생
//implicitlyUnweappedOptionalValue = implicitlyUnweappedOptionalValue + 1

기존의 옵셔널과 같이 같은 switch 문의 case 들을 가지고 있고, nil일 경우 This Optional variable is nil 을 출력하고, 값일 경우 그 값을 출력해준다.

 

아래 코드와 같이 기존 변수처럼 더하거나 빼는것 같은 행위를 할수 있고 , nil 또한 할당이 가능하다.

그러나, 마지막 코드에서 볼 수 있듯이, nil로 이미 할당을 해준 것에 +1을 하게 될 경우 잘못된 접근으로 인한 런타임 에러가 발생하게 된다.

 

물음표를 이용한 옵셔널

var optionalValue: Int? = 100

switch optionalValue {
case .none:
    print("This Optional variable is nil")
case .some(let value):
    print("value is \(value)")
}

// nil 할당 가능
optionValue = nil

// 기존 변수처럼 사용불가 - 옵셔널과 일반 값은 다른 타입이므로 연산불가
// optionalValue = optionalValue + 1

물음표를 사용해서 "이것은 Int 값이 들어있을 수도 있고, 아닐 수도 있다" 라는 표현을 하게 된다.

그리고 switch 문으로 값이 있는지 없는지를 확인할 수 있다. 

 

그리고 일반적인 변수처럼 nil 또한 할당이 가능하다.

하지만, Optional 타입은 일반타입과는 다른타입으로 취급이 되기 때문에 연산이 불가능하다. 값 교환 또한 제한된다.

728x90

'etc > Swift' 카테고리의 다른 글

클래스  (0) 2021.05.21
구조체  (0) 2021.05.21
반복문  (0) 2021.05.16
조건문  (0) 2021.05.16
함수 고급  (0) 2021.05.16

댓글

IT_learning's Commit