Locale — 개념, Foundation 클래스 및 지역화

저자: IT Sectr 게시일: 2026-07-12 읽는 시간: 9 분

Locale은 iOS와 macOS의 Foundation 클래스로, 사용자의 언어 및 문화적 규칙(날짜 형식, 숫자 형식, 통화, 측정 단위)을 캡슐화합니다. Apple Developer Documentation, 2024에 따르면, Locale은 DateFormatter가 월을 표시하는 방식(1월 또는 January), 숫자의 소수 구분 기호(쉼표 또는 점), 통화 기호(루블, 달러 또는 유로)를 결정합니다. 각 Locale 인스턴스는 ru_RU 또는 en_US와 같은 식별자에 연결되며, 첫 번째 부분은 언어 코드(ISO 639-1)이고 두 번째 부분은 지역 코드(ISO 3166-1)입니다. TimeZone과 달리 Locale은 시간의 절대값에 영향을 미치지 않으며 문자열 표현에만 영향을 미칩니다.

핵심 포인트

  • Locale — iOS와 macOS의 문화 및 언어 서식 설정을 위한 Foundation 클래스
  • 식별자 ru_RU — 언어 코드(ISO 639-1)와 지역 코드(ISO 3166-1)의 조합
  • DateFormatter와 NumberFormatter는 출력 지역화를 위해 자동으로 Locale 사용
  • Locale.current — 사용자의 시스템 로케일, 특정 작업에 대해 재정의 가능
  • 고정 vs 자동 업데이트 — Locale(identifier:)는 고정 로케일 생성, Locale.current는 설정 변경 추적

Foundation에서 Locale이란?

Locale은 Swift의 값 유형(Objective-C에서는 NSLocale)으로, 특정 언어와 지역에 특화된 서식 규칙 집합을 나타냅니다. 시간의 절대 오프셋을 결정하는 TimeZone과 달리, Locale은 시간, 숫자 및 통화가 문자열 표현에서 어떻게 표시되는지를 결정합니다. 동일한 날짜 2024-07-21이 ru_RU에서는 “2024년 7월 21일”로, en_US에서는 “July 21, 2024”로 표시됩니다.

각 Locale 인스턴스는 두 가지 구성 요소로 이루어집니다: 언어(월 이름, 요일 이름, 단어 순서 결정)와 지역(숫자 형식, 통화, 달력 결정). 이러한 구성 요소의 조합은 BCP 47 표준에 따라 식별자로 인코딩됩니다: ru_RU(러시아어, 러시아), en_US(영어, 미국), de_DE(독일어, 독일).

Unicode CLDR(2024)에 따르면, iOS에서 지원되는 로케일 수는 700개 이상의 언어-지역 조합을 초과합니다. Foundation은 Unicode Consortium이 유지 관리하는 가장 포괄적인 지역화 데이터 저장소인 CLDR(Common Locale Data Repository)의 데이터를 사용합니다. 이는 모든 Apple 기기에서 일관된 서식을 보장합니다.

Locale이 날짜와 숫자 서식에 미치는 영향

DateFormatter는 Locale을 사용하여 올바른 월 및 요일 이름을 선택하고, 날짜 구성 요소의 순서(일/월/년 또는 월/일/년)와 구분 기호를 결정합니다. Locale을 명시적으로 지정하지 않으면 DateFormatter는 기기 로케일을 사용합니다. 이는 UI에는 적합하지만 형식이 고정되어야 하는 서버 데이터에는 위험합니다.

구성 요소ru_RUen_USde_DE
날짜(medium)2024년 7월 21일Jul 21, 202421.07.2024
숫자(1000.5)1 000,51,000.51.000,5
통화(100)100,00 ₽$100.00100,00 €
달력그레고리력그레고리력그레고리력
목록 구분 기호;,;

NumberFormatter는 Locale을 사용하여 소수 구분 기호(쉼표 또는 점), 그룹화 구분 기호(공백, 쉼표, 점) 및 통화 기호를 결정합니다. 숫자를 구문 분석할 때 Locale을 무시하는 것은 국제화 애플리케이션에서 버그의 일반적인 원인 중 하나입니다. 숫자 “1,5”는 ru_RU에서는 “1.5”를 의미하지만, en_US에서는 디지털 파서가 쉼표 뒤의 “5”로 읽습니다.

