px, dp, dpi, cm

이미 알고 있는 내용이지만, 시작하기 전에 단위를 간단하게 정리부터 해보자.

  • dp : 안드로이드에서 사용하는 가상의 단위이다. (오차가 있을 수 있으나, 최대한)같은 dp가 단말의 해상도나 화면 크기에 상관 없이 같은 물리적 길이를 갖는다.
  • px : 물리적 해상도를 표시하는 단위 픽셀(Pixel)이다. 개발자 뿐 아니라 컴퓨터 사용자에게 가장 친숙한 단위다. 아이폰을 비롯한 다양한 모바일 기기들이 px 단위를 사용해 GUI를 개발했다.
  • dpi(Dot Per Inch) : 1인치당 도트의 갯수다. 밀도(density)를 잴 때 쓴다. 숫자가 크면 밀도가 높고, 고화질로 보인다.
  • cm(Centimeters) : 모두다 아는 물리적인 길이를 재는 단위다.

dp와 px, dpi의 관계는 어떻게 되나?

간략하게 식으로 표현해보자. 단말의 sw(small width)를 구한다면,

단말 sw의 px / ( 단말의 dpi / 160(mdpi의 dpi) ) = 단말 sw의 dp

이다. 이를 최신 단말로 계산해보자. 얼마 전에 출시된 S6를 예로 들면

1440px / ( 640dpi / 160dpi ) = 360dp

가 되겠다.

헷갈리는 dp는 왜 쓰는건가?

다양한 해상도와 다양한 크기의 단말을 지원하기 위해, 새로운 단말이 나올 때마다 테스트하고 새로 앱을 만들어야 한다면 매우 번거로울 것이다. 이를 해결하기 위해, 애플은 단말들의 해상도를 거의 바꾸지 않는다. 안드로이드는 이를 dp를 통해 해결하고 있다. 결론만 이야기하면, 같은 dp를 가진 앱 내 이미지나 글자는 단말의 해상도나 화면 크기에 관계 없이 사용자 입장에서 (거의) 같은 물리적 크기로 보이도록 안드로이드 시스템이 자동으로 처리해준다.

이미지를 예로 들면, 먼저 개발자가 미리 다양한 크기의 같은 이미지를 포함하여 앱을 만든다. 그 후 사용자 단말의 밀도가 높아질 수록 더 큰 이미지를 이용해 화면에 표시하고, 반대로 밀도가 작아질 수록 더 작은 이미지를 사용해 화면에 표시 한다.

mdpi는 4의 배수다?

mdpi는 4의 배수를 사용하는 것이 좋기 때문이다. hdpi는 mdpi 대비 1.5배, ldp는 0.75배이다. 만약 mdpi가 4의 배수가 아니라면, hdpi와 mdpi는 소수점 자리를 갖게 되고, 물리적 기기 제작이 어려워진다. 예를 들면,

  • mdpi가 160이라면, hdpi = 240, ldp=120
  • mdpi가 163이라면, hdpi = 244.50, ldp = 122.25

가 된다.

small width가 중요할까?

중요하다. 우리가 사용하는 단말은 세로로 길고, 위-아래 방향으로 스크롤하면서 컨텐츠를 확인하기 때문이다. 자세히 설명하면, 사용자가 가로 스크롤은 불편하기 때문에 보통 컨텐츠의 가로는 100%로 고정하고 제작하기 때문이다.

dpi 값이 단말 실측한 값과 다른 경우가 있던데?

있다. 이론은 간단하지만, 단말을 제작하는 현실은 녹록하지 않다. 실제 단말을 제작하는 과정에서 액정의 물리적인 특성으로 인해 인치 당 픽셀 갯수가  예상한 것보다 1 픽셀 모자라거나 더 들어갈 수도 있다. 그럼, xxxhdpi 단말의 dpi가 639나 641이 될 수도 있는 것이다. 이런 문제를 제어하기 위해 dpi 값은 제조사에서 시스템의 프로퍼티에 가장 적당한 값을 정해서 넣는다.

단말의 dpi를 제조사에서 어떻게 설정했는지는 아래와 같은 adb shell을 통해 확인할 수 있다.

> adb shell getprop ro.sf.lcd_density
640

위에서 언급한 것처럼 639나 641을 정도를 보정하기 위해 640로 입력하기도 한다. 하지만 가끔 실제 단말 측정시에는 600dpi 정도인데, 640으로 입력하는 것처럼 무슨 생각으로 이렇게 했는지 싶을 정도로 단말의 물리적 조건과 dpi 값이 오차가 있는 경우도 있다.

안드로이드에서 가이드하는 밀도 단위는 왜 xxxhdpi까지 있을까?

일반적으로 사람이 도트로 인한 계단 현상을 느끼는 정도가 300 ppi 라고 한다. 현재 출시된 xxxhdpi 단말은 대부분 300ppi를 넘는다. 물론 예민한 사람들은 더 높은 밀도를 가진 단말을 원할 수도 있겠지만, 화면의 크기가 커지거나 혹은 밀도가 높아질 수록 cpu 파워나 배터리 사용량, 또한 가격이 상승하므로 해상도 경쟁이 저 정도에서 잦아들었기 때문일 것이다. 만약, 눈이 아주 좋은 신인류가 나타나거나 또 다른 필요에 의해 더 높은 밀도를 가진 단말이 출시된다면 xxxxhdpi 같은 또다른 가이드가 추가될지도 모르겠다.

참고로, 안드로이드에서 가이드하는 밀도는 아래와 같다.

dpi예제

하지만, 간혹 560dpi 처럼 애매한 값을 가지는 단말도 있다. 이 때는, 자기보다 하위 리소스 폴더인 xxhdpi를 참조하지 않고, 상위인 xxxhdpi를 참조한다.

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.