Swift/개념 & 응용

[Swift] Swift 문법 - Optional

유정주 2021. 8. 17. 00:10
반응형

안녕하세요. 

 

Swift 문법 중 하나인 Optional에 대해 알아보겠습니다.

 

바로 시작하겠습니다.


참고 자료

해당 포스팅은 Smile Han님의 유튜브 영상을 참고하며 작성하였습니다.

https://www.youtube.com/channel/UCM8wseo6DkA-D7yGlCrcrwA

 

Smile Han

 

www.youtube.com


Optional

Swift는 기본적으로 변수나 상수에 nil(값이 없음)을 넣을 수 없습니다.

하지만 실제 개발을 할 때 값이 없는 경우가 꽤 많은데요.

이때 optional 변수를 사용하면 됩니다.

 

Optional 개념은 Ada, Rust, Scala 등의 언어에서도 나온다고 합니다.

 

Optional을 사용하는 이유

위에서 말했듯이 nil 값을 옵셔널이 아닌 변수나 상수에 할당을 하면 에러가 납니다.

변수 또는 상수에 아무런 값이 할당되지 않는 상황을

안전하게 처리하기 위해 Optional을 사용합니다.

 

Optional 선언 방법

일반적인 Optional은 자료형 뒤에 물음표(?)를 붙여 선언할 수 있습니다.

implicitly unwrapped optional은 자료형 뒤에 느낌표(!)를 붙여 선언할 수 있습니다.

implicitly unwrapped optional에 대해서는 아래에서 다루겠습니다.

 

일반적인 자료형과의 차이점

일반적인 자료형으로 선언한 변수나 상수는 값이 무조건 있다고 확신할 수 있습니다.

하지만 Optional 변수나 상수는 값이 없을 수도 있습니다.

그렇기 때문에 기본 자료형과는 다르게 있는 그대로 값을 사용할 수 없습니다.

 

Optional Unwrapping

옵셔널 변수는 사용하기 위해서는 언래핑을 해줘야 합니다.

언래핑을 하는 방법은 옵셔널 변수를 사용할 때 변수명 뒤에 느낌표(!)를 붙이면 됩니다.

언래핑을 하지 않고 출력할 경우 Optional로 출력됩니다.

var x : Int?
var y : Int = 0
x = 10
print(x)
print(x!)
print(y)

실행 결과

변수 x는 Int 뒤에 물음표(?)를 붙여서 옵셔널로 선언했습니다.

따라서 출력을 할 때 언래핑을 하지 않으면 첫 번째 결과처럼 Optional로 출력이 됩니다.

언래핑을 하면 할당된 값이 출력됩니다.

 

그렇다면 한 가지 궁금한 점이 생깁니다.

값을 할당하지 않은 옵셔널 변수를 언래핑하여 출력하면 어떻게 될까요?

아까와 동일한 코드에서 옵셔널 변수에 할당하는 라인을 주석처리해보았습니다.

var x : Int?
var y : Int = 0
//x = 10
print(x)
print(x!)
print(y)

실행결과

첫 번째 결과는 값이 없기 때문에 nil로 출력됩니다.

두 번째 결과는 nil을 언래핑하는 격인데요. 

에러가 출력되는 것을 볼 수 있습니다.

 

옵셔널 nil 판단

따라서 옵셔널에서는 nil인지 아닌지 판단을 해줘야 합니다.

조건문을 이용해 nil인지 아닌지 판단하는 예시입니다.

//옵셔널 !과 !=의 구분을 위해 != 양쪽에 공백을 필수로 넣어야 함.
//붙여 쓸 경우 연산은 옵셔널부터 들어감
var x : Int?
if x != nil {
	print("x is \(x!)")
} else {
	print("x is nil")
}

x = 10
if x != nil {
	print("x is \(x!)")
} else {
	print("x is nil")
}

실행결과

조건문은 위아래 서로 같은 코드입니다.

