본문 바로가기

Dev/iOS & SWIFT

[Swift] 옵셔널 (Optional) | 옵셔널 사용하는 방법 | 옵셔널 바인딩 (Optional Binding) | 강제 추출 (Force Unwrapping)

728x90

옵셔널이란? (Optional)

  • 값이 있을 수도 있고, 없을 수도 있다는 개념
  • 즉, nil의 가능성을 문서화하지 않고도 명시적으로 코드에서 표현할 수 있음 👉 시간 절약
  • 예) 전달받은 값이 옵셔널이 아니라면 nil 체크를 하지 않더라도 안심하고 사용 👉 효율적이고 안전
// someOptionalParam can be nil
func someFunction(someOptionalParam: Int?) {
	// ...
}

//someParam must not be nil
func someFunction(someParam: Int) {
	// ...
}

someFunction(someOptionParam: nil)
someFunction(someParam: nil) // 오류발생 - 옵셔널이 아닌 타입에는 nil을 보낼 수 없기 때문

 

옵셔널은 열거형 방식이기 때문에 switch-case 문을 사용하여 처리해줄 수 있음

옵셔널을 선언하는데에는 아래와 같은 여러 방법이 있으나, 보통 ? 혹은 !을 사용

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

 

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

var optionalValue: Int! = 100

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

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

// nil 할당 가능
optionalValue = nil

// 잘못된 접근으로 런타임 에러 - nil에 1을 더하려고 했기 떄문
optionalValue = optionalValue + 1

 

? (Optional) : 옵셔널

var optionalValue: Int? = 100

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

// nil 할당 가능
optionalValue = nil

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

 

옵셔널 사용하는 방법

1. 옵셔널 바인딩 (Optional Binding)

  • 옵셔널의 값을 꺼내오는 방법 중 하나
  • 안에 값이 있는지 없는지 체크 후 있다면 꺼내옴!
  • nil 체크 + 안전한 값 추출
  • if-let 방식을 사용 👉 런타임 오류가 발생하여 프로그램이 정지할 일이 없음
var myName: String? = "yagom"
var yourName: String? = nil

// 반드시 if-let을 사용하여 옵셔널 바인딩 수행 가능
if let name = myName, let friend = yourName {
	print("\(name) and \(friend)" 
}
// yourName이 nil이기 때문에 실행되지 않음

yourName = "haha")
if let name = myName, let friend = yourName {
	print("\(name) and \(friend)"
}
// yagom and haha

 

2. 강제 추출 (Force Unwrapping)

  • 옵셔널의 값을 꺼내오는 또 다른 방식
  • 옵셔널에 값이 들어있는지 판단하지 않고, 강제로 보호막을 깨부셔서 꺼내오는 방법
func printName(_ name: String) {
	print(name)
}

var myName: String? = "yagom"
printName(myName!) // yagom

myName = nil
print(myName!) // 강제추출시 값이 없으므로 런타임 오류 발생

var yourName: String! = nil
printName(yourName) // 위에서 변수 선언시 !을 붙여주었기 때문에 값 추출때도 ! 안써도 됨
// nil 값이 전달되기때문에 런타임 오류발생

 

본 내용은 부스트코스의 'iOS 프로그래밍을 위한 스위프트 기초' 강의를 토대로 작성되었습니다

728x90