sp: 개념, Android 텍스트용 확장 가능 픽셀

저자: IT Sectr 게시일: 2026-02-25 읽는 시간: 9 분

sp — Scale-independent Pixels, 기기의 글꼴 크기 설정을 고려하는 Android의 텍스트 측정 단위입니다. dp와 달리 sp는 시스템 글꼴 크기에 따라 확장되어 인터페이스 접근성을 보장합니다. 이 기사는 sp와 dp의 차이점을 설명하고, XML 및 Kotlin에서 textSize 설정 방법을 보여주며, Android에서 타이포그래피 작업을 위한 모범 사례를 소개합니다.

핵심 요약

  • sp — 사용자의 시스템 글꼴 설정에 따라 확장되는 텍스트 단위
  • dp — 요소 크기 단위, 글꼴 크기 변경에 반응하지 않음
  • sp와 dp의 차이: sp = dp × scaleFactor (scaleFactor는 글꼴 설정에 따라 달라짐)
  • XML에서 textSize sp로 설정: android:textSize="16sp"
  • Material Design 제목에 12sp~34sp의 타이포그래피 범위 권장

Android에서 sp란?

sp (scale-independent pixel) — 사용자의 시스템 설정에 따라 자동으로 확장되는 Android의 글꼴 크기 측정 단위입니다. 기기 소유자가 설정에서 글꼴 크기를 늘리면 sp 값을 가진 모든 요소가 비례적으로 커집니다. 이는 시각 장애가 있는 사람들을 위한 인터페이스의 접근성을 보장합니다.

기본 비율: 표준 글꼴 배율 1.0(보통)에서 1 sp = 1 dp입니다. 사용자가 글꼴을 크게(1.15×) 설정하면 16 sp는 18.4 물리적 픽셀이 됩니다. 작은 글꼴 크기(0.85×)에서는 같은 16 sp가 13.6 px이 됩니다. 확장 메커니즘은 Android Framework 수준에서 Settings.System.FONT_SCALE을 통해 관리됩니다.

Google Material Design 가이드라인에 따르면 텍스트는 독점적으로 sp로 지정해야 합니다. 예외는 레이아웃에 크기가 중요한 구성 요소의 고정 레이블입니다(예: 고정 높이 버튼 내부 텍스트). 이러한 경우 수동 접근성 제어와 함께 dp를 사용하는 것이 좋습니다.

sp vs dp: 주요 차이점

spdp의 차이는 Android 개발자 면접과 실제 코드 리뷰에서 가장 흔한 주제 중 하나입니다. 두 단위 모두 밀도 독립 픽셀(mdpi 화면에서 160 dpi = 1 dp = 1 px)에 연결되어 있지만 시스템 글꼴 크기가 변경될 때 다르게 동작합니다.

특성spdp
목적텍스트 크기요소 크기, 패딩, 너비, 높이
글꼴 확장예(배율 인자)아니요
밀도 확장
설정 APIandroid:textSizeandroid:layout_width, layout_height, padding, margin
Material Design 토큰typescalespacing, sizing

실제로 흔한 실수는 텍스트에 dp를 사용하는 것입니다. 텍스트가 dp로 설정되면 글꼴 크기가 증가해도 확장되지 않아 시력이 약한 사용자가 인터페이스를 사용할 수 없게 됩니다. 반대 실수는 버튼 높이나 패딩에 sp를 사용하는 것입니다. 글꼴이 커지면 버튼이 "부풀어" 레이아웃이 깨질 수 있습니다.

sp 확장 작동 방식

sp 확장은 Android Framework 수준의 TypedValue 클래스에 구현되어 있습니다. 변환 공식: sp = dp × scaledDensity (scaledDensity는 화면 밀도와 사용자의 글꼴 크기 설정을 모두 고려하는 배율 인자).

kotlin
// Kotlin에서 scaledDensity 프로그래밍 방식 획득
val scaledDensity = with(context.resources) {
    displayMetrics.scaledDensity
}

// sp를 px로 변환
fun spToPx(sp: Float, context: Context): Float {
    return TypedValue.applyDimension(
        TypedValue.COMPLEX_UNIT_SP,
        sp,
        context.resources.displayMetrics
    )
}

// px를 sp로 변환
fun pxToSp(px: Float, context: Context): Float {
    return px / context.resources.displayMetrics.scaledDensity
}

TypedValue.applyDimension 메서드는 런타임에 sp를 픽셀로 변환하는 유일한 올바른 방법입니다. scaledDensity를 직접 곱하는 것은 엣지 케이스(0 값, 오버플로)를 처리하지 않으므로 신뢰성이 떨어집니다. scaledDensity는 Settings > Display > Font size를 통해 글꼴 설정을 수정하면 변경됩니다.

배율 인자

