NSAttributedString — 정의, 텍스트 서식 및 iOS 속성

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

NSAttributedString은 iOS SDK의 Foundation 프레임워크에 있는 클래스로, 개별 문자 또는 텍스트 범위에 적용되는 서식 속성 집합을 가진 문자열을 나타냅니다. 일반 NSString과 달리 NSAttributedString은 유니코드 문자뿐만 아니라 문자열의 각 세그먼트에 대한 속성(글꼴, 색상, 커닝, 정렬)의 사전도 저장합니다. Apple 개발자 문서(2026)에 따르면 NSAttributedString은 모든 iOS UI 구성 요소에서 서식이 지정된 텍스트를 표시하기 위한 기초입니다.

핵심 사항

  • NSAttributedString — 각 문자 또는 범위가 NSAttributedStringKey 사전에 해당하는 속성이 있는 변경 불가능한 문자열
  • NSMutableAttributedString — 런타임에 속성을 수정하기 위한 addAttribute, setAttributes, replaceCharacters 메서드가 있는 변경 가능한 버전
  • 주요 속성: .font, .foregroundColor, .paragraphStyle, .kern, .underlineStyle, .strikethroughStyle, .link, .backgroundColor
  • NSMutableParagraphStyle — 정렬, 줄 간격, 들여쓰기 및 텍스트 방향을 설정하기 위한 도우미 객체
  • UILabel, UITextView, UITextField는 속성 문자열 표시를 위해 attributedText를 지원

NSAttributedString이란?

NSAttributedString은 서식이 지정된 텍스트를 작업하기 위한 기본 iOS/macOS 클래스입니다. 문자열에 속성(키-값 쌍의 사전으로, 키는 NSAttributedStringKey 상수(예: .font, .foregroundColor)이고 값은 해당 객체(UIFont, UIColor))을 추가하여 NSString을 확장합니다. 문자열의 각 문자는 고유한 속성 집합을 가질 수 있어 단일 문자열 내에서 혼합 서식을 가능하게 합니다.

NSAttributedString의 아키텍처는 속성 실행(attribute runs) 개념을 기반으로 합니다. 문자 범위 0..5에 대해 .font 속성을 UIFont.boldSystemFont(ofSize: 16)으로 설정하면 해당 범위의 모든 문자가 굵게 표시됩니다. 다른 문자는 다른 글꼴을 가지거나 속성이 전혀 없을 수 있습니다. 속성 문자열을 렌더링할 때 UIKit 시스템은 다른 범위의 특성을 병합하고 텍스트를 균일하게 렌더링합니다.

NSAttributedString은 변경 불가능합니다 — 생성 후 속성과 내용을 변경할 수 없습니다. 수정을 위해 NSMutableAttributedString 하위 클래스가 있으며, 모든 범위에서 속성을 추가, 제거 및 변경하는 메서드를 제공합니다. 이 구분은 멀티스레딩에 중요합니다. 변경 불가능한 NSAttributedString은 스레드 안전하지만 NSMutableAttributedString은 그렇지 않습니다.

텍스트 서식의 주요 속성

NSAttributedString은 NSAttributedStringKey에 정의된 약 40개의 표준 속성을 지원합니다. 각 속성은 텍스트 모양의 특정 측면(글꼴, 색상, 위치, 밑줄, 그림자, 커닝, 단락 스타일, 하이퍼링크)에 영향을 미칩니다. 속성을 설정하려면 NSAttributedStringKey 상수를 사용하고 해당 유형의 객체를 할당합니다.

속성 키값 유형목적
.fontUIFont글꼴 및 텍스트 크기
.foregroundColorUIColor텍스트 색상
.backgroundColorUIColor텍스트 뒤의 배경색
.paragraphStyleNSParagraphStyle정렬, 줄 간격, 들여쓰기
.kernNSNumber (Float)문자 간격(커닝)
.underlineStyleNSUnderlineStyle (Int)밑줄 스타일(단일, 이중, 두꺼움, 패턴)
.strikethroughStyleNSUnderlineStyle (Int)취소선 스타일
.linkNSURL대화형 하이퍼링크 URL
.shadowNSShadow오프셋, blurRadius 및 색상이 있는 텍스트 그림자
.baselineOffsetNSNumber (Float)기준선에서 텍스트 오프셋

