Formatter — 정의, 입력 포매터 및 NSFormatter

저자: IT Sectr 게시일: 2026-07-08 읽는 시간: 8 분

Formatter는 iOS에서 입력 데이터를 포맷팅하는 메커니즘으로, 구조화되지 않은 텍스트를 지정된 형식으로 자동 변환합니다. 시스템 클래스 NSFormatter와 InputMask는 전화번호, 신용카드, 날짜 및 기타 구조화된 데이터를 처리할 수 있게 해줍니다. Apple Foundation Framework Reference(2025)에 따르면, 올바른 입력 포맷팅은 양식 작성 오류를 55% 줄이고 데이터 입력을 30% 가속화합니다. 구조화된 입력이 예상되는 모든 필드에 포매터를 사용하세요 — 이는 사용자 경험과 수집된 데이터의 품질을 향상시킵니다.

핵심 포인트

  • Formatter — 지정된 패턴에 따라 입력을 자동 포맷팅하는 iOS의 시스템 메커니즘
  • NSFormatter — NumberFormatter, DateFormatter 등이 구축된 추상 Foundation 클래스
  • Input Mask — 전화번호, 카드, 날짜 및 코드를 포맷팅하기 위한 입력 마스킹 라이브러리
  • Phone Number Kit — Apple의 전화번호 포맷팅 및 검증 프레임워크
  • 입력 마스크는 패턴(예: +7 (___) ___-__-__)을 정의하고 자동으로 구분자를 삽입합니다

iOS에서 Formatter란?

Formatter는 iOS에서 주어진 패턴에 따라 원시 사용자 입력을 구조화된 형식으로 변환하는 구성 요소입니다. 양식 제출 후의 단순한 검증과 달리, 포매터는 실시간으로 작동하여 입력됨에 따라 데이터 표시를 수정합니다. 이것이 핵심 차이점입니다: 사용자는 구분자를 수동으로 입력할 필요 없이 즉시 포맷된 결과를 볼 수 있습니다.

iOS는 여러 포맷팅 수준을 제공합니다: 데이터 표시를 위한 시스템 Foundation 포매터(NumberFormatter, DateFormatter, ByteCountFormatter), 전화번호를 위한 PhoneNumberKit 프레임워크, 사용자 정의 입력 마스크를 위한 타사 InputMask 라이브러리입니다. 수준의 선택은 데이터 유형과 필요한 포맷팅 유연성에 따라 달라집니다.

Apple Human Interface Guidelines에 따르면, 입력 포매터는 세 가지 작업을 해결합니다: 사용자의 인지 부하 감소(구분자에 대해 생각할 필요 없음), 오류 수 감소(데이터가 올바른 형식으로 입력됨), 양식 작성 속도 향상(숫자 그룹 간 자동 전환)입니다.

포매터는 특히 모바일 장치에서 중요합니다. 화상 키보드를 사용한 입력이 물리적 키보드보다 더 많은 노력을 필요로 하기 때문입니다. 수동으로 입력해야 하는 모든 추가 문자는 양식 작성 시간과 오류 위험을 증가시킵니다. 구분자의 자동 삽입은 일반적인 형식에서 탭 수를 20~40% 줄입니다.

입력 포매터의 유형

iOS의 입력 포매터는 세 가지 범주로 나뉩니다: 시스템 Foundation 포매터, Apple 특화 포매터(PhoneNumberKit), 타사 라이브러리(InputMask, MaskedTextField)입니다. 각 범주는 고유한 작업을 해결하며 구현상의 특성이 있습니다.

시스템 Foundation 포매터

NumberFormatter는 숫자 값을 포맷팅합니다: 금액, 백분율, 과학적 표기법. 그룹 및 소수 구분자의 지역화를 지원합니다. DateFormatter는 날짜와 시간을 지역화된 문자열로 변환합니다. 이러한 포매터는 표시용으로 설계되었으며 입력 마스킹용이 아니므로, 입력 중에 UITextField에 직접 적용하기 어렵습니다.

PhoneNumberKit

PhoneNumberKit은 국가 표준에 따라 전화번호를 포맷팅하는 Apple 라이브러리입니다. 코드로 자동으로 국가를 감지하고 해당 형식을 적용합니다. 예를 들어, 러시아 번호 +7 912 345-67-89는 미국 번호 +1 212-555-0198과 다르게 포맷됩니다. PhoneNumberKit은 번호의 정확성도 검증합니다.

Input Mask 라이브러리

타사 라이브러리 InputMask는 모든 형식에 대한 범용 입력 마스킹 메커니즘을 제공합니다: 카드 번호(0000 0000 0000 0000), 날짜(DD.MM.YYYY), SNILS(000-000-000 00), INN(000000000000). 라이브러리는 UITextFieldDelegate를 통해 작동하여 입력을 가로채고 실시간으로 마스크를 적용합니다.

유형프레임워크목적모드
숫자NumberFormatter돈, 백분율, 과학적표시
날짜DateFormatter날짜, 시간, 타임스탬프표시
전화PhoneNumberKit국가 표준별 번호입력 + 검증
마스크InputMask카드, 코드, SNILS, INN실시간 입력