중요: Calendar.current를 통해 생성된 Calendar는 기기 로케일을 상속합니다. 명시적으로 로케일을 설정한 Calendar(identifier: .gregorian)이 예측 가능한 서식을 위한 권장 방법입니다. ISO 8601 날짜로 작업할 때는 항상 Locale(identifier: “en_US_POSIX”)를 사용하세요. 이는 지역 설정의 영향을 받지 않는 기술적 서식을 위한 특수 로케일입니다.

Locale 식별자: 기본 형식

Locale 식별자는 언어 코드(ISO 639-1, 2자)와 지역 코드(ISO 3166-1, 2자)로 구성되며 밑줄로 구분됩니다. 예: ru_RU, en_US, fr_FR, zh_Hans_CN(중국어, 간체, 중국). Foundation은 웹 표준에서 사용되는 BCP 47 형식(ru-RU, en-US)의 식별자도 지원합니다.

전체 식별자 외에도 Locale은 언어만으로 생성할 수 있습니다: Locale(identifier: “ru”)는 러시아어와 해당 언어의 기본 지역(보통 러시아)으로 로케일을 반환합니다. 영어도 유사하게 Locale(identifier: “en”)는 미국 지역을 사용합니다. 이 방법은 특정 지역에 얽매이지 않고 서식 언어를 설정하는 데 유용합니다.

특수 로케일에는 en_US_POSIX가 있습니다. 이는 사용자 설정에 관계없이 안정적인 형식을 보장하는 기술적 서식용 로케일입니다. 이 로케일은 서버 API에서 날짜를 구문 분석할 때, 특히 ISO 8601 형식에 필수적입니다. 그레고리력, 24시간제, 소수 구분 기호로 점을 사용합니다.

swift
import Foundation

// 사용 가능한 로케일 식별자
let available: [String] = Locale.availableIdentifiers
print("전체 로케일: \(available.count)")

// 러시아 로케일 필터링
let russianLocales = available.filter { $0.hasPrefix("ru") }
print("러시아 로케일: \(russianLocales)")

// 로케일 구성 요소
let locale = Locale(identifier: "de_DE")
print("언어: \(locale.languageCode ?? "nil")")
print("지역: \(locale.regionCode ?? "nil")")
print("통화: \(locale.currencyCode ?? "nil")")
print("달력: \(locale.calendar.identifier)")

사용 가능한 로케일 확인 Locale.availableIdentifiers를 통해 현재 iOS 버전이 지원하는 모든 식별자의 배열을 반환합니다. 지역별로 필터링하려면 regionCode 확인과 함께 Locale.availableIdentifiers.filter를 사용하세요. 이는 하드코딩된 목록 없이 지역 선택 UI를 구축하는 데 유용합니다.

Swift에서 현재 사용자 로케일 확인

Locale.current는 iOS 설정(Settings > General > Language & Region)에서 사용자가 설정한 기기의 현재 로케일을 가져오는 기본 방법입니다. 이 속성은 애플리케이션을 다시 시작하지 않고 설정에서 언어나 지역을 변경할 때 자동으로 업데이트됩니다. 그러나 콘텐츠 표시에 선호되는 로케일과 일치하지 않을 수 있습니다. 사용자는 인터페이스 언어를 영어로 설정해도 날짜는 러시아 형식으로 보고 싶어할 수 있습니다.

사용자 선호도를 더 정확하게 확인하려면 Locale.preferredLanguages를 사용하세요. 이는 사용자 우선순위에 따라 정렬된 언어 배열입니다. 첫 번째 요소가 기본 인터페이스 언어입니다. 이 목록은 Language & Region의 설정과 일치하며, 우선순위 순서로 언어를 드래그하는 것도 포함합니다. 커뮤니케이션 앱(메신저, 이메일 클라이언트)은 콘텐츠 표시 언어를 선택할 때 이 순서를 고려해야 합니다.

swift
import Foundation

// 현재 시스템 로케일
let current = Locale.current
print("현재 로케일: \(current.identifier)")
print("언어: \(current.language?.disjointName ?? "nil")")

// 사용자 선호 언어
let preferred = Locale.preferredLanguages
print("선호 언어: \(preferred)")

