스위프트 튜토리얼(13) - Optionals
이 포스팅은 위 영상을 보고 작성하는 포스팅이다. (02:05:41 ~ 02:20:48)
Optional은 스위프트를 처음 하는 사람에게 혼란스러운 내용일 수 있다. 차근차근 살펴보도록 하자. 일단 클래스를 하나 만들어 보겠다.
class Person(){
var name = ""
}
class BlogPost {
var title = ""
var body = ""
var author = Person()
var numberOfComments = 0
}
BlogPost라는 클래스를 만들었고 title, body, author, numberOfComments라는 프로퍼티를 가지고 있다. 이 클래스는 클래스 내에서는 프로퍼티의 값을 정하고 있다. 그런데 author가 없는 객체를 원할 때도 있다고 가정해보자. 빈 문자열은 엄밀히 말하면 없는 것이 아니고 빈 문자열인 것이다. 그럼 이렇게 프로퍼티가 없는 객체는 어떻게 생성해야 될까?
우선 그전에 알아야 할 것이 있다. 변수나 상수를 선언할 때 type을 정할 수 있다. 프로퍼티 title의 type을 정해보겠다. 예시를 보도록 하자.
class BlogPost {
var title:String = "" // type 명시
var body =""
var author = Person()
var numberOfComments = 0
}
지금까지 프로퍼티의 타입을 명시하지 않았는데 그래도 오류가 없는 이유는 값을 할당하면서 선언했기 때문이다. 할당하는 값의 타입이 자동으로 그 변수나 상수의 타입이 된다. 즉, 굳이 타입을 지정하지 않아도 할당하는 값에 의해 타입이 정해졌었던 것이다. 그런데 우리는 "값이 없을 수도 있는 프로퍼티"를 만들어야 된다. 방법은 간단하다. 다음과 같이 작성하면 된다.
class BlogPost {
var title:String? // 물음표 추가
var body = ""
var author = Person()
var numberOfComments = 0
}
물음표는 값이 nil이 될 수도 있다는 것을 뜻한다. nil은 "비어있다", "아무것도 아니다"라는 뜻으로 다른 프로그래밍 언어에서 null, nul 등으로 표기된다. 위 클래스의 title 프로퍼티는 String 타입의 값이 있을 수도 있고, 값이 없는 nil일 수 있다. 하지만 body프로퍼티는 String형태의 값이 무조건 있어야 한다.
author 프로퍼티의 타입과 nil이 될 수 있다는 것을 명시하려면 어떻게 하면 될까? 바로 예시를 보자.
class BlogPost {
var title:String? // 물음표 추가
var body = ""
var author:Person? // Person 타입, 물음표 추가
var numberOfComments = 0
}
위 클래스를 설명하면 title과 author는 선택적(optinal)으로 값을 가질 수 있거나 없을 수 있다. body는 String형태의 값을 무조건 가지고 있어야 한다. numberOfComments는 Int형태의 값을 무조건 가지고 있어야 한다.
잠깐 optional에 기원에 대해 말하자면, optional 은 양자역학에서 많이 사용하는 단어이다. 일명 관찰자 효과라고 관찰하느냐 안 하느냐에 따라서 값이 바뀐다는 것이다. 더 자세한 내용은 아래 영상을 참고해보자. 생각보다 재밌다.
다시 조금 더 optional에 대해서 이야기해보자. 만약 닫혀있는 하나의 박스가 있다고 치자. 박스를 열기 전까지 우리는 그 안에 무엇이 있는지 전혀 모른다. 열어봐야 알 것이다. 왜 이 말을 하고 있는지 이 포스팅의 마지막에 가면 알 것이다.
자 이제 BlogPost의 body 값만 바꾸어주고, 객체를 만들어보자.
class BlogPost{
var title:String?
var body = "hey"
var author:Person?
var numberOfComments = 0
}
let post = BlogPost()
print(post.body + " hello") // "hey hello" 출력
body 프로퍼티는 optional이 아니라 무조건 String이 있는 값이기에 문제없이 출력된다. 하지만 title과 같이 optional인 값은 값이 있는지 없는지 먼저 확인해야 한다. 이 확인하는 방법을 Optional Binding이라고 한다. 다음 예시를 보도록 하자.
if let actualTitle = post.title{
print(actualTitle + " sault")
}
post.title에 값이 없을 경위(nil일 경우) if 구문을 실행되지 않는다.
post.title에 값이 있을 경우 if 구문이 실행되고 actualTitle에 post.title 값이 할당되어 있기 때문에 actualTitle값을 사용할 수 있다.
다음과 같이 값이 있는지 없는지 테스팅하고 사용할 수도 있다.
if post.title!= nil{
print(actualTitle + " sault")
}
다음과 같이 값이 없을 때를 체크하여 값이 없을 때 실행되는 코드를 작성할 수 도 있다.
if post.title == nil{
// Optional contains no value
}
==은 비교 구문으로 "같은지"를 확인한다. =를 하나만 사용하면 값을 할당하는 것이 되니 조심해서 사용하도록 하자.
그런데 스위프트를 하다 보면 저런 if구문을 쓰기가 번거로울 때가 있다. 그럴 때는 값이 있다고 강제할 수 있다. 다음 예시를 보자.
print(post.title! + " sault") // 느낌표를 붙임
post.title에 값이 있든 없든 무조건 사용하겠다는 것이다. 물론 위험할 수 있는 코드이다. 값이 없을 수 있으니까.
이상 끝!
'스위프트' 카테고리의 다른 글
| SwiftUI에서 CustomColor 사용하기 (0) | 2021.01.16 |
|---|---|
| 스위프트 클로저(feat. 함수) (0) | 2021.01.15 |
| 스위프트 튜토리얼(12) - Initializer (0) | 2020.12.30 |
| 스위프트 튜토리얼(11) - UIKit (0) | 2020.12.29 |
| 스위프트 튜토리얼(10) - Class, 클래스(2) (0) | 2020.12.26 |