Attributed Text: 개념, 속성 유형 및 스타일링

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

Attributed Text는 NSAttributedString과 NSMutableAttributedString 클래스로 표현되는 iOS SDK 메커니즘으로, 하나의 텍스트 문자열 서로 다른 부분에 여러 스타일을 적용할 수 있습니다. 일반적인 NSString과 달리, Attributed String은 문자만 저장하는 것이 아니라 각 범위에 대한 속성 사전—폰트, 색상, 줄 간격, 그림자, 정렬—도 함께 저장합니다. Apple Developer Documentation에 따르면, Attributed String은 UILabel, UITextView 그리고 UITextField에서 포맷된 텍스트를 표시하는 기본입니다. WebKit이나 타사 라이브러리 없이 텍스트를 스타일링하는 표준 방법입니다.

주요 포인트

  • NSAttributedString — iOS에서 속성 사전을 통해 텍스트를 스타일링하는 불변 클래스
  • 속성에는 폰트, 색상, 줄 간격, 그림자, 밑줄 및 정렬이 포함됩니다
  • NSMutableAttributedString — 동적으로 스타일을 적용하는 가변 버전
  • addAttributes는 범위에 속성 사전을 적용하고, addAttribute는 단일 속성을 적용합니다
  • NSAttributedString은 UILabel, UITextView, UITextField 및 Core Text에서 사용됩니다

iOS에서 Attributed Text란?

NSAttributedString은 Foundation 프레임워크의 클래스로, 문자 범위에 바인된 명시된 속성 집합을 가진 문자열을 표현합니다. 각 속성은 키-값 쌍입니다: 키는 상수(NSFontAttributeName, NSForegroundColorAttributeName)로 정의되고, 값은 해당 객체(UIFont, UIColor)입니다. 속성은 NSRange를 통해 문자 범위에 적용됩니다.

이 클래스는 모든 Apple 플랫폼에서 사용 가능합니다: iOS (2.0+), macOS, tvOS, watchOS. NSAttributedString은 불변입니다 — 한번 생성되면 그 속성이 고정됩니다. 동적 변경을 위해서는 NSMutableAttributedString이 사용되며, 이는 NSAttributedString을 상속받고 setAttributes, addAttributes, addAttribute, removeAttribute 메소드를 추가합니다.

NSString과의 차이점

NSString은 스타일 정보 없이 단순한 문자 열입니다. text를 통해 UILabel에 전달된 모든 텍스트는 단일 폰트, 색상 및 크기로 표시됩니다. attributedText를 통해 전달된 NSAttributedString은 각 문자가 고유한 속성 집합을 가질 수 있습니다. UILabel, UITextView 그리고 UITextField는 NSAttributedString을 자동으로 인식하고 그 속성에 따라 텍스트를 렌더링합니다.

저장 형식

내부적으로, NSAttributedString은 텍스트가 든 NSString과 속성 범위 배열을 저장합니다. 각 범위는 NSRange 구조체와 속성 사전으로 표현됩니다. 렌더링 동안, 시스템은 범위를 반복하며 각 섹션에 해당하는 속성을 적용합니다. 효율성은 속성 스위칭 회수에 따라 달라집니다 — 븄단 구간에서 잧은 변경은 렌더링 시간을 증가시킵니다.

NSAttributedString 속성

NSAttributedString 속성은 UIKit(iOS) 및 AppKit(macOS)에서 정의된 상수로, 각각이 텍스트 시각적 스타일링의 특정 측면에 해당합니다. 모든 속성은 NSAttributedString.Key 문자열이며, 그 값은 특정 클래스의 객체입니다. 속성은 문자 레벨(문자에 영향) 및 단락 레벨(단락에 영향)으로 나뉘니다.

문자 레벨 속성에는 폰트(NSFontAttributeName), 텍스트 색상(NSForegroundColorAttributeName), 배경 색상(NSBackgroundColorAttributeName), 밑줄(NSUnderlineStyleAttributeName), 취소선(NSStrikethroughStyleAttributeName), 그림자(NSShadowAttributeName)가 포함됩니다. 단락 레벨 속성은 NSParagraphStyleAttributeName을 통해 설정되며, 이는 정렬, 들여쓰기, 줄 간격 및 탭 기능을 제어합니다.

링크 및 대화형 속성

NSLinkAttributeName은 텍스트에 클릭 가능한 링크를 만듭니다: 값은 URL 또는 문자열입니다. 대화활성이 사용으로 설정된 경우 UITextView가 이러한 링크를 자동으로 처리합니다. NSAttachmentAttributeName은 텍스트 내에 NSTextAttachment—인라인 요소로 렌더링되는 이미지—를 임베드할 수 있게 합니다. 이는 아이콘, 이모티콘 또는 커스텀 뷰가 있는 텍스트를 만드는 데 사용됩니다.