NSParagraphStyle — 단락 서식

NSMutableParagraphStyle은 단락의 시각적 특성을 관리하는 객체입니다: 정렬(.alignment: .left, .center, .right, .justified), 줄 간격(.lineSpacing), 단락 간격(.paragraphSpacing), 첫 줄 들여쓰기(.firstLineHeadIndent), 왼쪽 및 오른쪽 들여쓰기(.headIndent, .tailIndent) 및 텍스트 방향(.baseWritingDirection). ParagraphStyle은 전체 단락에 동일한 서식이 필요한 경우 줄바꿈 문자를 포함하는 범위에 적용됩니다.

코드에서 NSAttributedString 생성 방법

생성은 문자열과 속성 사전을 받는 초기화자를 통해 수행됩니다. 속성은 전체 문자열에 적용됩니다. 혼합 서식(문자열의 다른 부분에 다른 속성)의 경우 특정 범위에 속성을 추가하는 NSMutableAttributedString이 사용됩니다. Objective-C는 NSAttributedStringKey: UIFont 사전을 사용하고 Swift는 타입 세이프한 [NSAttributedString.Key: Any] 사전을 사용합니다.

swift
let plainText = "Hello, Swift!"

// Create with uniform attributes for the entire string
let attributes: [NSAttributedString.Key: Any] = [
    NSAttributedString.Key.font:
        UIFont.systemFont(ofSize: 18),
    NSAttributedString.Key.foregroundColor:
        UIColor.darkText,
    NSAttributedString.Key.kern: 1.5
]

let attributedString =
    NSAttributedString(string: plainText,
                        attributes: attributes)

NSMutableParagraphStyle을 사용한 생성

예제는 NSMutableParagraphStyle을 통한 단락 서식을 보여줍니다. 중앙 정렬, 8포인트 줄 간격, 12포인트 단락 간격이 설정됩니다. ParagraphStyle은 .paragraphStyle 키 아래 속성 사전에 추가됩니다. NSAttributedString은 전달된 paragraphStyle을 복사하므로 문자열을 생성한 후에도 이미 생성된 문자열에 영향을 주지 않고 수정할 수 있습니다.

swift
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.alignment = NSTextAlignment.center
paragraphStyle.lineSpacing = 8.0
paragraphStyle.paragraphSpacing = 12.0
paragraphStyle.firstLineHeadIndent = 20.0

let attributed = NSAttributedString(
    string: "Centered paragraph with spacing",
    attributes: [NSAttributedString.Key.paragraphStyle: paragraphStyle])

NSMutableAttributedString 및 속성 수정

NSMutableAttributedString은 생성 후 내용과 속성을 수정할 수 있는 NSAttributedString의 하위 클래스입니다. 주요 메서드: 범위에 단일 속성을 추가하는 addAttribute(_:value:range:); 여러 속성을 추가하는 addAttributes(_:range:); 범위의 모든 속성을 바꾸는 setAttributes(_:range:); 속성을 제거하는 removeAttribute(_:range:); 텍스트를 바꾸는 replaceCharacters(in:with:).

addAttributeaddAttributes는 이미 설정된 속성을 제거하지 않고 기존 속성에 추가합니다. 범위에 동일한 키를 가진 속성이 이미 있으면 값이 바뀝니다. setAttributes는 범위의 속성 사전을 완전히 바꿉니다 — 이전에 설정된 모든 속성이 제거됩니다. 단일 문자열을 순차적으로 서식 지정할 때 이를 이해하는 것이 중요합니다: addAttributes는 이미 설정된 글꼴과 색상을 재설정하지 않으므로 더 안전합니다.

범위(NSRange)NSRange(location: 0, length: 5) 구조체를 사용하여 지정됩니다. location은 시작 인덱스(0 기반)이고 length는 문자 수입니다. 범위가 문자열 경계를 초과하면 NSMutableAttributedString이 NSRangeException을 발생시킵니다. 안전한 범위 작업을 위해 NSIntersectionRangeNSUnionRange와 같은 Foundation의 NSRange 메서드를 사용하세요.

