[Swift] 옵셔널

김태형·2023년 3월 19일
0

Swift

목록 보기
9/22

이번 글은 옵셔널에 대해 다뤄보려고 한다. 옵셔널은 스위프트의 특징 중 하나인 안전성을 문법으로 담보하는 기능으로, C언어에서는 찾아볼 수 없는 개념이다.

옵셔널

  • 값이 있을 수도, 없을 수도 있다!
  • nil의 가능성을 명시적으로 표현해줌
    - 문서화하지 않아 nil의 가능성을 표현해줘 시간을 절약할 수 있다
  • optional이 아닐 때는 nil을 보낼 수 없음
  • 열거형(enum)과 제네릭(generic)으로 구성되어 있음
    - nil일 때는 case non일 때고, 값이 있을 때는 Wrapped되어 있음
enum Optional<Wrapped> : ExpressibleByNilLiteral {  
	case none
	case some(Wrapped)
}

옵셔널 값 추출

  • 옵셔널을 출력해보면 'Optional(값)'으로 나타나기 때문에 값을 추출해줘야 함

! (암시적 추출 옵셔널)

  • 추출 뒤엔 기존 변수처럼 사용할 수 있음
  • nil 할당 가능
  • 하지만 nil일 때 사용한다면 런타임 오류 발생

?

  • nil 할당 가능
  • 기존 변수처럼 사용불가
  • 옵셔널과 일반 값은 다른 타입으로 연산불가 (옵셔널의 타입은 옵셔널이다!)
    —> 옵셔널을 꺼내는 방법을 배워야 함

옵셔널 값 추출


옵셔널은 값을 보호해주는 상자가 있다고 생각하면 됨
값 추출을 하는 것은 상자 안에 값이 있는지 없는지 확인을 하는 것임 !!

(출처 : 야곰의 스위프트 유튜브)

옵셔널 바인딩

  • 값이 있는지 없는지 확인하고 가져옴
  • nil 체크를 함과 동시에 안전하게 값을 추출할 수 있음
  • if-let 사용
    - 하지만 if-let에서 사용된 변수는 이 내부에서만 사용 가능
    --> guard let을 통해 해결 가능
  • 쉼표를 통해, 한 번에 여러 개의 optional 타입을 바인딩할 수 있음 !
  • but, 모든 조건을 성립해야 에러가 뜨지 않음

강제 언래핑

  • 강제로 추출
  • nil이 있다면, 강제 추출할 값이 없으므로 런타임 오류 발생
  • 전달할 때 알아서 !를 붙여주는 효과와 같음
  • 그다지 추천되지는 않음

func printName( name: String) {
	print(name)
}

var myName: String? = nil

printName(myName)  //값의 타입이 달라 컴파일 오류 발생 : string과 optional은 다른 타입



//if-let

func printName( name: String) {
	print(name)
}

var myName: String! = nil

if let name: String = myName {    //if-let에서 지정된 상수는 if-let 구문 내에서만 사용 가능
	printName(name)
} else {
		print("myName == nil")
}

printName(name)   //이렇게 밖에서 사용 불가능



var myName: String? = "yagom"
var yourName: String? = nil

if let name = myName, let friend = yourName {   //두 가지 다 nil이 아니어야 실행 가능
	print("\(name) and \(friend)")
}   //yourName이 nil이기 때문에 실행 안됨



//optional 강제 추출

func printName( name: String) {    //String 타입
	print(name)
}

var myName: String? = "yagom"    //optional 타입
printName(myName!)  //yagom  --> optional과 String은 다른 타입이라 원래는 불가능한데, !를 통해 optional을 강제 추출하여 가능해짐

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


var yourName: String! = nil   //암시적 추출

printName(yourName)   //런타임 오류, 암시적 추출해서는 알아서 느낌표를 붙여주는 효과 --> printName(yourName!)과 같음


//guard let
var firstValue: Int? = 30
var secondValue: Int? = 50

func unwrap(parameter: Int?) {
    print("unwrap() called")
    //값이 없으면 리턴
    guard let unWrappedParam = parameter else { return }
    print("unWrapped Param : \(unWrappedParam)")
}

unwrap(parameter: firstValue)   //firstValue값이 nil이라면 unWrappedParam : 부분은 print되지 않음 !


[출처] 스위프트 프로그래밍 (야곰), 야곰의 스위프트 기초문법 강좌, 개발하는 정대리 스위프트 강좌

0개의 댓글