기본 스타일링 속성

NSAttributedString 속성에는 엄격하게 타입된 값이 있습니다. iOS 개발에서 가장 많이 사용되는 속성들을 살펴보겠습니다. 폰트는 UIFont 객체를 통해, 색상은 UIColor를 통해, 줄 간격은 NSMutableParagraphStyle을 통해 설정되며, 이를 통해 하나의 객체에서 정렬, 들여쓰기 및 간격을 구성할 수 있습니다.

속성 키값 유형목적
NSFontAttributeNameUIFont텍스트 폰트
NSForegroundColorAttributeNameUIColor텍스트 색상
NSBackgroundColorAttributeNameUIColor텍스트 뒤의 배경 색상
NSUnderlineStyleAttributeNameNSNumber (Int)밑줄 스타일
NSParagraphStyleAttributeNameNSParagraphStyle단락 설정
NSKernAttributeNameNSNumber (Float)글자 간격(커닝)

NSParagraphStyle

NSParagraphStyle은 단락 속성의 컨테이너입니다: alignment, lineSpacing, paragraphSpacing, firstLineHeadIndent, lineBreakMode, minimumLineHeight 등. 이 매개변수를 수정하려면 NSMutableParagraphStyle을 생성하고, 원하는 특성을 설정한 다음, 그 객체를 NSParagraphStyleAttributeName 속성의 값으로 전달합니다. 이것이 NSAttributedString에서 줄 간격을 제어하는 유일한 방법입니다.

그림자 및 효과

NSShadow를 통해 텍스트에 그림자를 추가할 수 있습니다: shadowOffset, shadowBlurRadius, shadowColor 매개변수가 그림자의 올래값, 붓희림 및 색상을 설정합니다. 밑줄 및 취소선 속성은 스타일 조합을 수락합니다: NSUnderlineStyle.single, .double, .thick, .patternDash, .patternDot. 선의 두께와 색상을 정확하게 제어하려면 NSUnderlineColorAttributeName과 NSStrikethroughColorAttributeName이 사용됩니다.

코드에서 NSAttributedString 사용하기

Swift에서 NSAttributedString을 생성하려면 텍스트와 속성 사전을 사용하는 초기화자를 사용하거나, NSMutableAttributedString을 통해 단계별로 스타일을 적용합니다. 기본 접근 방식은 전체 텍스트에 대한 속성 사전을 정의하고, 그 다음에 특정 범위에 대한 속성을 추가하거나 수정하는 것입니다.

전체 텍스트에 속성을 지정하여 생성

간단한 예제 — 전체 문자열에 대해 폰트, 색상 및 정렬을 설정합니다. 속성 사전은 NSAttributedString 초기화자에 전달됩니다. 사전의 키는 NSAttributedString.Key 상수이며, 값은 해당 UIKit 객체입니다. 이것은 전체 텍스트가 통일되게 포맷되는 기본 사례입니다.

swift
let attributes: [NSAttributedString.Key: Any] = [
    .font: UIFont.systemFont(ofSize: 16),
    .foregroundColor: UIColor.darkGray,
    .paragraphStyle: let style = NSMutableParagraphStyle()
    style.alignment = .center
    style.lineSpacing = 4
    return style
]
let attributedString = NSAttributedString(
    string: "Hello world",
    attributes: attributes
)
label.attributedText = attributedString

텍스트는 systemFont 16, 진한 회색, 가운데 정렬, 4pt 줄 간격으로 표시됩니다. 이 접근 방식은 정적 헤더와 버튼에 편리합니다.

범위에 적용

NSMutableAttributedString은 텍스트의 서로 다른 부분에 다른 스타일을 적용할 수 있습니다. addAttribute 메소드는 범위에 단일 속성을 추가하고, addAttributes는 속성 사전을 추가합니다. setAttributes 메소드는 범위의 모든 기존 속성을 새로운 것으로 대체합니다. 이것이 강조표를 가진 텍스트를 만드는 주요 도구입니다.

swift
let text = "Price: 1999 rubles"
let attributed = NSMutableAttributedString(string: text)
attributed.addAttribute(.foregroundColor,
    value: UIColor.green, range: NSRange(location: 6, length: 4))
attributed.addAttribute(.font,
    value: UIFont.boldSystemFont(ofSize: 20), range: NSRange(location: 6, length: 4))
