[iOS] Optional 과 Optional Binding

doyeonjeong_·2022년 7월 16일
1

iOS

목록 보기
3/3
post-thumbnail

Swift 문법을 공부하면서 제일 이해하기 어려운 부분인 Optional에 대해 자세히 알아보기 위해 구글링을 하고 내가 이해한 내용을 바탕으로 정리해보았다.

Optional

간단하게 말하자면 let optionalValue: Int? 처럼
변수를 선언할 때 타입의 뒤에 ?를 붙여주면 Optional 이 된다.
?의 뜻은 값이 있을수도있고 없을수도 있다

그럼 왜 이게 필요할까?

Swift에서는 기본적으로 변수를 선언할 때 nil 값이 들어가는 것을 허용하지 않는다.

var optionalValue: String = nil // 컴파일 에러 
var optionalValue: String? = nil 
var optionalValue: String? // 위 문장과 동일하게 nil 값임

여기서 잠깐 nil 에 대해 2가지만 간단히 짚고 넘어가자.
1. nil은 optional 변수 외에 사용할 수 없다.
2. nil != null null은 pointer가 존재하지 않는 값을 가리켰지만 nil은 value가 없다는 뜻이다.

nil에 대해서 나중에 더 자세하게 다룰 예정이다.

Swift에서 String을 Int로 캐스팅 하게되면 특이하게 Optional로 결과가 나온다.

let stringNum =123let convertedNum = Int(stringNum)

print(convertedNumber) // 출력 : Optional(123)

이걸 보면 123이라는 값이 Optional에 마치 Wrapping 되어있는 것 같다.
우리는 123이라는 값만 필요하기 때문에 Unwrapping 과정이 필요하다.

Unwrapping의 2가지 종류

  1. Forced Unwrapping
  2. Optional Binding

1. Forced Unwrapping

만약 위의 예시처럼 출력 값이 무조건 있다면 (nil이 아니라는게 보장된다면)
끝에 느낌표를 붙이는 것 만으로 123을 꺼낼 수 있다.
Optional(123) -> Optional(123)!

변수 선언할 때 아예 느낌표를 붙이면 되지 않을까?

let value1: String? = nil  
let value2: String! = nil // 에러 안남

print(value1) // nil 출력
print(value2) // unwrap된 상태에서 nil 값 출력시 런타임 에러

왜 안되지? 🤔

일단 print할 때 오류가 났다는 점에 주목해보면
value2는 !에 의해 자동으로 unwrap된 상태가 된다. ( 출력값 : nil )
하지만 아까 nil은 value가 없는 상태라고 했다. 즉, print 할 값 자체가 존재하지 않는다.
그렇기 때문에 런타임 에러가 발생한다. (라고 이해했다.)

짧게 말해서 예외처리 과정이 또 필요하다.

그래서 예외처리를 짧게 해주는 방법이 뭐냐? 그게바로

2. Optional Binding

일단 Optional Binding 공식은 이거다.

if let 임시변수명 = Optional 변수 {  
	// Optional 변수에 값이 있다면 let 임시변수에 할당해라
} else {
	// 그렇지 않으면 어쩌구..
}

대충 여기까지만 알아도 사용할 수 있는 간결한 문법이다.
if-let 한문장으로 optional 값이 있으면 바로 값을 꺼내서 변수에 할당할 수 있다.
이 때 주의할점은 if-let 구문안에 있는 임시변수는 구문 내에서만 쓰이는 로컬변수라는 점!

Optional Binding의 기능을 2가지로 요약하자면
1. Optional type의 변수에 대한 nil 체크
2. 로컬 변수에 값을 할당하여 바로 사용

정도로 할 수 있겠다!

reference

https://medium.com/@codenamehong/swift-optional-1-54ae4d37ee09

profile
블로그 이사중 🚚 byukbyak.tistory.com

0개의 댓글