Swift 딕셔너리 subscript 조회 결과가 옵셔널인지 확인하기: nil 반환과 기본값 subscript 비교

2026. 10. 25. 18:00·Swift
728x90

왜 이 내용을 정리하나

Swift에서 딕셔너리는 키로 값을 찾는다. 그런데 키가 없을 때의 동작을 모르고 값을 바로 쓰면 런타임에서 문제가 생긴다. 예를 들어 사용자 설정값, 외부 API 응답의 필드, 캐시 조회처럼 키가 있을 수도 없을 수도 있는 상황에서는 조회 결과가 옵셔널이라는 점을 먼저 알고 있어야 한다. 또 키가 없을 때 기본값을 주는 방식과 nil을 받아 분기하는 방식이 어떻게 다르게 동작하는지도 구분할 수 있어야 한다. 이 노트에서는 딕셔너리 subscript의 반환 타입을 확인하고, nil 반환과 subscript(default:)의 차이를 print로 비교해 본다.

개념 설명

Swift 딕셔너리에 키를 넣어 조회하는 dict[key] 형태의 subscript는 값 타입이 아니라 값 타입의 옵셔널을 반환한다. 예를 들어 [String: Int] 딕셔너리에서 dict['apple']의 타입은 Int?다. 키가 존재하면 값이 감싸져 있는 옵셔널이 나오고, 키가 없으면 nil이 나온다. 그래서 조회 결과를 바로 정수 연산에 쓸 수 없고, 옵셔널 바인딩이나 nil 병합 연산자 같은 방식으로 풀어야 한다.

subscript(default:) 는 기본값을 인자로 받는다. 키가 있으면 저장된 값을, 없으면 전달한 기본값을 반환한다. 이 경우 반환 타입은 옵셔널이 아닌 값 타입이다. 즉 키의 존재 여부를 타입 수준에서 숨기고, 값이 항상 존재한다고 취급할 수 있게 된다. 다만 기본값으로 대체되었는지 여부는 결과만으로는 알 수 없으므로, 그 구분이 중요하면 nil 반환 방식을 쓰는 편이 낫다.

코드 예제

swift
let scores: [String: Int] = ['alice': 90, 'bob': 75]

// 1. 기본 subscript: 반환 타입은 Int?
let aliceScore = scores['alice']
let carolScore = scores['carol']
print('alice 조회 결과: \(String(describing: aliceScore))')
print('carol 조회 결과: \(String(describing: carolScore))')

// 2. 옵셔널 바인딩으로 분기
if let score = scores['carol'] {
    print('carol 점수: \(score)')
} else {
    print('carol 키가 없어서 nil이 반환되었다')
}

// 3. subscript(default:) 로 기본값 대체
let aliceDefault = scores['alice', default: 0]
let carolDefault = scores['carol', default: 0]
print('alice (default): \(aliceDefault)')
print('carol (default): \(carolDefault)')

// 4. 기본값으로 대체되었는지 구분하기 어려움 확인
let dave = scores['dave', default: 0]
print('dave (default): \(dave)  // 실제 점수 0인지, 키가 없어서인지 알 수 없다')

이 코드는 먼저 기본 subscript가 Int?를 반환하는 것을 print로 확인한다. alice는 값이 있으므로 Optional(90)이 출력되고, carol은 키가 없으므로 nil이 출력된다. 옵셔널 바인딩 부분은 키가 없을 때 else 블록으로 빠지는 흐름을 보여 준다. subscript(default:) 부분은 alice는 90, carol은 기본값 0을 출력하며, 마지막 줄은 dave의 값 0이 실제 0점인지 키 부재에 따른 기본값인지 결과만으로는 구분되지 않는다는 점을 드러낸다.

헷갈리는 점

가장 흔한 실수는 dict[key]의 결과를 옵셔널인 줄 모르고 값처럼 사용하려다 컴파일 오류를 만나는 것이다. 또 다른 실수는 subscript(default:)를 쓰면 nil 처리가 필요 없어서 안전하다고 생각하는 것이다. 기본값은 키 부재를 숨기므로, 실제 값 0과 누락된 값이 같은 결과로 보인다. 저장된 값이 nil이 될 수 있는 딕셔너리, 예를 들어 [String: Int?] 형태에서는 조회 결과가 이중 옵셔널이 되어 nil의 의미가 두 가지로 나뉘므로 더 주의해야 한다.

정리

딕셔너리 subscript dict[key]는 값 타입의 옵셔널을 반환하며 키가 없으면 nil이 된다. 이를 옵셔널 바인딩이나 nil 병합으로 안전하게 풀어 쓴다. subscript(default:)는 키가 없을 때 기본값을 반환해 옵셔널을 없애 주지만, 기본값으로 대체되었는지 구분하지 못하는 한계가 있다. 키 부재 여부가 로직에 필요한 경우에는 nil 반환 방식을 쓰고, 값이 항상 있어야 하는 경우에는 기본값 방식을 쓰는 식으로 구분해서 쓰는 것이 맞다. 이 노트에서는 두 방식의 반환 타입과 출력 결과의 차이를 print로 확인해 보았다.

#Swift #딕셔너리 #옵셔널 #subscript #nil

728x90
LIST

'Swift' 카테고리의 다른 글

Swift let 상수에 재할당 시도 시 컴파일 에러 메시지 직접 확인하기  (0) 2026.10.24
Swift 구조체는 대입 시 복사된다: 값 타입 동작을 print로 검증하기  (0) 2026.10.23
Swift 옵셔널 체이닝으로 중첩 딕셔너리 값 안전하게 꺼내기  (0) 2026.10.23
아카이브/배포 검증 에러 해결기: Invalid Bundle Identifier, Bad CFBundleExecutable, Shared bundle path  (3) 2025.08.17
our app is missing support for the following URL schemes  (0) 2025.06.16
'Swift' 카테고리의 다른 글
  • Swift let 상수에 재할당 시도 시 컴파일 에러 메시지 직접 확인하기
  • Swift 구조체는 대입 시 복사된다: 값 타입 동작을 print로 검증하기
  • Swift 옵셔널 체이닝으로 중첩 딕셔너리 값 안전하게 꺼내기
  • 아카이브/배포 검증 에러 해결기: Invalid Bundle Identifier, Bad CFBundleExecutable, Shared bundle path
Mr. Joo
Mr. Joo
  • Mr. Joo
    삽질의 시작
    Mr. Joo
  • 전체
    오늘
    어제
    • 분류 전체보기 (256) N
      • Python (7) N
      • 개발 요약 (10)
      • Flutter (77) N
      • Android (9)
      • Swift (9) N
      • React (16) N
      • 인공지능 (4)
      • 대학원 (3)
      • CS (10)
      • 개발 뉴스 (108)
      • IT 기기 (1)
      • 알면 유용한 정보 (2)
  • 인기 글

  • 태그

    앱
    뉴스
    기술 뉴스
    react
    Flutter
    Dart 기초
    개발
    오늘의 기술 뉴스
    오늘의 이슈
    DART
    개발 이슈
    android
    플러터
    기술
    오늘의 개발 뉴스
    앱 개발
    Swift
    오늘의 뉴스
    이슈
    개발 뉴스
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.3
Mr. Joo
Swift 딕셔너리 subscript 조회 결과가 옵셔널인지 확인하기: nil 반환과 기본값 subscript 비교
상단으로

티스토리툴바