
목차
11. 언래핑(unwrapping)이 뭘까?
12. dictionary / optional 이 뭘까?
13. binding / optional binding이란?
14. == / !=는 뭘까?
15. 옵셔널은 배열에도 있을까?
앞서 코딩을 진행하다보니 궁금한 것이 생겼다.
let selectedQuizList = quizCategory[selectedCategory]!
위 코드에서 ! 는 왜 있는걸까?
!의 정체는 Swift에서 "강제 언래핑(force unwrapping)"이라고 부른다는데 뭘까?
11. 언래핑(unwrapping)
언래핑이 뭔지 설명을 찾아보니 Swift는 안전한 언어라서 딕셔너리(dictionary)에서 값을 꺼낼 때 "이 키가 없을 수도 있어"라고 경고를 준다고 한다. 예를 들어보자:
let quiz = quizCategory["일반상식"]
이렇게 꺼내면 quiz의 타입은 [(String, String)]? 즉, 옵셔널 튜플 배열이라고 한다. 이유는 "일반상식" 이라는 키가 존재하지 않을 수도 있기 때문이라고 한다. (위 타입 및 값이 이해가 안되면 이전 포스팅을 보기 바란다. ^^)
옵셔널을 그대로 쓰면 못 쓴다고 한다. 예시를 들어보면,
let shuffledQuizList = Array(quiz.shuffled())
이건 쓸 수가 없다고 한다. 왜냐하면 quiz가 옵셔널이기 때문에...
여기서 집고 넘어가야할 것은 dictionary는 뭐고 optional은 뭔가? 어디서 들어봤는데...
12. dictionary란? / optional이란?
먼저 딕셔너리(dictionary)란 쉽게 풀어 말하면 "단어장" 또는 "연락처" 같은 구조라 생각하면 된다. 예를 들어:
| 이름(Key) | 전화번호(Value) |
| 엄마 | 010-1234-5678 |
| 아빠 | 010-2345-6789 |
위를 Swift에서는 아래와 같이 표현한다.
let phoneBook = [
"엄마": "010-1234-5678",
"아빠": "010-9876-5432"
]
이렇게 했을 때 "엄마"라는 키로 "010-1234-5678" 값을 찾아낼 수 있다.
딕셔너리의 특징은:
- Key로 값을 찾는다.
- 순서가 없다 (["엄마": "전화번호"]처럼)
- 없는 키를 찾으면 nil이 나온다 → 그래서 옵셔널과 연결된다.
다음은 옵셔널이다. 옵셔널을 쉽게 풀어 말하면 "값이 있을 수도 있고, 없을 수도 있음"을 나타내는 상자 같은 거라 한다.
예를 들어보자.
let age: Int? = 20 // 값이 있어
let name: String? = nil // 값이 없어
위 코드를 보면 age는 값이 있고 name은 값이 없다. ?의 의미는 "맞을 수도, 아닐 수도"라 보면 될 것이다.
그럼 Int?와 String? 의 의미를 풀어보면:
- Int?는 "정수일 수도 있고, 아닐 수도 있어"
- String?는 "문자열일 수도 있고, 아닐 수도 있어"
옵셔널은 왜 필요할까?
컴퓨터는 항상 값이 있는지 없는지를 신경 쓴다고 한다. 예를 들어:
let result = phoneBook["형"] // 형은 없어
이때 result는 nil이다. 값이 없다는 뜻이다. (위 phoneBook을 보면 엄마와 아빠만 있다.)
그래서 Swift는 이럴 때 안전하게 아래와 같이 알려준다고 한다.
"값이 없을 수도 있으니까 Optional로 줄게요!"
자, 이제 ! 강제 언래핑(force unwrapping)을 살펴보자.
let number = phoneBook["형"]! // ❌ 강제로 꺼내면 에러남!
이렇게 하면 Swift가 에러를 알려줄 것이다. 왜냐 값이 없는데 강제로 unwrapping했기 때문에.
“형이라는 키가 없어서 값을 못 줘요… 그런데 꺼내라 하니까 터졌어요! 💥”
위와 같은 상황 때문에 옵셔널(optional)을 안전하게 쓰는 방법이 있다고 한다.
- if let 바인딩(binding) / else
if let number = phoneBook["엄마"] {
print("전화번호는 \(number)")
} else {
print("해당 인물이 없어요!")
}
값이 있으면 "전화번호는 010-1234-5678"이 출력될 것이고 아니면 "해당 인물이 없어요!"가 출력될 것이다.
- nil 체크
let value = phoneBook["아빠"]
if value != nil {
print("전화번호 있음!")
}
자, 여기서 또 궁금한 것이 생겼다.
binding은 또 뭐야? 영어에서 binding은 법적 구속력이 있는인데... 이건 아닐꺼고... bind 묶다에 가까울 것 같은데... 프로그래밍에서 같은 뜻으로 쓰는 걸까?
13. binding / optional binding이란?
Bind의 묶다와 개념이 같다. 바인딩이란 쉽게 말해 "값을 변수에 연결(저장)하는 것"이다.
예시 1: 일반 변수 바인딩
let name = "지민"
여기서 "지민"이라는 값을 name이라는 변수에 바인딩(binding) 연결한 것이다.
예시 2: 옵셔널 바인딩 (if let)
let input: String? = "Hello"
if let realInput = input {
print("입력값: \(realInput)")
}
여기선 input이 옵셔널일 때, 그 안의 값을 if let으로 안전하게 꺼내서 realInput에 바인딩하는것을 보여준다. 그래서 “옵셔널 바인딩”이란 표현을 자주 쓴다고 한다.
14. == / !=는 뭘까?
!=는 "같지 않다"를 표현할 때 쓰는 비교 연산자이다.
| 표현 | 의미 |
| == | 같다 |
| != | 같지 않다 |
예를 들어보자.
let a = 5
let b = 3
if a != b {
print("a와 b는 같지 않아요!") // 출력됨
}
또는 옵셔널 검사할 때도 쓸 수 있다고 한다.
if someValue != nil {
print("값이 있어요!")
}
만약 someValue가 nil이 아니라면 print를 실행한다.
15. 옵셔널은 배열에도 있을까?
결론은 있다 이다. 두 가지 형태로 가능하다고 한다.
첫번째 경우는:
var names: [String]? = ["A", "B", "C"]
- 이건 배열 전체가 nil일 수도 있음
- 예: 데이터가 아직 로딩되지 않았을 때
두번째 경우는:
var numbers: [Int?] = [1, nil, 3]
- 배열은 존재하지만, 그 안의 요소 중 일부가 nil일 수 있음
- 예: "아직 입력 안 한 값" 같은 상황
세번째 경우는: (아, 뭐야... 두 가지라고 했으면서 또 하나가 나오더라...)
var list: [String?]? = ["A", nil, "C"]
- 배열 자체가 nil일 수도 있고
- 안에 들어간 값도 nil일 수도 있어! 😱
요약 정리표
| 개념 | 설명 | 예시 |
| 딕셔너리 | Key로 Value를 찾는 구조 | ["이름": "전화번호"] |
| 옵셔널 | 값이 있을 수도, 없을 수도 있는 변수 | let name: String? = nil |
| 강제 언래핑 | !로 "무조건 있어!"라고 강제로 꺼내기 | quizList! |
| 안전한 언래핑 | if let, guard let 으로 안전하게 꺼내기 | if let name = ... |
| 바인딩 / 옵셔널 바인딩 | 값을 변수에 연결하는 것 | let x = 3, if let name = ... |
| != / == | 같지 않음 / 같음을 비교 | if a != b / if a == b |
| 옵셔널 배열 | 배열이 없을 수도 있음 | [String]? |
| 옵셔널 요소 배열 | 요소가 nil일 수도 있음 | [Int?] |
궁금한 것들이 꼬리에 꼬리를 물고 흘러나온다.
프로그래밍을 하면서 직접 사용을 해야 완벽하게 이해하지 않을까 싶다. 그래도 궁금증은 해소했으니 이번 포스팅은 여기서 마무리하겠다.
'개인공부' 카테고리의 다른 글
| [iOS/Xcode] 기초 연습문제를 통한 프로그래밍 이해하기 8편: SwiftUI 공부 시작 iPhone iOS (0) | 2025.03.26 |
|---|---|
| [iOS/Xcode] 기초 연습문제를 통한 프로그래밍 이해하기 7편: SwiftUI 공부 시작 iPhone iOS (0) | 2025.03.26 |
| [iOS/Xcode] 기초 연습문제를 통한 프로그래밍 이해하기 5편 (1) | 2025.03.25 |
| [iOS/Xcode] 기초 연습문제를 통한 프로그래밍 이해하기 4편 (2) | 2025.03.25 |
| [iOS/Xcode] 기초 연습문제를 통한 프로그래밍 이해하기 3편 (1) | 2025.03.25 |