반응형
Android 텍스트 크기 dp vs sp 차이점과 sp 사용해야 하는 이유
안드로이드 앱을 개발하다 보면 텍스트 크기를 지정할 때 어떤 단위를 사용해야 할지 고민하게 됩니다. 특히 dp(Density-independent Pixels)와 sp(Scale-independent Pixels) 사이에서 선택하는 것은 UI 디자인과 접근성에 큰 영향을 미치는 중요한 결정입니다. 이 글에서는 텍스트 크기에 dp 대신 sp를 사용해야 하는 이유와 각 단위의 특성, 예외 상황까지 자세히 알아보겠습니다.

목차
1. dp와 sp의 기본 개념 차이점
2. 텍스트 크기에 sp를 사용해야 하는 3가지 이유
3. dp를 텍스트에 사용했을 때 발생하는 문제점
4. 실제 코드에서 dp와 sp 적용 방법
5. 예외 상황과 텍스트 크기 모범 사례
#1. dp와 sp의 기본 개념 차이점
안드로이드 개발에서 사용되는 두 가지 주요 크기 단위인 dp와 sp에 대해 명확히 이해해 봅시다.
1) dp (Density-independent Pixels)란?
dp는 화면 밀도에 독립적인 픽셀 단위입니다. 다양한 해상도와 화면 크기를 가진 안드로이드 기기에서 일관된 레이아웃을 만들기 위해 사용됩니다.
(1) dp의 주요 특징
① 화면 밀도에 따라 자동으로 조정됩니다
② 공식: 1dp = (화면 밀도 / 160) 픽셀
③ 주요 용도: 뷰 크기, 마진, 패딩 등 레이아웃 요소 지정
④ 모든 기기에서 동일한 물리적 크기를 유지
. . . . .
2) sp (Scale-independent Pixels)란?
sp는 dp와 유사하지만 한 가지 중요한 차이점이 있습니다. sp는 화면 밀도뿐만 아니라 사용자의 폰트 크기 설정에도 반응합니다.
(1) sp의 주요 특징
① 화면 밀도와 사용자 폰트 설정에 따라 조정됩니다
② 공식: 1sp = (화면 밀도 / 160) × (사용자 폰트 스케일) 픽셀
③ 주요 용도: 텍스트 크기 지정
④ 시스템 설정의 폰트 크기 변경에 자동으로 반응
. . . . .
3) dp와 sp의 핵심 차이점 비교
| 구분 | dp | sp |
|---|---|---|
| 화면 밀도 반응 | O (반응함) | O (반응함) |
| 사용자 폰트 설정 반응 | X (반응 안 함) | O (반응함) |
| 주요 사용 대상 | 레이아웃 요소 | 텍스트 |
| 크기 고정 여부 | 사용자 설정과 무관하게 고정 | 사용자 설정에 따라 가변 |
#2. 텍스트 크기에 sp를 사용해야 하는 3가지 이유
텍스트 크기를 지정할 때 dp 대신 sp를 사용해야 하는 주요 이유들을 살펴보겠습니다.
1) 접근성(Accessibility) 향상
가장 중요한 이유는 접근성입니다. 시력이 좋지 않은 사용자들은 종종 기기의 설정에서 글꼴 크기를 더 크게 조정합니다. sp 단위를 사용하면 이러한 사용자 설정에 앱이 자동으로 반응할 수 있습니다.
(1) 접근성이 중요한 이유
① 시각 장애가 있는 사용자도 앱을 편하게 사용할 수 있습니다
② 노인 사용자층의 앱 사용성이 크게 개선됩니다
③ 장시간 화면을 보는 사용자의 눈 피로를 줄여줍니다
④ WCAG(Web Content Accessibility Guidelines) 접근성 기준을 충족합니다
. . . . .
2) 사용자 경험(User Experience) 향상
사용자들은 자신에게 가장 편안한 텍스트 크기를 설정하고 모든 앱에서 일관된 경험을 기대합니다. sp 단위를 사용하면 앱이 시스템 설정과 조화를 이루어 더 나은 사용자 경험을 제공할 수 있습니다.
(1) 사용자 경험 개선 효과
① 시스템 전체와 일관된 텍스트 크기를 유지합니다
② 사용자의 개인 설정을 존중하여 신뢰도가 높아집니다
③ 앱 사용 시 별도의 설정 조정이 불필요합니다
④ 전반적인 사용자 만족도가 향상됩니다
. . . . .
3) 다양한 사용자층 수용
노인, 시각 장애가 있는 사용자, 그리고 단순히 더 큰 텍스트를 선호하는 사용자들까지 다양한 사용자층을 수용할 수 있습니다. 이는 앱의 포용성을 높이고 더 넓은 사용자 기반을 확보하는 데 도움이 됩니다.
(1) 사용자층 확대 효과
① 앱 스토어 평점과 리뷰 개선에 직접적인 영향을 미칩니다
② 다운로드 수와 사용자 유지율이 증가합니다
③ 글로벌 시장에서 경쟁력을 확보할 수 있습니다
④ 기업의 사회적 책임을 실현하는 수단이 됩니다
#3. dp를 텍스트에 사용했을 때 발생하는 문제점
텍스트 크기에 dp를 사용하면 어떤 문제가 발생할 수 있는지 구체적으로 살펴보겠습니다.
1) 접근성 제한 문제
dp는 사용자의 폰트 크기 설정을 무시합니다. 이것은 시각 장애가 있거나 작은 텍스트를 읽기 어려운 사용자들에게 큰 불편을 초래할 수 있습니다.
<!-- 잘못된 예: 텍스트에 dp 사용 -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="안녕하세요"
android:textSize="16dp" /> <!-- 문제: dp 사용 -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="안녕하세요"
android:textSize="16dp" /> <!-- 문제: dp 사용 -->
. . . . .
2) Android Studio 경고 발생
안드로이드 스튜디오는 텍스트 크기에 dp를 사용하면 경고 메시지를 표시합니다:
Using dp instead of sp for text sizes
이는 개발 가이드라인을 따르지 않고 있음을 알려주는 경고입니다. 이 경고를 무시하면 유지보수 시 문제가 될 수 있으며, 코드 리뷰 과정에서도 지적받을 수 있습니다.
. . . . .
3) 앱 리뷰에 부정적 영향
앱 스토어 리뷰에서 "텍스트가 너무 작고 조절할 수 없다"와 같은 불만이 생길 수 있습니다.
(1) 실제 발생하는 문제점
① 앱의 평점과 다운로드 수에 부정적인 영향을 미칩니다
② 고령 사용자나 시각 장애 사용자의 접근이 제한됩니다
③ 앱 접근성 테스트에서 실패할 가능성이 높아집니다
④ Google Play 정책 위반으로 간주될 수 있습니다
. . . . .
4) 시스템 폰트 크기 변경 시 비교
다음은 시스템 폰트 크기를 "매우 큼"으로 설정했을 때 sp와 dp를 사용한 텍스트의 차이를 보여줍니다:
| 구분 | 단위 | 기본 크기 | 시스템 설정 "매우 큼" 적용 시 |
|---|---|---|---|
| 권장 방식 | 16sp | 16px (기준 밀도) | ~24px (150% 스케일) |
| 비권장 방식 | 16dp | 16px (기준 밀도) | 16px (변화 없음) |
이런 차이는 시력이 약한 사용자에게 큰 영향을 미칩니다.
#4. 실제 코드에서 dp와 sp 적용 방법
실제 개발 시 올바른 단위를 적용하는 방법을 구체적으로 알아보겠습니다.
1) XML 레이아웃에서의 적용
(1) 올바른 sp 사용 예제
<!-- 올바른 예: 텍스트에 sp 사용 -->
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="안녕하세요"
android:textSize="16sp" /> <!-- 좋음: sp 사용 -->
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="안녕하세요"
android:textSize="16sp" /> <!-- 좋음: sp 사용 -->
(2) 올바른 dp 사용 예제
<!-- 올바른 예: 레이아웃 요소에 dp 사용 -->
<View
android:layout_width="100dp"
android:layout_height="1dp"
android:background="#CCCCCC" /> <!-- 좋음: 높이에 dp 사용 -->
<View
android:layout_width="100dp"
android:layout_height="1dp"
android:background="#CCCCCC" /> <!-- 좋음: 높이에 dp 사용 -->
. . . . .
2) Java/Kotlin 코드에서의 적용
(1) Java 코드 예제
// Java 코드에서 sp 값 설정
float spValue = 16f;
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, spValue);
float spValue = 16f;
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, spValue);
(2) Kotlin 코드 예제
// Kotlin 코드에서 sp 값 설정
val spValue = 16f
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, spValue)
// Kotlin 확장 함수 사용 (일부 라이브러리 제공)
textView.textSize = 16.sp
val spValue = 16f
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, spValue)
// Kotlin 확장 함수 사용 (일부 라이브러리 제공)
textView.textSize = 16.sp
. . . . .
3) 스타일과 테마에서의 적용
styles.xml에서 텍스트 스타일을 정의하여 일관성을 유지하는 것이 좋습니다.
<!-- styles.xml -->
<style name="TextAppearance.App.Headline">
<item name="android:textSize">24sp</item>
<item name="android:textStyle">bold</item>
</style>
<style name="TextAppearance.App.Headline">
<item name="android:textSize">24sp</item>
<item name="android:textStyle">bold</item>
</style>
. . . . .
4) Android 공식 가이드라인 권장 사항
안드로이드 공식 문서와 머티리얼 디자인 가이드라인에서는 텍스트 크기에 항상 sp 단위를 사용할 것을 명확히 권장합니다.
(1) 공식 권장 사항
① 텍스트 크기에는 항상 sp 단위를 사용하세요
② 이 단위는 사용자의 폰트 크기 환경 설정에 따라 크기가 조정됩니다
③ 접근성을 개선하는 핵심 원칙 중 하나입니다
④ 머티리얼 디자인 타이포그래피 시스템과 호환됩니다
#5. 예외 상황과 텍스트 크기 모범 사례
모든 규칙에는 예외가 있습니다. 텍스트 크기에 dp를 사용하는 것이 적합한 경우와 텍스트 크기 지정 모범 사례를 알아보겠습니다.
1) dp가 적합한 예외 케이스
(1) 고정 크기가 필요한 UI 요소
레이아웃의 특정 부분이 텍스트 크기에 관계없이 항상 동일한 비율을 유지해야 하는 경우가 있습니다.
① 시계나 타이머 앱의 숫자 - 특정 공간에 정확히 맞아야 함
② 텍스트가 특정 공간에 딱 맞아야 하는 그래픽 UI 요소
③ 레이아웃이 특정 비율로 고정되어야 하는 게임 UI
④ 아이콘 폰트 (FontAwesome, Material Icons 등)
<!-- 예외 케이스: 시계 앱에서 dp 사용 -->
<TextView
android:id="@+id/clock_digit"
android:layout_width="40dp"
android:layout_height="60dp"
android:background="@drawable/digit_background"
android:gravity="center"
android:textSize="40dp" <!-- 이 경우 dp 사용이 타당함 -->
android:text="8" />
<TextView
android:id="@+id/clock_digit"
android:layout_width="40dp"
android:layout_height="60dp"
android:background="@drawable/digit_background"
android:gravity="center"
android:textSize="40dp" <!-- 이 경우 dp 사용이 타당함 -->
android:text="8" />
. . . . .
2) 텍스트 크기 지정 모범 사례
(1) 텍스트 스타일 중앙화
모든 텍스트 스타일을 styles.xml에 정의하여 일관성을 유지하세요.
<!-- styles.xml -->
<style name="TextAppearance.App.Headline1">
<item name="android:textSize">24sp</item>
<item name="android:fontFamily">@font/roboto_bold</item>
</style>
<style name="TextAppearance.App.Body">
<item name="android:textSize">16sp</item>
<item name="android:fontFamily">@font/roboto_regular</item>
</style>
<style name="TextAppearance.App.Headline1">
<item name="android:textSize">24sp</item>
<item name="android:fontFamily">@font/roboto_bold</item>
</style>
<style name="TextAppearance.App.Body">
<item name="android:textSize">16sp</item>
<item name="android:fontFamily">@font/roboto_regular</item>
</style>
(2) 최소 텍스트 크기 고려
가독성을 위해 대부분의 텍스트는 최소 12sp 이상으로 설정하세요.
① 본문 텍스트: 14-16sp
② 헤드라인: 18-24sp
③ 작은 텍스트(캡션): 12sp
④ 매우 작은 텍스트는 피하세요
. . . . .
3) 다양한 화면 크기 대응
반응형 타이포그래피를 구현하여 화면 크기에 따라 텍스트 크기를 조정하세요.
<!-- values/dimens.xml -->
<dimen name="text_size_headline">20sp</dimen>
<!-- values-sw600dp/dimens.xml (태블릿) -->
<dimen name="text_size_headline">24sp</dimen>
<!-- 사용 -->
<TextView android:textSize="@dimen/text_size_headline" />
<dimen name="text_size_headline">20sp</dimen>
<!-- values-sw600dp/dimens.xml (태블릿) -->
<dimen name="text_size_headline">24sp</dimen>
<!-- 사용 -->
<TextView android:textSize="@dimen/text_size_headline" />
마무리
텍스트 크기에 sp를 사용하는 것은 안드로이드 개발에서 접근성과 사용자 경험 측면에서 매우 중요한 실천사항입니다. 이는 단순한 스타일 가이드라인이 아니라, 모든 사용자가 앱을 편안하게 사용할 수 있도록 하는 기본적인 접근성 요구사항입니다.
핵심 요약
① 텍스트 크기에는 sp 사용 - 사용자의 폰트 크기 설정을 존중합니다
② 레이아웃 요소에는 dp 사용 - 다양한 화면에서 일관된 UI를 유지합니다
③ 특수 케이스 인식하기 - 특정 상황에서는 예외가 있을 수 있으나, 대부분의 경우 sp가 권장됩니다
④ 접근성은 선택이 아닌 필수 - 더 많은 사용자에게 도달하고 더 나은 앱을 만들 수 있습니다
앱 개발에서 이러한 단위 선택이 작은 차이로 보일 수 있지만, 모든 사용자에게 포용적인 경험을 제공하는 데 큰 영향을 미친다는 점을 기억하세요. 접근성을 고려한 개발은 결국 모든 사용자에게 더 나은 경험을 제공하는 것입니다.
긴 글 읽어주셔서 감사합니다.
끝.
끝.
반응형
'Development > Android' 카테고리의 다른 글
| [Android] Android Studio 필수 단축키 70개 - 개발 생산성 2배 높이는 방법 (1) | 2022.10.07 |
|---|---|
| [Android] Android exported 속성 설정 방법과 보안 취약점 해결 (0) | 2022.10.04 |
| [Android] Play Asset Delivery / Play Feature Delivery 완벽 가이드 (0) | 2022.09.29 |
| [Android] 키보드가 화면 레이아웃에 영향 주지 않게 하는 방법 (0) | 2020.04.08 |
| [Android] Android GC_CONCURRENT FREED 에러 해결 방법과 메모리 최적화 (0) | 2020.04.08 |