Android는 다섯 가지 사전 정의된 글꼴 배율 수준을 제공합니다: 작게(0.85×), 기본(1.0×), 크게(1.15×), 가장 크게(1.3×), 그리고 Android 14+의 추가 매우 크게(>1.3×) 수준입니다. 기기 제조사(Samsung, Xiaomi)는 자체 수준을 추가합니다 — 최대 2.0×까지. sp의 최소 텍스트 크기는 고정 픽셀 수를 보장하지 않습니다.

XML에서 sp 사용

XML 레이아웃에서 sp는 독점적으로 android:textSize 속성에 사용됩니다. 다른 모든 크기(너비, 높이, 패딩, 마진, 고도)는 dp로 설정됩니다. 규칙은 간단합니다: 요소가 텍스트를 표시하면 크기는 sp로; 요소가 기하학을 정의하면 크기는 dp로 합니다.

XML에서 textSize 기본 예제

xml
<!-- sp로 textSize가 있는 TextView 레이아웃 -->
<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@string/hello"
    android:textSize="16sp"
    android:padding="12dp"
    android:lineSpacingExtra="4dp" />

<!-- dimens 리소스 사용 -->
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="@dimen/text_body_large" />

텍스트 크기를 dimens.xml 파일로 추출하는 것이 좋습니다. 이렇게 하면 타이포그래피 유지 관리가 간소화되고 다양한 화면 구성에 맞게 크기를 재정의할 수 있으며 애플리케이션 전체에서 일관성을 보장합니다.

타이포그래피 토큰이 포함된 dimens.xml

xml
<!-- res/values/dimens.xml -->
<resources>
    <!-- Material Design Type Scale -->
    <dimen name="text_display_large">34sp</dimen>
    <dimen name="text_display_medium">28sp</dimen>
    <dimen name="text_headline_large">24sp</dimen>
    <dimen name="text_headline_medium">20sp</dimen>
    <dimen name="text_title_large">18sp</dimen>
    <dimen name="text_body_large">16sp</dimen>
    <dimen name="text_body_medium">14sp</dimen>
    <dimen name="text_label_large">14sp</dimen>
    <dimen name="text_label_small">11sp</dimen>
</resources>

Material Design Type Scale에는 13가지 크기 수준이 포함됩니다 — 작은 레이블용 11sp에서 대형 디스플레이 제목용 57sp까지. Android 프로젝트는 일반적으로 8~10 수준을 사용합니다. 모든 값은 1sp의 배수여야 합니다 — 분수 값(15.5sp)은 서브픽셀 배치로 인해 렌더링이 저하됩니다.

Kotlin으로 타이포그래피 설정

현대 Android 개발에서 텍스트는 sp의 textSize를 통해 직접 설정되는 경우가 거의 없습니다. 대신 MaterialTheme.typography 시스템이 사용되며, 각 스타일이 사전 정의되고 크기, 두께, 줄 높이, 문자 간격을 포함합니다.

kotlin
// Typography API를 통한 사용자 정의 타이포그래피
val AppTypography = Typography(
    displayLarge = TextStyle(
        fontWeight = FontWeight.Normal,
        fontSize = 34.sp,
        lineHeight = 40.sp,
        letterSpacing = 0.sp
    ),
    headlineLarge = TextStyle(
        fontWeight = FontWeight.SemiBold,
        fontSize = 24.sp,
        lineHeight = 32.sp
    ),
    titleLarge = TextStyle(
        fontWeight = FontWeight.Medium,
        fontSize = 18.sp,
        lineHeight = 24.sp
    ),
    bodyLarge = TextStyle(
        fontWeight = FontWeight.Normal,
        fontSize = 16.sp,
        lineHeight = 24.sp,
        letterSpacing = 0.5.sp
    ),
    labelSmall = TextStyle(
        fontWeight = FontWeight.Medium,
        fontSize = 11.sp,
        lineHeight = 16.sp,
        letterSpacing = 0.5.sp
    )
)

Jetpack Compose의 확장 함수 .sp는 자동으로 배율 독립 픽셀로 변환됩니다. 시스템 글꼴 크기가 변경되면 Compose는 새 scaledDensity에 따라 fontSize, lineHeight 및 spacing을 다시 계산합니다. TextUnit(sp를 나타내는 클래스)은 텍스트는 확장되지만 패딩은 확장되지 않음을 보장합니다.

Jetpack Compose에서 sp

Jetpack Compose에서 sp는 TextUnit 유형으로 표현되며, 요소 크기에 실수로 사용될 수 없습니다. Kotlin 컴파일러는 Dp가 예상되는 곳에 TextUnit이 전달되면 오류를 발생시킵니다. 이는 잘못된 확장과 관련된 전체 버그 클래스를 제거합니다.

kotlin
// Compose의 TextUnit — sp로 안전한 작업
@Composable
fun ArticleCard(title: String, description: String) {
    Card(modifier = Modifier
        .fillMaxWidth()
        .padding(16.dp)
    ) {
        Text(
            text = title,
            style = MaterialTheme.typography.titleLarge
        )
        Spacer(modifier = Modifier.height(8.dp))
        Text(
            text = description,
            style = MaterialTheme.typography.bodyMedium
        )
    }
}