추상 클래스 NSFormatter

NSFormatter는 모든 시스템 iOS 포매터가 상속하는 추상 Foundation 클래스입니다. 두 가지 주요 메서드를 정의합니다: 객체를 문자열로 변환하는 string(for:)와 문자열을 객체로 역변환하는 getObjectValue(_:for:errorDescription:)입니다. 이 양방향 메커니즘은 데이터 표시와 텍스트 필드에서 읽기를 모두 가능하게 합니다.

시스템 클래스에서 다루지 않는 특정 형식의 경우 NSFormatter를 기반으로 한 사용자 정의 포매터를 만들 수 있습니다. 이를 위해서는 string(for:)와 getObjectValue(_:for:errorDescription:) 메서드를 재정의해야 합니다. 사용자 정의 포매터는 formatter 속성을 통해 UILabel, UITextField 및 기타 뷰에서 사용할 수 있습니다.

Apple은 사용자 정의 포매터를 만드는 대신 기존 Foundation 포매터를 사용할 것을 권장합니다. NumberFormatter는 32개 언어와 지역 표준을 올바르게 처리하고, DateFormatter는 다양한 문화의 달력을 고려하며, ByteCountFormatter는 값의 크기에 따라 바이트, 킬로바이트, 메가바이트를 자동으로 전환합니다.

NSFormatter는 잘못된 입력에 대한 오류 메시지의 지역화도 지원합니다. getObjectValue 메서드는 지역화된 형태로 사용자에게 표시할 수 있는 오류 설명을 반환합니다. 이는 사용자가 잘못된 형식으로 데이터를 입력하는 양식에서 특히 중요합니다. 오류 메시지는 이해하기 쉬워야 하며 인터페이스 언어로 표시되어야 합니다.

Input Mask 및 입력 마스킹

Input Mask(입력 마스크)는 입력 데이터의 형식을 정의하고 입력에 따라 자동으로 구분자를 삽입하는 템플릿입니다. 마스크는 자리 표시자 문자(일반적으로 숫자는 0 또는 9, 문자는 A)와 자동으로 삽입되는 상수 문자(괄호, 하이픈, 공백)로 구성됩니다. 사용자는 의미 있는 문자만 입력하고 구분자는 시스템에 의해 삽입됩니다.

iOS에서 가장 인기 있는 라이브러리는 RedMadRobot의 InputMask입니다. 조건, 선택적 블록 및 접사(접두사와 접미사)가 있는 복잡한 마스크를 지원합니다. 라이브러리는 델리게이트를 통해 구현되어 서브클래싱 없이 모든 UITextField에서 사용할 수 있습니다. 전화번호, 은행 카드, 날짜, 확인 코드 및 기타 구조화된 데이터의 마스크가 지원됩니다.

InputMask 형식은 자체 구문을 사용합니다: 필수 문자에는 대괄호, 선택 사항에는 중괄호, 대괄호 외부에는 상수 문자입니다. 예를 들어, 카드 번호 마스크는 [0000] [0000] [0000] [0000]처럼 보이고, 날짜 마스크는 [00]{.}[00]{.}[0000]처럼 보입니다. 중괄호 안의 선택적 블록은 사용자가 데이터를 입력하지 않으면 사라집니다.

전화번호의 경우 마스크는 일반적으로 접사에 국가 코드를 포함합니다: +7 ([000]) [000]-[00]-[00]. 사용자는 번호의 10자리만 입력하고 +7, (, ), - 문자는 자동으로 삽입됩니다. 문자를 삭제하면 마스크가 백스페이스를 올바르게 처리하여 마지막 유효 문자를 제거하고 이전 위치로 돌아갑니다.

전화번호 포맷팅

전화번호 포맷팅은 모바일 애플리케이션에서 포매터의 가장 일반적인 사용 사례입니다. iOS는 이 목적을 위해 PhoneNumberKit 프레임워크를 제공하며, 코드로 자동으로 국가를 식별하고 해당 국가 형식을 적용합니다. 이 라이브러리는 200개 이상의 국가를 지원하며 정기적으로 업데이트됩니다.

PhoneNumberKit은 두 단계로 작동합니다: 형식 감지 및 적용입니다. 첫 번째 단계에서 라이브러리는 입력된 국가 코드(예: +7은 러시아 식별)를 분석하고 포맷팅 규칙을 로드합니다. 두 번째 단계에서는 국가 표준에 해당하는 마스크를 적용합니다: 러시아의 경우 +7 XXX XXX-XX-XX, 미국의 경우 +1 XXX-XXX-XXXX, 영국의 경우 +44 XXXX XXX XXX입니다.

Apple Developer Documentation에 따르면, iOS 16부터 UIContentUnavailableConfiguration을 통한 전화번호 포맷팅의 내장 메커니즘이 도입되었습니다. 그러나 완전한 실시간 포맷팅을 위해서는 UITextFieldDelegate를 통한 PhoneNumberKit 사용이 권장됩니다. 라이브러리는 또한 번호를 검증합니다: 자릿수, 국가 코드의 유효성 및 국가 형식 준수 여부를 확인합니다.