첫 번째 조건문에서는 x에 값이 없기 때문에 nil로 판단되어 "x is nil"이 출력됩니다.

두 번째 조건문에서는 x에 10 값을 대입한 이후이므로 x is 10으로 출력되었습니다.

 

옵셔널 바인딩(optional binding)

위의 조건문도 하나의 방법이지만 옵셔널 바인딩을 더 자주 사용합니다.

옵셔널에 할당된 값을 임시 변수 또는 상수에 할당하는 방법입니다.

var x : Int?
if let const = x {
	print("x is \(const)")
} else {
	print("x is nil")
}

x = 10
if let const = x {
	print("x is \(const)")
} else {
	print("x is nil")
}

실행결과

위의 코드를 옵셔널 바인딩으로 변경해 보았습니다.

옵셔널 변수인 x를 const 상수에 넣어 이를 출력하는 건데요.

 

nil인 경우 else로 빠져 첫 번째 결과에서는 nil이 출력됩니다.

두 번째 결과는 const에 정상적으로 값이 들어갔기 때문에 true로 판단되어 값이 출력됩니다.

 

이 방법은 자동으로 언래핑이 되기 때문에 const 상수에 느낌표(!)를 붙이지 않아도

값이 출력되는 것을 볼 수 있습니다.

 

여러 옵셔널 변수의 언래핑은 콤마(,)로 할 수 있습니다.

var pet1: String?
var pet2: String?
pet1 = "cat"
pet2 = "dog"

if let tPet1 = pet1, let tPet2 = pet2 {
	//둘 다 nil이 아닐 때
	print("two pet:", tPet1, tPet2)
} else if let tPet1 = pet1 {
	//pet1만 값이 있을 때
	print("only pet1:", tPet1)
} else if let tPet2 = pet2 {
	//pet2만 값이 있을 때
	print("only pet2:", tPet2)
} else {
	//둘 다 nil일 때
	print("nil")
}

실행결과

여러 변수를 동시에 바인딩할 때는 모든 변수에 값이 할당될 때 true로 판단됩니다.

나머지는 false로 판단되니 주의가 필요합니다.

 

암묵적인 언래핑 (implicitly unwrapped)

만약 절대로 nil이 아닌 값이 존재하는 값이 존재한다면 어떨까요?

옵셔널이 항상 유효한 값을 가질 경우

옵셔널이 암묵적인 언래핑이 되도록 선언할 수 있습니다.

 

implicitly unwrapped로 옵셔널을 선언하기 위해서는

선언부에 물음표(?) 대신에 느낌표(!)를 사용하면 됩니다.

옵셔널이 선언된다면 강제 언래핑이나 옵셔널 바인딩을 하지 않아도 값에 접근 가능합니다.

 

implicitly unwrapped optional은 처음 정의된 후에는 값이 존재한다고 보고

앞으로 모든 시점에서도 값이 존재한다고 확신할 수 있을 때 유용합니다. 

Swift에서는 주로 클래스를 초기화 사용됩니다.

let possibleString: String? = "optional"
let forcedString: String = possibleString! 

let assumedString: String! = "implicitly unwrapped optional"
let implicitString: String = assumedString 

print(forcedString, implicitString, separator:"\n")

실행결과

첫 번째 상수는 느낌표(!)를 붙여 언래핑을 직접 해줬습니다.

두 번째 상수는 느낌표를 붙이지 않아도 값이 출력된 것을 볼 수 있습니다.

 

print의 separator는 지난 print 포스팅을 참고해 주세요.

2021.08.15 - [개발,IT,코딩] - [Swift] Swift 문법 - 데이터 타입 기초


오늘은 Swift의 Optional에 대해 알아보았는데요.

아직까지는 알듯 말듯한 느낌이네요.

실제 앱을 만들 때 직접 사용해보면서 정확히 체득을 해야겠습니다.

 

감사합니다!


아직은 초보 개발자입니다.

더 효율적인 코드 훈수 환영합니다!

공감 댓글 부탁드립니다.

 

반응형