label.attributedText = attributed

단어 “1999”는 녹색으로 굵은 폰트가 되며, 나머지 텍스트는 표준으로 남아있습니다. NSRange는 수동으로 계산됩니다 — 특히 이모티콘과 복합 Unicode 문자를 다룰 때 문자 길이를 정확히 계산하는 것이 중요합니다.

NSMutableAttributedString으로 동적 스타일

NSMutableAttributedString은 텍스트와 속성을 동적으로 변경하는 메소드를 제공합니다: append, insert, replace, delete, setAttributes, addAttribute, removeAttribute, enumerateAttributes. 이를 통해 다양한 소스에서 텍스트를 빌들이고, 스타일을 조합하며, 인터페이스 이벤트에 대응할 수 있습니다.

불변 NSAttributedString과 달리, 가변 버전은 새 객체를 만들지 않고 콘텐츠를 변경할 수 있습니다. 이것은 사용자가 텍스트를 편집할 수 있고 스타일이 유지되어야 하는 텍스트 에디터, 채팅, 폼에 근본적인 것입니다.

채팅에서 스타일 조합

메신저에서 각 메시지에는 사용자 이름(굵은 폰트), 메시지 텍스트(보통), 시간(회색)이 있습니다. NSMutableAttributedString은 해당 속성과 함께 원하는 순서로 부분을 추가하여 한 번에 이러한 문자열을 빌들 수 있습니다.

swift
let result = NSMutableAttributedString()
let name = NSAttributedString(string: "Anna: ",
    attributes: [.font: UIFont.boldSystemFont(ofSize: 15)])
let message = NSAttributedString(string: "Hello, how are you?",
    attributes: [.font: UIFont.systemFont(ofSize: 15)])
let time = NSAttributedString(string: " 12:30",
    attributes: [.foregroundColor: UIColor.gray])
result.append(name)
result.append(message)
result.append(time)
label.attributedText = result

결과는 세 개의 스타일된 섹션을 가진 단일 문자열입니다. Append는 자동으로 NSRange를 계산하므로 위치를 수동으로 계산할 필요가 없습니다. 이 접근 방식은 어떤 수의 단편에도 확장 가능합니다.

속성 열거

enumerateAttributes(in:options:using:) 메소드는 지정된 간격에서 모든 속성 범위를 반복합니다. 이것은 포맷 분석에 유용합니다: 모든 링크 찾기, 특정 속성의 색상 변경, 또는 텍스트를 HTML로 내보내기. 클로저에는 현재 섹션의 속성 사전과 NSRange가 전달됩니다.

UIKit UI 컴포넌트에서 Attributed Text

UIKit에서 텍스트를 표시하는 모든 주요 UI 컴포넌트는 attributedText 특성을 통해 NSAttributedString을 지원합니다. UILabel은 정적 스타일된 텍스트를 표시하고, UITextView는 편집과 링크를 지원하며, UITextField는 플레이스홀더와 입력된 텍스트에 대해 별도로 속성을 수락합니다.

attributedText와 UILabel

UILabel은 스타일된 텍스트를 표시하는 가장 가벼운 컴포넌트입니다. 모든 문자 레벨 속성을 지원하지만 클릭 가능한 링크를 자동으로 처리하지 않습니다(그렇게 하려면 UITextView가 필요합니다). UILabel은 헤더, 레이블 그리고 빔은 포맷된 텍스트에 이상적입니다.

링크가 있는 UITextView

UITextView는 NSLinkAttributeName을 처리하고 링크를 대화형 요소로 표시합니다. 이 기능을 사용으로 설정하려면 isSelectable = true와 isEditable = false를 설정하세요. 링크를 탭하면 데리게이트가 textView(_:shouldInteractWith:in:interaction:)을 수신합니다. UITextView는 또한 텍스트 내 이미지를 위한 NSTextAttachment도 지원합니다.

swift
let text = "Details on developer.apple.com"
let attributed = NSMutableAttributedString(string: text)
attributed.addAttribute(.link,
    value: URL(string: "https://developer.apple.com")!,
    range: NSRange(location: 0, length: text.count))
textView.attributedText = attributed
textView.isSelectable = true
textView.isEditable = false

isSelectableisEditable 설정 후, 텍스트 영역은 정적 텍스트 블록처럼 동작하지만 링크는 계속 활성적입니다. UITextViewDelegate가 탭 시 동작을 제어합니다.

Core Text와의 통합