// 현재 로케일에서 지역 가져오기
if let region = current.regionCode {
    let regionLocale = Locale(identifier: "en_\(region)")
    let countryName = regionLocale.localizedString(
        forRegionCode: region
    )
    print("국가: \(countryName ?? region)")
}

// 24시간 형식 확인
let uses24h = current.uses24hClock(
    for: .dateAndTime
)
print("24시간 사용: \(uses24h)")

UI 지역화: 인터페이스 언어로 월 및 요일 이름을 표시하려면 로케일이 설정된 Calendar를 사용하세요. Calendar.current.symbols(for: .month)는 현재 로케일의 언어로 월 이름을 반환합니다. 사용자 언어로 국가 이름을 표시하려면 Locale.current.localizedString(forRegionCode:)를 사용하세요.

Swift에서 Locale 사용 예제

날짜 서식 지정을 로케일 인식으로 수행하는 것은 사용자에게 날짜를 표시할 때 핵심 작업입니다. 로케일이 설정된 DateFormatter는 사용자 지역에 맞는 올바른 날짜 및 시간 형식을 자동으로 선택합니다. .short, .medium, .long, .full 값의 dateStyle과 timeStyle에 대해 포맷터는 로케일 규칙을 사용하여 날짜 구성 요소를 구성합니다.

swift
import Foundation

let date = Date()

// 다른 로케일로 서식 지정
let formatter = DateFormatter()
formatter.dateStyle = .medium

formatter.locale = Locale(identifier: "ru_RU")
print("러시아어: \(formatter.string(from: date))")

formatter.locale = Locale(identifier: "en_US")
print("영어: \(formatter.string(from: date))")

formatter.locale = Locale(identifier: "ja_JP")
print("일본어: \(formatter.string(from: date))")

// 로케일을 사용한 통화 서식
let numFormatter = NumberFormatter()
numFormatter.numberStyle = .currency

numFormatter.locale = Locale(identifier: "de_DE")
print("독일 통화: \(numFormatter.string(from: 1234.56) ?? "nil")")

numFormatter.locale = Locale(identifier: "en_US")
print("미국 통화: \(numFormatter.string(from: 1234.56) ?? "nil")")

서버 API에서 날짜 구문 분석은 고정된 형식을 위해 항상 Locale(identifier: “en_US_POSIX”)를 사용해야 합니다. 서버는 일반적으로 영어 월 이름과 함께 ISO 8601 형식으로 날짜를 보내며, 현재 기기 로케일을 사용하면 사용자가 비영어권 지역에 있을 때 구문 분석 오류가 발생할 수 있습니다. en_US_POSIX는 구문 분석이 기기 설정에 의존하지 않도록 보장합니다.

swift
import Foundation

// 올바른 서버 날짜 구문 분석
let isoFormatter = DateFormatter()
isoFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
isoFormatter.locale = Locale(identifier: "en_US_POSIX")
isoFormatter.timeZone = TimeZone(secondsFromGMT: 0)

let serverDate = "2024-07-21T14:30:00+0000"
if let parsed = isoFormatter.date(from: serverDate) {
    print("구문 분석된 날짜: \(parsed)")
}

// 지역화된 통화 이름
let usLocale = Locale(identifier: "en_US")
let currencyName = usLocale.localizedString(
    forCurrencyCode: "RUB"
)
print("미국 로케일의 러시아 루블: \(currencyName ?? "nil")")

추가 기능: Locale은 localizedString(forRegionCode:), localizedString(forLanguageCode:), localizedString(forCurrencyCode:) 및 localizedString(forCalendarIdentifier:) 메서드를 통해 구성 요소의 지역화된 설명을 제공합니다. 이러한 메서드는 호출된 로케일의 언어로 이름을 반환합니다. 예를 들어, Locale(identifier: “ru_RU”).localizedString(forCountryCode: “DE”)는 “독일”을 반환합니다.

Locale 사용 시 흔한 실수

숫자 구문 분석 시 Locale 무시는 국제화 애플리케이션에서 심각한 오류입니다. 명시적 로케일이 없는 NumberFormatter는 현재 기기 로케일을 사용합니다. 러시아의 사용자가 “1,5”를 입력하면 NumberFormatter.number(from: “1,5”)는 올바르게 1.5를 반환합니다. 그러나 동일한 코드가 en_US 로케일의 기기에서 실행되면 en_US의 소수 구분 기호가 점이므로 구문 분석이 nil을 반환합니다.