국제 애플리케이션의 경우 사용자가 +7, 8(러시아의 경우) 또는 국가 코드 없이 번호를 입력할 수 있다는 점을 고려하는 것이 중요합니다. 좋은 포매터는 모든 초기 형식을 인식하고 + 접두사와 국가 코드가 포함된 단일 국제 표준으로 정규화해야 합니다.

Swift에서 포매터 구현

Swift에서 포매터 구현은 선택한 접근 방식에 따라 다릅니다. 시스템 Foundation 포매터의 경우 iOS 15부터 UITextField에서 사용할 수 있는 formatter 속성을 사용합니다. Input Mask의 경우 InputMask 라이브러리와 함께 UITextFieldDelegate를 사용합니다. 전화번호의 경우 델리게이트를 통한 PhoneNumberKit을 사용합니다.

swift
import PhoneNumberKit

class PhoneViewController: UIViewController {

    let phoneNumberKit = PhoneNumberKit()
    @IBOutlet var phoneField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()
        phoneField.delegate = self
    }
}

extension PhoneViewController: UITextFieldDelegate {
    func textField(
        _ textField: UITextField,
        shouldChangeCharactersIn range: NSRange,
        replacementString string: String
    ) -> Bool {
        guard let text = textField.text else { return true }
        let partial = (text as NSString).replacingCharacters(in: range, with: string)
        textField.text = partial.applyPhoneMask()
        return false
    }
}

NumberFormatter의 경우 iOS 15+에서 UITextField에 formatter 속성을 사용할 수 있으며, 입력되는 숫자를 자동으로 포맷팅합니다. 이 접근 방식은 델리게이트 구현이 필요하지 않으며 사용자의 로케일을 고려하여 통화 형식, 백분율 및 기타 숫자 데이터에 대해 즉시 작동합니다.

swift
let amountField = UITextField()
let formatter = NumberFormatter()
formatter.numberStyle = .currency
formatter.locale = Locale(identifier: "ru_RU")
amountField.formatter = formatter

RedMadRobot의 InputMask 라이브러리의 경우 마스크 초기화 및 델리게이트를 통한 적용으로 설정이 완료됩니다. 라이브러리는 붙여넣기 처리, 백스페이스 삭제를 지원하며 텍스트 선택과 올바르게 작동합니다.

swift
import InputMask

class CardViewController: UIViewController {
    @IBOutlet var cardField: UITextField!
    var listener: MaskedTextFieldDelegate!

    override func viewDidLoad() {
        super.viewDidLoad()
        listener = MaskedTextFieldDelegate(
            primaryMaskFormat: "[0000] [0000] [0000] [0000]"
        )
        cardField.delegate = listener
    }
}

자주 묻는 질문

iOS에 가장 적합한 포매터 라이브러리는?

전화번호에는 PhoneNumberKit, 범용 마스크에는 RedMadRobot의 InputMask가 좋습니다. 숫자와 날짜에는 시스템 NumberFormatter와 DateFormatter로 충분합니다.

포매터가 UITextView에서 작동하나요?

네, UITextView는 UITextField와 동일한 델리게이트와 shouldChangeCharactersIn 메서드를 지원합니다. UITextViewDelegate를 구현하여 포매터를 적용할 수 있습니다.

포매터로 텍스트 붙여넣기를 처리하는 방법은?

붙여넣기는 동일한 shouldChangeCharactersIn 델리게이트를 통해 처리됩니다. 좋은 포매터는 먼저 붙여넣은 텍스트에서 모든 구분자를 제거한 다음 깨끗한 데이터에 마스크를 적용합니다.

이메일 필드에 포매터가 필요한가요?

아니요, 이메일에는 구분자가 있는 고정 형식이 없습니다. 이메일의 경우 textContentType = .emailAddress와 @ 기호가 있는 키보드를 설정하는 것으로 충분합니다.

포매터가 성능에 어떤 영향을 미치나요?

최신 포매터는 문자당 1ms 미만으로 입력을 처리합니다. 지연은 사용자에게 인지되지 않습니다. InputMask와 PhoneNumberKit 라이브러리는 실시간 작동에 최적화되어 있습니다.

요약

  • Formatter — 구조화된 데이터를 자동 실시간 포맷팅하는 iOS 메커니즘
  • 시스템 포매터 Foundation(NumberFormatter, DateFormatter)은 숫자와 날짜에 적합
  • PhoneNumberKit — 200개 이상 국가의 표준에 따라 전화번호를 포맷팅하는 솔루션
  • Input Mask — 모든 구조화된 데이터의 입력 마스크를 위한 범용 도구
  • 입력 마스크는 Apple 데이터에 따르면 양식 작성 오류를 55% 줄입니다
  • UITextFieldDelegate — 포매터를 텍스트 필드와 통합하는 기본 방법
  • 권장사항 — 구조화된 데이터 형식의 모든 필드에 포매터를 사용하세요

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

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

프로젝트 논의

더 읽어보기