// sp로 fontSize 명시적 설정
Text(
    text = "사용자 정의 크기",
    fontSize = 20.sp,
    fontWeight = FontWeight.Bold,
    color = MaterialTheme.colorScheme.primary
)

Compose에는 XML 속성 android:textSize의 직접적인 해당 항목이 없습니다 — 텍스트 크기는 TextStyle.fontSize를 통해 설정됩니다. MaterialTheme.typography 시스템은 Material Design Type Scale에 해당하는 사전 정의된 스타일을 제공합니다. 사용자 정의 크기가 필요한 경우 20.sp 리터럴이 사용됩니다 — 언어는 이것이 TextUnit이며 Dp가 아님을 보장합니다.

sp 모범 사례

sp의 올바른 사용은 접근 가능한 Android 애플리케이션의 기초입니다. 아래는 Google Material Design 및 Android Developers Guide 권장 사항을 기반으로 한 규칙입니다.

  • 텍스트에는 항상 sp 사용 — textSize를 dp나 px로 설정하지 마세요. 그렇지 않으면 글꼴을 크게 설정한 사용자가 인터페이스를 읽을 수 없습니다
  • 컨테이너에는 dp 사용 — 버튼 높이, 패딩, 카드 너비는 dp여야 합니다. 그렇지 않으면 큰 글꼴에서 요소가 겹칠 수 있습니다
  • 크기를 dimens.xml로 추출 — 타이포그래피 토큰의 중앙 저장소는 리팩토링과 다크 테마 지원을 간소화합니다
  • 12sp 미만의 sp 사용 금지 — 더 작은 텍스트는 높은 PPI 기기와 표준 글꼴 크기에서 읽기 어려워집니다
  • 최대 글꼴 배율에서 테스트 — 기기 설정에서 가장 큰 글꼴을 활성화하고 인터페이스가 깨지지 않는지 확인하세요

접근성의 주요 규칙: 사용자는 기능 손실 없이 글꼴 크기를 늘릴 수 있어야 합니다. 애플리케이션이 1.3× 글꼴 배율에서 올바르게 작동하면 기본 접근성 테스트를 통과합니다. textSize가 dp로 설정되고 인터페이스가 확장되지 않으면 Google Play에서 애플리케이션을 거부할 수 있습니다.

자주 묻는 질문

sp와 dp는 어떻게 다른가요?

sp(scale-independent pixel)는 시스템 글꼴 크기가 변경되면 확장되지만 dp는 그렇지 않습니다. sp는 텍스트에만 사용되고 dp는 다른 모든 요소 크기에 사용됩니다. 변환 계수: sp = dp × FONT_SCALE.

패딩에 sp를 사용할 수 있나요?

아니요. 패딩, 버튼 높이, 카드 너비는 dp로 설정해야 합니다. 패딩에 sp를 사용하면 글꼴이 커질 때 요소가 부자연스럽게 커지고 화면 경계를 벗어날 수 있습니다.

앱이 sp로 올바르게 작동하는지 확인하는 방법은?

Settings > Display > Font size를 열고 최대값(Largest)으로 설정하세요. 애플리케이션을 실행하고 모든 텍스트를 읽을 수 있고 요소가 겹치지 않으며 버튼이 화면 경계를 벗어나지 않는지 확인하세요. 자동화를 위해 UiAutomator와 함께 Espresso를 사용하세요.

sp에서 허용되는 최소 텍스트 크기는?

Material Design은 labelSmall에 최소 크기 11sp를 권장합니다. 본문 텍스트는 14sp(bodyMedium)~16sp(bodyLarge)입니다. 11sp 미만의 크기는 높은 픽셀 밀도 기기에서 읽기 어려워지므로 권장되지 않습니다.

textSize를 dp로 설정하면 어떻게 되나요?

텍스트는 시스템 글꼴 설정과 관계없이 고정 크기로 표시됩니다. 글꼴을 크게 설정한 사용자는 이 텍스트를 편안하게 읽을 수 없습니다. 이는 WCAG 접근성 요구 사항을 위반하며 Google Play에서 애플리케이션이 거부될 수 있습니다.

요약

  • sp — FONT_SCALE을 통해 사용자 설정에 따라 확장되는 Android의 글꼴 측정 단위
  • dp — 글꼴 크기 변경에 반응하지 않는 요소 크기 단위
  • textSize XML에서 android:textSize="16sp"로 설정, 다른 모든 크기는 dp
  • MaterialTheme.typography Jetpack Compose에서 유형 안전성을 위해 TextUnit(.sp) 사용
  • dimens.xml — 일관성을 위한 타이포그래피 토큰의 중앙 저장소
  • 최소 크기 텍스트 — 11sp, 본문 권장 — 14~16sp
  • 테스트 최대 글꼴 배율에서 — 접근성 확인의 필수 단계

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

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

프로젝트 논의

더 읽어보기