Core Text는 NSAttributedString과 직접 작동하는 Apple의 저위 레벨 텍스트 렌더링 프레임워크입니다. UIKit과 달리, Core Text는 NSAttributedString을 직접 표시 객체로 사용하지 않습니다 — 대신 CTFramesetter로 변환한 후 CTFrame으로 변환하여 Core Graphics 컨텍스트에서 렌더링합니다. 이를 통해 줄 레이아웃과 글라이프를 완전히 제어할 수 있습니다.

Core Text의 사용은 커스텀 텍스트 레이아웃(컬럼, 이미지 감싸기, 텍스트 회전, 비표준 줄 바꾸기)에 적합합니다. Core Text의 NSMutableParagraphStyle에는 UIKit에서 사용할 수 없는 속성이 포함되어 있습니다: kCTParagraphStyleSpecifierMaximumLineSpacing, kCTParagraphStyleSpecifierLineBreakMode(추가 모드 포함).

UIKit과 Core Text 간 변환

NSAttributedString은 UIKit과 Core Text 간에 원활하게 전달됩니다. 두 프레임워크 모두 동일한 타입으로 작동하기 때문입니다. UIKit 속성(NSFontAttributeName, NSForegroundColorAttributeName)은 Core Text에서 자동으로 인식되고, 그 반대(Core Text 속성, kCTFontAttributeName)도 UIKit에서 읽힌니다. 이를 통해 간단한 작업에는 UIKit을, 커스텀 렌더링에는 Core Text를 동일한 NSAttributedString 객체에서 사용할 수 있습니다.

자주 묻는 질문

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

NSString은 스타일 정보 없이 텍스트만 저장합니다. NSAttributedString은 각 문자 범위에 대한 속성 사전으로 텍스트를 보천합니다. text 특성을 통해 UILabel에 전달되면, NSString은 플레인 텍스트로 표시됩니다. NSAttributedString이 attributedText를 통해 전달되면 모든 속성이 적용됩니다: 하나의 문자열에서 다양한 폰트, 색상 및 간격이 적용됩니다.

하나의 범위에 여러 속성을 추가하려면 어떻게 하나요?

속성 사전을 사용하여 addAttributes(_:range:) 메소드를 사용하세요: addAttributes([.font: font, .foregroundColor: color], range: range). 단일 속성을 추가하거나 변경하려면 addAttribute(_:value:range:)를 사용하세요. setAttributes 메소드는 범위의 모든 기존 속성을 제공된 속성으로 대체합니다.

NSAttributedString에서 줄 간격을 변경하려면 어떻게 하나요?

NSMutableParagraphStyle을 생성하고, lineSpacing 특성을 설정한 다음, 이를 NSParagraphStyleAttributeName 속성의 값으로 전달하세요. 완전한 제어를 위해 minimumLineHeight, maximumLineHeight, paragraphSpacing, lineBreakMode 그리고 alignment도 사용 가능합니다. ParagraphStyle이 줄 간격을 제어하는 유일한 방법입니다.

속성이 SwiftUI에서 작동하나요?

네, SwiftUI는 iOS 15+에서 Text(attributedString:)를 통해 NSAttributedString을 지원합니다. 구 버전에서는 UILabel 또는 UITextView와 함께 UIViewRepresentable을 사용하세요. SwiftUI는 또한 Markdown과 유사한 문법으로 선언적 포맷을 위한 자체 AttributedString 타입(SwiftUI, Foundation 아님)을 제공합니다.

NSAttributedString의 크기를 계산하려면 어떻게 하나요?

boundingRect(with:options:context:) 메소드를 사용하세요. 이 메소드는 주어진 속성으로 문자열을 표시하는 데 필요한 CGRect을 반환합니다. options 매개변수: [.usesLineFragmentOrigin, .usesFontLeading]는 줄 간격과 폰트 메트릭스를 고려합니다. 제한된 줄 수의 UILabel의 경우 sizeThatFits를 사용하세요.

요약

  • NSAttributedString — iOS에서 속성 사전을 통해 텍스트를 스타일링하는 Foundation 클래스
  • 속성에는 폰트(UIFont), 색상(UIColor), 밑줄, 그림자, 단락 설정이 포함됩니다
  • NSMutableAttributedString — 속성 추가 및 제거를 위한 동적 버전
  • addAttributes(_:range:)는 문자 범위에 속성 사전을 적용합니다
  • NSParagraphStyle은 줄 간격, 정렬 및 들여쓰기를 제어합니다
  • UILabel, UITextView, UITextField는 스타일 표시를 위해 attributedText를 지원합니다
  • Core Text는 저위 렌더링에 동일한 NSAttributedString을 사용합니다

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

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

프로젝트 논의

더 읽어보기