티스토리 뷰

iOS/Swift

[Swift] Optional

yanni13 2024. 3. 28. 02:39

 

 

이번 스위프트 스터디에서는 면접질문을 바탕으로 swift 문법 공부에 대해 공부하고 포스팅하기로 했다!

질문에 대한 답변을 하고, 위 질문에 대한 주제를 바탕으로 공부한것들을 정리해보는 방식으로 진행하겠다.

 

첫번째 주제는 optional이다.

 

 

질문

 

 

 

답변

1️⃣ Optional

Swift에서 옵셔널이란 무엇이며 언제 사용해야 하나요?

 

옵셔널이란, 값이 있을 수도 있고 없을 수도 있는 변수나 상수(=nil값)를 다룰 때 사용한다.

var optionalString: String? = "Hello"

 

정의하려는 타입뒤에 (?) 물음표를 사용하여 정의한다.

 

2️⃣ 옵셔널 바인딩 VS 강제 언래핑

옵셔널 바인딩과 강제 언래핑의 차이점은 무엇인가요?

 

 옵셔널 바인딩은 옵셔널에 값이 있는지 확인하고 값이 있다면 저장된 값을 안전하게 추출하기 위해 새로운 상수나 변수에 할당하여 사용하는 안전한 방법이다.

if let, guard let 구문을 사용하여 안전하게 확인해보는게 가장 큰 특징이다.

 

if let safeString = optionalString {
    print(safeString) // Hello 출력
} else {
    print("nil")
}

 

optional이 들어있는 변수를 새로운 변수에 할당하여 껍대기를 벗겨내는 것이다. (옵셔널에서 추출)

그치만 여러 변수를 정의할 필요 없이 기존에 정의된 변수를 사용해 if let optionalString = optionalString { ... } 해서 사용도 가능하다.

 

 강제 언래핑은 옵셔널 값을 강제로 추출하는 방법으로 반드시 옵셔널 값이 있을 때에만 사용해야 한다. 

 

즉, nil 값을 처리할 때 옵셔널 바인딩은 값을 안전하게 처리할 수 있는 반면 강제 언래핑은 nil값일 경우 런타임 오류로 이어질 수 있어 안정성 측면에서 위험하다. 

 

가능한 강제 언래핑 하는 방식은 위험하고 리스크가 많아 피하는게 좋다고 하며, 반드시 옵셔널 값이 있을 때 인지 확인할 수 없으니 가능한 사용을 피하자.

 

var myPuppy: Int? = 3
let Puppy: Int = myPuppy!
print(Puppy) // 3

 

myPuppy는 옵셔널 정수 값을 가지고 있는 변수이고, 3이라는 값을 확실하게 가지고 있으니 Puppy라는 변수를 할당하여 myPuppy값에 강제 언래핑(!)을 함으로써 3이라는 값을 넘겨주는 것을 확인할 수 있다.

 

 

3️⃣ 옵셔널 체이닝

 

옵셔널 체이닝의 동작원리를 설명해주세요.

 

옵셔널 체이닝이란 옵셔널을 연쇄적으로 사용하는 것이며, dot(.)을 통해 프로퍼티나 메서드에 옵셔널이 하나라도 붙어 있으면 옵셔널 체이닝이라고 한다.

예를 들어 john.residence?.numberOfRooms  은 .(dot)을 기준으로 옵셔널이 껴있는 구조이다. 

? 앞의 대상이 nil 값이면 ?.뒤의 numberOfRooms는 nil을 반환한다.

 

옵셔널 체이닝은 강제 언래핑의 위험 없이 옵셔널 값을 처리한다는 장점이 있다.

 

4️⃣ 암시적 언래핑 옵셔널

암시적 언래핑 옵셔널을 사용하는 경우는 언제인가요?

 

암시적 언래핑 옵셔널은 옵셔널 타입은 기본적으로 옵셔널을 가지지만, 값을 사용할 때마다 옵셔널을 언래핑하지 않아도 된다.

암시적 언래핑 옵셔널은 타입 뒤에 느낌표(!)를 사용하여 정의한다.

 

초기화 후 항상 값을 가지는 경우 : 처음 set된 이후부터 optional이 항상 값을 가진다는 것이 확실하기 때문에 optional의 값을 확인하고 언래핑하는 코드를 매번 작성하는 것은 불필요하기 때문

 

초기설정이 뒤늦게 이루어지는 경우 : 어떤 클래스나 구조체의 초기화가 끝난 후에 값을 할당할 수 있는 경우 서로 의존하는 두 클래스와 구조체 사이의 순환 참조 문제를 해결할 때 유용하다.

 

옵셔널이 아닌 API와의 상호작용 : 항상 값이 있는 API와 상호작용 할 때 사용되어야 한다.

 

5️⃣ nil 병합 연산자(??)

nil 병합 연산자(??)의 사용 예시를 들어주세요.

 

nil 병합 연산자는 ?? 를 사용하여 하나로 한줄로 언래핑하여 합친다는 의미를 가진다.

let optionalInt: Int? = nil
let result = optionalInt ?? 0
print(result) // 0을 출력

 

위의 예제는 optionalInt가 nil일 경우 0을 반환하도록 하며 result 변수에는 0이 저장되고 출력된다.

만약 let optionalInt: Int? 까지만 작성하고 nil 값으로 초기화 하지 않았다면 선언되지 않았다는 오류가 나타난다.

 

optionalInt 값에 nil값이 아닌 다른 값이 존재한다면, nil 병합연산자는 optionalInt의 값을 언래핑하고 그 안에 있는 값을 출력하도록 한다.

'iOS > Swift' 카테고리의 다른 글

[iOS] lazy var에 대해 알아보기  (0) 2024.09.21
[iOS/Swift] Closure  (0) 2024.05.08
[swiftUI] NSPredicate  (0) 2024.03.30
[swift] Combine이랑 ObservableObject 예제로 파헤치기  (0) 2024.03.15
[Swift] map 함수 정리하기  (0) 2024.02.27
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함