Android에서 dp와 px 변환하기 (확장 함수로 간단하게 + 사용 시점 정리)
✨ 개요
Android UI 개발에서 가장 많이 다루는 단위는 dp
와 px
입니다.
두 단위는 서로 다른 목적을 가지며, 올바른 상황에 맞게 사용하는 것이 중요합니다.
- dp와 px의 차이점
- 언제 어떤 단위를 써야 하는가?
- 변환 공식 및 Kotlin 확장 함수 구현
1. ✅ dp와 px의 차이점
단위 | 의미 | 설명 | 사용 예 |
---|---|---|---|
dp |
Density-independent Pixel | 디바이스 해상도에 독립적인 단위 | 레이아웃, 마진, 패딩 등 |
px |
Pixel | 실제 디바이스의 픽셀 수 | 애니메이션, 드로잉, OpenGL 등 |
2. ✅ dp 와 px 는 언제 사용하나요?
2.1 dp 는 언제 사용하나요?
- UI 요소의 크기 (뷰 너비/높이, 여백, 패딩 등)
- 다양한 해상도 기기에서 일관된 UI 표현이 필요할 때
2.2. 🔥 px는 언제 사용하나요?
- 픽셀 단위 정밀 제어가 필요한 경우 (캔버스 그리기, 이미지 자르기 등)
- 커스텀 View나 low-level API 사용 시
2.3. 🔥 정리:
레이아웃 설계는 dp, 계산/렌더링은 px를 주로 사용합니다.
3. 🚫 기본 변환 공식
// dp to px
val px = dp * (densityDpi / 160f)
// px to dp
val dp = px / (densityDpi / 160f)
4. 🚫 Kotlin 확장 함수로 변환하기
4.1 Context 기반 확장 함수
fun Context.dpToPx(dp: Float): Float {
return dp * resources.displayMetrics.density
}
fun Context.pxToDp(px: Float): Float {
return px / resources.displayMetrics.density
}
4.2 Int 확장 버전
val Int.dp: Int
get() = (this * Resources.getSystem().displayMetrics.density).toInt()
val Int.px: Int
get() = (this / Resources.getSystem().displayMetrics.density).toInt()
val padding = 16.dp
val textSizeInDp = 32.px
5. dp vs px
항목 | dp (density-independent pixel) | px (pixel) |
---|---|---|
단위 기준 | 기준 밀도(160dpi)를 기준으로 계산 | 실제 디바이스의 물리적 픽셀 |
해상도 독립성 | ✅ 해상도에 관계없이 일정한 크기 유지 | ❌ 기기 해상도에 따라 크기 달라짐 |
주 사용 용도 | 레이아웃 크기, 패딩, 마진, 높이 등 UI 설계 | 드로잉, 커스텀 뷰, 이미지 처리 등 |
주요 API 대상 | setPadding() , layoutParams 등 |
Canvas , Bitmap , Paint 등 |
코드 변환 필요 여부 | 필요 (dp → px 변환 필요) | 일반적으로 바로 사용 |
가독성/유지보수 | ✅ 설계 가독성 및 재사용성 높음 | ❌ 해상도별 보정 필요, 유지보수 어려움 |
6. 결론
Android UI에서는 dp를 기본 단위로 사용하고, 특정 상황에서는 px 단위 변환이 필요합니다.
- Kotlin 확장 함수를 활용하면 가독성 좋고 재사용 가능한 변환 코드를 만들 수 있습니다.
- 다양한 해상도 기기에서 안정적인 UI를 구현하려면, dp 중심 설계 → px 연산 변환이 정석입니다.