Search
Duplicate

[Swift] Optional에 대한 간단한 정리

간단소개
Optional에 대해 이해한 대로 간단하게 정리해보았습니다. 옵셔널 체이닝은 다루지 못했습니다.
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
Swift
Scrap
태그
9 more properties
Swift에서는 변수에 값이 없다는 것을 표기하기 위한 방법이 존재하는데, 이걸 optional이라고 한다.
변수를 사용하다 보면 아예 값이 없는 경우가 필요할 때가 있고, 이게 0으로 표현하긴 부족할 때가 있다.
이럴 때 optional을 통해 nil이란 값을 넣어준다..

1. Optional이란?

선언은 다음과 같이 한다.
var iAmOptionalInteger: Int?
Swift
복사
자료형 뒤에 ?를 붙여주면 된다! 귀엽다.
초기화해주지 않아도 nil로 초기화된다.
var iAmOptionalInteger: Int? = nil
Swift
복사
두 코드가 같다고 봐도 된다.
이런 변수들은 그냥 쓰면 에러가 나기 때문에, 옵셔널 추출이란 걸 해줘야 쓸 수 있다.
var iAmOptionalInteger: Int? = nil var giveMeAValue: Int giveMeAValue = iAmOptionalInteger // 여기서 에러가 난다.
Swift
복사
왜냐? giveMeAValue라는 변수는 nil을 담을 수 없기 때문이다.. 근데 iAmOptionalInteger변수가 nil이 아니고 값을 가지고 있어도 에러는 난다.
value of optional type 'Int?' must be unwrapped to a value of type 'Int' giveMeAValue = iAmOptionalInteger
replit에서 실행시켜봤을때 대충 이런 에러가 난다. iAmOptionalInteger를 nil이 아닌 값으로 초기화해줘도 같다.
결국 옵셔널 변수를 사용하려면 unwrap이라는 것을 해줘야 하나보다.
호기심이 동해서
var iAmOptionalInteger: Int? var giveMeAValue: Int? = 1 giveMeAValue = iAmOptionalInteger print(giveMeAValue)
Swift
복사
이런 것도 실행해봤는데, 경고를 잔뜩 띄우지만 nil을 출력하긴 하더라..

2. unwrap은 어떻게 할까요??

그것이 문제였습니다...
방법이 여러가지가 있어서 더 어려운 것 같다..
강제 추출
var iAmOptionalInteger: Int? var giveMeAValue: Int giveMeAValue = iAmOptionalInteger!
Swift
복사
이렇게 변수 뒤에 !를 붙이면, nil이 아닌 경우에 값을 꺼내어준다.
그럼 nil이면??
런타임 에러가 난다.. 실제로 프로그램에 사용하는 것은 지양해야 하고, 개발 중에는 터지는 부분을 확인할 수 있어 유용하다고 들었다.
옵셔널 바인딩
왜 바인딩이라고 부르는지 잘 모르겠지만..
var iAmOptionalInteger: Int? var giveMeAValue: Int if let temporary = iAmOptionalInteger { giveMeAValue = temporary } else { giveMeAValue = 0 }
Swift
복사
위 코드의 경우, iAmOptionalInteger를 임시로 temporary에 할당해주어서 쓴다. 이름이 굳이 temporary일 필요는 없다. 이 let은 해당 {} 안에서만 쓸 수 있다. if문을 벗어나선 쓸 수 없고 당연히 else문에서도 쓸 수 없다.
nil이라면 else문으로 가서 코드블럭 안의 내용을 실행한다.
nil 병합
이것도 왜 이름이 병합인지 모르겠다..
var iAmOptionalInteger: Int? var giveMeAValue: Int giveMeAValue = iAmOptionalInteger ?? 0
Swift
복사
옵셔널 바인딩 부분의 코드와 같은 결과를 낸다.
iAmOptionalInteger가 값을 가진다면 그것을, 아니라면 “??” 뒤의 값을 giveMeAValue에 준다.
이게 더 편해 보이는데 왜 굳이 옵셔널 바인딩을 하냐? 하면
얘는 대입만 해줄 수 있지만 바인딩에서는 if문 안에서 여러가지 더 복잡한 것들을 해줄 수 있기 때문이지 않을까..라고 짐작한다.