서버 날짜에 en_US_POSIX 누락은 미묘한 버그를 유발합니다. dateFormat과 locale = Locale.current를 사용하는 DateFormatter는 날짜 형식이 미국식과 다른 지역의 사용자에게서 오류가 발생할 수 있습니다. 예를 들어, 독일에서는 DateFormatter가 “21.07.2024”를 기대하는 반면 서버는 “07/21/2024”를 보냅니다. en_US_POSIX는 사용자 지역에 관계없이 기계 구문 분석을 위한 고정 형식을 보장합니다.

Date 객체 대신 날짜 문자열 비교도 흔한 실수입니다. 개발자는 종종 다른 로케일의 날짜 문자열 표현을 비교하여 잘못된 결과를 얻습니다. Locale은 표시만 변경할 뿐 날짜의 절대값은 변경하지 않습니다. 항상 Date 객체를 비교하고 문자열 표현은 비교하지 마세요. 날짜 구성 요소를 비교하려면 명시적으로 로케일을 설정한 Calendar를 사용하세요.

WWDC 2023에 따르면, 애플리케이션의 국제화 문제 중 약 30%가 잘못된 Locale 구성과 관련이 있습니다. Apple은 서버 데이터로 작업할 때 항상 DateFormatter와 NumberFormatter에 로케일을 명시적으로 설정하고 UI 표시에만 Locale.current를 사용할 것을 권장합니다. 이 간단한 방법으로 지역 설정 관련 대부분의 버그가 해결됩니다.

자주 묻는 질문

Foundation에서 Locale이란?

Locale은 문화적 및 언어적 서식 규칙(날짜 형식, 숫자 형식, 통화, 측정 단위)을 나타내는 Foundation 클래스입니다. DateFormatter, NumberFormatter 및 Calendar와 함께 지역화된 데이터 표시에 사용됩니다.

Locale과 TimeZone의 차이점은?

Locale은 표시 형식(언어, 지역 규칙)을 결정하고, TimeZone은 UTC 기준 시간의 절대 오프셋을 결정합니다. Locale은 문자열 표현에 영향을 미치고, TimeZone은 시간의 숫자 값에 영향을 미칩니다. 완전한 날짜 서식을 위해 둘 다 함께 사용됩니다.

en_US_POSIX란 무엇이며 왜 필요한가요?

en_US_POSIX는 사용자 설정에 관계없이 안정적인 형식을 보장하는 기술적 서식용 특수 로케일입니다. 서버 날짜(ISO 8601) 구문 분석 및 형식을 예측할 수 있어야 하는 API 작업에 필수적입니다.

사용 가능한 모든 로케일 목록을 얻는 방법은?

Locale.availableIdentifiers는 지원되는 모든 로케일의 식별자가 포함된 문자열 배열을 반환합니다. 언어별로 필터링하려면 hasPrefix와 함께 filter를 사용하고, 지역을 얻으려면 Locale(identifier:).regionCode를 사용하세요.

Locale이 NumberFormatter에 어떤 영향을 미치나요?

NumberFormatter는 Locale을 사용하여 소수 구분 기호(쉼표 또는 점), 통화 기호 및 그룹화 구분 기호를 결정합니다. 고정 형식의 경우 로케일을 en_US_POSIX로 설정하거나 포맷터 속성을 명시적으로 설정하세요.

요약

  • Locale — iOS와 macOS에서 날짜, 숫자 및 통화 서식을 지역화하는 기본 클래스
  • 식별자 ru_RU는 정확한 서식 설정을 위해 언어(ISO 639-1)와 지역(ISO 3166-1)을 인코딩
  • DateFormatter와 NumberFormatter는 지역화된 출력에 Locale.current를 자동 사용
  • en_US_POSIX — 서버 날짜 구문 분석 및 고정 기계 서식에 필수적인 로케일
  • Locale.current는 설정 변경을 추적, Locale(identifier:)는 고정 로케일 생성
  • 숫자 구문 분석에는 명시적 로케일 설정이 필요 — 소수 구분 기호는 사용자 지역에 따라 다름
  • Calendar.current는 기기 로케일을 상속, 예측 가능한 계산을 위해 로케일을 명시적으로 설정

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기