swift
let attributed = NSMutableAttributedString(
    string: "Bold and red text here")

// Apply bold font to first 9 characters
let boldRange = NSRange(location: 0, length: 9)
attributed.addAttribute(
    NSAttributedString.Key.font,
    value: UIFont.boldSystemFont(ofSize: 16),
    range: boldRange)

// Apply red color to characters 13-16 ("text")
let redRange = NSRange(location: 13, length: 4)
attributed.addAttribute(
    NSAttributedString.Key.foregroundColor,
    value: UIColor.red,
    range: redRange)

// Apply underline to the entire string
let fullRange = NSRange(location: 0,
                       length: attributed.length)
attributed.addAttribute(
    NSAttributedString.Key.underlineStyle,
    value: NSUnderlineStyle.single.rawValue,
    range: fullRange)

UILabel에서 속성 문자열 표시 예제

NSAttributedString을 표시하는 가장 일반적인 방법은 UILabel의 attributedText 속성에 할당하는 것입니다. text 속성과 달리 attributedText는 렌더링에 속성을 사용하여 혼합 서식을 지원합니다. 중요: attributedText가 설정되면 UILabel은 font, textColor 및 textAlignment 속성을 무시합니다 — 모든 시각적 특성은 NSAttributedString 속성에서 가져옵니다.

swift
let label = UILabel()
label.numberOfLines = 0

let fullText = NSMutableAttributedString(
    string: "Price: $24.99 per month")

// Format "Price:" label with bold font
let priceLabelRange = NSRange(
    location: 0, length: 6)
fullText.addAttribute(
    NSAttributedString.Key.font,
    value: UIFont.boldSystemFont(ofSize: 16),
    range: priceLabelRange)

// Format "$24.99" with green color
let amountRange = NSRange(
    location: 7, length: 6)
fullText.addAttribute(
    NSAttributedString.Key.foregroundColor,
    value: UIColor.systemGreen(),
    range: amountRange)
fullText.addAttribute(
    NSAttributedString.Key.font,
    value: UIFont.boldSystemFont(ofSize: 22),
    range: amountRange)

// Apply gray color to "per month" text
let periodRange = NSRange(
    location: 14, length: 9)
fullText.addAttribute(
    NSAttributedString.Key.foregroundColor,
    value: UIColor.secondaryLabel,
    range: periodRange)

label.attributedText = fullText

대화형 링크가 있는 UITextView에서 표시

UITextView는 NSAttributedString에서 대화형 링크를 지원합니다. NSURL이 있는 .link 속성은 텍스트를 클릭 가능하게 만듭니다. 탭을 처리하려면 textView(_:shouldInteractWith:in:interaction:) 메서드와 함께 UITextViewDelegate를 사용하세요. UITextView는 텍스트 선택 및 표준 작업(복사, 검색)을 위한 UIMenuController 사용도 지원합니다.

NSAttributedString을 HTML 및 RTF로 변환

NSAttributedString은 NSAttributedString.DocumentType을 통한 HTML 및 RTF 변환을 지원합니다. HTML을 로드하려면 documentAttributes 매개변수가 있는 초기화자를 사용하세요: NSAttributedString(data: htmlData, options: [.documentType: .html], documentAttributes: nil). RTF도 유사하게: .rtf 또는 .rtfd. 이 메커니즘은 WebView 없이 HTML 콘텐츠를 표시하는 데 유용합니다.

HTML로 내보내기하려면 범위와 문서 유형과 함께 data(from:documentAttributes:) 메서드를 사용하세요. HTML 내보내기: try attributedString.data(from: fullRange, documentAttributes: [.documentType: .html]). 결과 데이터는 파일에 저장하거나 서버로 보내거나 WebView에 표시할 수 있습니다. 내보내기 중에 글꼴, 색상, 정렬, 목록 — 모든 서식 속성 — 이 CSS 스타일로 변환됩니다.

