본문 바로가기
개인공부

[iOS/Xcode] 기초 연습문제를 통한 프로그래밍 이해하기 6편

by 싸디아재 2025. 3. 25.
728x90
반응형

 

목차

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["형"]  // 형은 없어

이때 resultnil이다. 값이 없다는 뜻이다. (위 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("값이 있어요!")
}

만약 someValuenil이 아니라면 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?]

  

궁금한 것들이 꼬리에 꼬리를 물고 흘러나온다.

프로그래밍을 하면서 직접 사용을 해야 완벽하게 이해하지 않을까 싶다. 그래도 궁금증은 해소했으니 이번 포스팅은 여기서 마무리하겠다.

 

728x90
반응형