| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- activity
- 이미지 로딩
- compose
- layoutinflater
- 프리코스
- buildSrc
- recyclerview
- 컴포즈
- EditText Button
- coil
- constraint
- 안드로이드 스튜디오
- 코틀린
- 우테코
- 로또 미션
- 멀티모듈
- onscrollstatechanged
- broadcast reciver
- 최상단
- Android
- 우테코 6기
- 안드로이드
- serialization
- 4대 컴포넌트
- 안드로이드 키보드
- moshi
- Glide
- GSON
- 우아한테크코스
- android studio
- Today
- Total
정답보다 해답을
[Android] 안드로이드의 픽셀 밀도와 단위 정리 (dp, sp, px 등) 본문
안드로이드의 픽셀 밀도와 단위 정리 (dp, sp, px 등)
안드로이드 앱을 개발하면서 가장 자주 보게 되는 단위 중 하나는
dp와sp입니다.
처음에는 아무 생각 없이 사용하지만, 다양한 기기에서 UI가 일관되게 보이게 하려면
픽셀 밀도(dpi) 개념과 측정 단위에 대한 이해가 필요합니다.
안드로이드에서 지원하는 픽셀 밀도
안드로이드는 다양한 화면 크기와 밀도를 가진 기기를 지원하기 위해, 화면 밀도(dpi)에 따라 다음과 같이 분류합니다:
| 밀도 이름 | 배율 | DPI 범위 |
|---|---|---|
| ldpi | 0.75x | ~120dpi |
| mdpi (기준) | 1.0x | ~160dpi |
| hdpi | 1.5x | ~240dpi |
| xhdpi | 2.0x | ~320dpi |
| xxhdpi | 3.0x | ~480dpi |
| xxxhdpi | 4.0x | ~640dpi |

화면 크기는 같지만 픽셀 수는 서로 다른 두 기기를 비교한 이미지입니다.
해상도 차이에 따라 같은 UI 요소도 실제 크기는 다르게 보일 수 있습니다.
같은 크기의 화면이라도 픽셀 수가 다를 수 있습니다. 즉, 해상도가 높은 기기일수록 같은 UI 요소(예: 100px)는 더 작게 표시됩니다.
이는 픽셀 밀도(dpi)의 차이로 인해 발생하며, 같은 px 값을 사용하더라도 실제로 보이는 크기는 기기에 따라 달라질 수 있다는 것을 의미합니다.
왜 알아야 할까요?
안드로이드 기기는 크기와 해상도가 매우 다양합니다.
예를 들어, 같은 100px로 뷰의 크기를 설정했을 때 어떤 기기에서는 작게, 어떤 기기에서는 너무 크게 보일 수 있습니다.
이처럼 픽셀 기준으로 UI를 구성하면 일관성을 유지하기 어렵습니다.
이를 해결하기 위해 안드로이드는 밀도 독립 단위인 dp, sp를 제공합니다.
이 단위들은 기기의 화면 밀도에 따라 자동으로 스케일되어 다양한 기기에서도 동일한 비율의 UI를 구성할 수 있도록 도와줍니다.
또한 디자이너와 협업 시 어떠한 단위로 디자인을 전달해주는지 명확하게 알아야 요구사항을 정확하게 개발할 수 있습니다.
단위별 비교 표
| 단위 | 설명 | 주요 용도 | 밀도 반영 | 사용자 설정 반영 |
|---|---|---|---|---|
| px | 실제 픽셀 | 거의 사용하지 않음 | X | X |
| dp | 밀도 독립 픽셀 | 레이아웃, 뷰 크기 | O | X |
| sp | 스케일 독립 픽셀 | 텍스트 크기 | O | O |
| pt | 1/72인치 고정 단위 | 인쇄용, 웹 | X | X |
| in | 인치 단위 | 물리적 길이 기반 UI | X | X |
| mm | 밀리미터 단위 | 물리적 길이 기반 UI | X | X |
주요 단위별 설명
dp (Density-independent Pixels)
- 안드로이드에서 UI 요소의 크기를 지정할 때 가장 권장되는 단위입니다.
- 기준 밀도(160dpi)에서 1dp는 1px과 같습니다.
- 디바이스의 실제 dpi에 따라 시스템이 자동으로 크기를 조정하여 다양한 해상도에서 일관된 UI를 구현할 수 있습니다.
- 런타임 시 시스템은
dp값을px로 변환하는데, 이때 사용되는 값은density = dpi / 160입니다. - 예를 들어, xhdpi(320dpi) 기기의 density는 2.0이며, 1dp는 2px에 해당합니다.
- 이러한 방식 덕분에 개발자는 dp 단위를 기준으로 UI를 설계하면, 다양한 밀도의 디바이스에서도 균일한 시각적 결과를 얻을 수 있습니다.
- 주 용도: View, Margin, Padding 등 비텍스트 요소
sp (Scale-independent Pixels)
- dp와 마찬가지로 밀도에 독립적이며, 여기에 사용자 폰트 설정(scale) 을 반영한 단위입니다.
- 사용자가 접근성 설정에서 글꼴 크기를 조절했을 때 자동으로 반영됩니다.
- 주 용도: TextView, Compose의 Text 등 텍스트 요소
px (Pixels)
- 실제 화면의 물리적 픽셀 단위로, 해상도에 직접 영향을 받습니다.
- 디바이스마다 다른 결과를 나타낼 수 있어 일반적으로 UI 요소를 이 단위로 설정하는 것은 권장되지 않습니다.
- 주 용도: 이미지 리소스 해상도, 비정형 커스텀 드로잉, 정밀한 좌표 기반 계산이 필요한 경우
단위 변환 공식
dp를 px로 변환하려면 다음 공식을 사용합니다:
px = dp × (dpi / 160)
예: 240dpi(hdpi) 디바이스에서 100dp는 다음과 같습니다:
px = 100 × (240 / 160) = 150px
반대로 px를 dp로 변환하려면:
dp = px × (160 / dpi)
코드 예시 (Kotlin)
val px = TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP,
100f,
resources.displayMetrics
)
밀도 값을 직접 활용한 예시
TypedValue.applyDimension() 외에도 resources.displayMetrics.density를 활용하여 dp 값을 px로 직접 계산할 수도 있습니다:
val density = resources.displayMetrics.density
val px = (100 * density).toInt()
이 방법은 단순한 연산이 필요한 경우나, 커스텀 계산이 필요한 상황에서 유용하게 사용할 수 있습니다.
정리
- 다양한 화면 밀도를 고려한 UI를 만들기 위해 반드시
dp와sp단위를 사용해야 합니다. px단위는 피하는 것이 좋습니다. 다양한 기기에서 UI가 깨지거나 일관성이 무너질 수 있습니다.- 텍스트는
sp를 사용하여 사용자의 접근성 설정(폰트 크기)을 반영할 수 있도록 해야 합니다. dp는 밀도 독립,sp는 밀도 + 사용자 설정 반영 단위입니다.
참고 자료
'Android' 카테고리의 다른 글
| [Android][Compose] remember와 rememberSaveable, 알고 쓰자 (0) | 2025.04.07 |
|---|---|
| [Android][Compose] Jetpack Compose의 padding, offset, Spacer 차이 정리 (0) | 2025.03.29 |
| [Android] 안드로이드 이미지 로딩 라이브러리, 알고 쓰자 (Glide, Coil, Picasso 분석하기) (0) | 2025.03.26 |
| [Android] Android Studio에서 SHA KEY 확인하기 (3) | 2024.12.16 |
| [Android] 안드로이드 Fragment Lifecycle, 알고 쓰자 (2) | 2024.11.19 |