RTF 지원은 RTF가 표준 리치 텍스트 형식인 macOS 애플리케이션에 특히 중요합니다. iOS도 RTF 읽기 및 쓰기를 지원하지만 기본 형식으로 사용하지는 않습니다. RTF와 RTFD의 차이점: RTFD에는 디렉토리에 패키징된 임베디드 리소스(이미지)가 포함됩니다. NSAttributedString은 단일 인터페이스를 통해 두 형식을 모두 처리할 수 있습니다.

swift
let htmlString = "<p><b>Bold<\/b> and <i>italic<\/i><\/p>"
guard let htmlData = htmlString.data(
    using: String.Encoding.utf8) else { return }

let options: [NSAttributedString.DocumentReadingOptionKey: Any] = [
    NSAttributedString.DocumentReadingOptionKey.documentType:
        NSAttributedString.DocumentType.html
]

let attributedFromHTML =
    try? NSAttributedString(
        data: htmlData,
        options: options,
        documentAttributes: nil)

자주 묻는 질문

NSString과 NSAttributedString의 차이점은 무엇인가요?

NSString은 서식 정보 없이 유니코드 문자 시퀀스만 저장합니다. NSAttributedString은 문자를 저장하고 각 하위 범위에 속성(글꼴, 색상, 스타일)의 사전을 포함합니다. 표시될 때 UIKit은 렌더링에 이러한 속성을 사용하여 서식이 지정된 텍스트를 만듭니다.

UILabel이 NSAttributedString 속성을 표시하지 않는 이유는 무엇인가요?

가장 일반적인 이유는 attributedText 대신 text 속성을 사용하기 때문입니다. text를 통해 할당하면 모든 속성이 무시됩니다. 두 번째 이유: attributedText를 설정한 후 UILabel의 font, textColor 또는 textAlignment를 변경하면 — 이러한 변경이 attributedText를 재설정합니다. 서식이 지정된 텍스트에는 attributedText만 사용하세요.

하나의 문자열에 다른 글꼴을 적용하려면 어떻게 하나요?

NSMutableAttributedString을 만들고 다른 글꼴이 있는 각 세그먼트에 대해 addAttribute(.font, value: boldFont, range: boldRange)를 호출하세요. 각 호출은 지정된 범위에만 속성을 적용합니다. 나머지 문자는 표준 글꼴 또는 이전에 설정된 다른 글꼴을 유지합니다. 이렇게 하여 다른 글꼴로 속성 실행이 생성됩니다.

NSAttributedString은 여러 줄 텍스트에서 작동하나요?

, NSAttributedString은 줄바꿈 문자( )를 포함한 여러 줄 텍스트를 올바르게 처리합니다. UITextView와 UILabel(numberOfLines = 0 포함)은 자동으로 텍스트를 새 줄로 줄바꿈합니다. NSMutableParagraphStyle은 각 단락의 줄 간격, 들여쓰기 및 정렬을 독립적으로 관리합니다.

하나의 문자열에서 다른 색상으로 컬러 텍스트를 만들려면 어떻게 하나요?

각 색상 범위에 대해 .foregroundColor 속성과 함께 NSMutableAttributedString을 사용하세요. 빨간색 텍스트의 경우: addAttribute(.foregroundColor, value: UIColor.red, range: firstRange). 파란색의 경우: addAttribute(.foregroundColor, value: UIColor.blue, range: secondRange). 색상은 지정된 문자 범위에만 적용됩니다.

요약

  • NSAttributedString — 각 문자 범위에 대한 사전에 저장된 서식 속성(글꼴, 색상, 스타일)이 있는 문자열
  • NSMutableAttributedString — 동적 서식을 위한 addAttribute, setAttributes 및 removeAttribute 메서드가 있는 변경 가능한 버전
  • 주요 속성: .font, .foregroundColor, .paragraphStyle, .kern, .underlineStyle, .strikethroughStyle, .link, .shadow, .baselineOffset
  • NSMutableParagraphStyle은 단락의 정렬, 줄 간격, 들여쓰기 및 텍스트 방향을 관리
  • UILabel, UITextView, UITextField는 attributedText 속성을 통해 서식이 지정된 텍스트 표시를 지원
  • HTML/RTF 변환 — NSAttributedString은 documentType을 통해 서식이 지정된 텍스트 가져오기 및 내보내기를 지원

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

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

프로젝트 논의

더 읽어보기