- 리소스 활용하기
안드로이드 프로그래밍은 리소스를 많이 이용한다는 특징이 있습니다.
layout, drawable 이외에도 많은 리소스를 등록하고 활용합니다.
단순히 res 디렉토리에 리소스 파일을 만들고 R 파일을 이용해 코드에서 참조하는 것 이외에 플랫폼 리소스도 있으며, 어떤 리소스를 특정 환경에 적용할지 명시하는 방법도 있습니다.
활용 조건 명시와 기기 크기와 호환하는 앱 개발을 위해 신경써야 하는 부분에 대해 알아봅니다.
09-1 리소스의 종류와 특징
리소스(Resource)란 정적인 자원을 뜻합니다.
앱이 동작하면서 변경되지 않는 콘텐츠는 리소스로 분리해서 외부 파일로 만들어 이용할 수 있습니다.
앱에서 이요하는 리소스는 앱 리소스와 플랫폼 리소스로 구분됩니다.
앱 리소스 사용하기
개발자가 직접 추가한 리소스를 의미합니다.
res 디렉토리와 하위 drawble, layout, mipmap, values 4개 디렉토리에 개발자가 리소스 파일을 만듭니다.
이 외에도 리소스 파일의 종류는 더 많습니다.
안드로이드 앱에서 이용되는 리소스의 종류는 아래와 같습니다.
| 디렉토리명 | 리소스 종류 |
| animator | 속성 애니메이션 XML |
| anim | 트윈 애니메이션 XML |
| color | 색상 상태 목록 정의 XML |
| drawable | 이미지 리소스 |
| mipmap | 앱 실행 아이콘 리소스 |
| layout | 레이아웃 XML |
| menu | 메뉴 구성 XML |
| raw | 원시 형태로 이용되는 리소스 파일 |
| values | 단순 값으로 이용되는 리소스 |
| xml | 특정 디렉토리가 정의되지 않은 나머지 XML 파일 |
| font | 글꼴 리소스 |
디렑토리와 파일은 이름을 지을 때 규칙이 있습니다.
위 표의 리소스 디렉토리명은 고정이며 임의로 이름을 붙인 디렉토리를 만들 수 없고 하위 디렉토리 역시 추가할 수 없습니다.
파일명은 values에 추가하는 파일들을 제외하면 자바의 이름 작성 규칙을 지켜야 하며 알파벳 대문자를 사용할 수 없습니다.
R 파일에 식별자로 등록해서 이용하기 때문입니다.
레이아웃 리소스 - layout 디렉토리
화면을 구성하는 레이아웃 XML파일을 저장하는 디렉토리입니다.
이미지 리소스 - drawable 디렉토리
이미지 리소스를 저장하는 디렉토리 입니다. png, jpg, gif, webp 파일이 저장됩니다.
XML로 작성한 이미지도 저장할 수 있습니다.
XML 이미지를 만들 때 사용되는 태그는 아래와 같습니다.
| 태그 | 설명 |
| <shape> | 도형을 의미하며 android:shape="rectangle"처럼 속성을 이용해 도형의 타입을 지정. rectangle, oval, line, ring 중 선택 가능 |
| <corners> | 둥근 모서리를 그리는 데 사용, shape값이 rectangle 일 때만 적용 |
| <gradient> | 그라디에션 색상 지정 |
| <size> | 도형의 크기 지정 |
| <solid> | 도형의 색상 지정 |
| <stroke> | 도형의 윤곽선 지정 |
실행 아이콘 리소스 - mipmap 디렉토리
앱의 실행 아이콘의 이미지 리소스가 저장되는 디렉토리입니다.
값 리소스 - values 디렉토리
문자열, 색상, 크기, 스타일, 배열 등을 XML로 저장할 수 있습니다.
layout 디렉토리에 activity_main.xml 파일은 R.layout.activity_main으로 이용합니다.
그런데 values 디렉토리에 있는 R 파일에 식별자로 등록되지 않고 파일에 값을 지정한 태그의 name 속성값이 등록됩니다.
따라서 values 디렉토리에 생성되는 color.xml, strings.xml등의 파일명은 권장할 뿐 자유롭게 정할 수 있으며 알파벳 대문자를 이용할 수도 있습니다.
<resources>
<string name="app_name">AppName</string>
<string name="txt_data1">Hello</string>
<string name="txt_data2">World</string>
</resources>
strings.xml파일에 위처럼 작성했따면 name 속성의 값이 R파일에 식별자로 기록되어 레이아웃 XML과 코드에서 다음처럼 이용할 수 있습니다.
<TextView
andorid:id="+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/txt_data1/>
binding.textView.text=getString(R.string.txt_data2)
이 외에도 색상, 크기, 스타일 등이 있는데 색상 리소스는 color 태그로 등록, 크기 리소스는 dimen 태그로 등록하고 아래와 같ㅇ ㅣ사용합니다.
<Textview
...
android:textColor="@color/txtcolor"
android:textSize="@dimen/text_size"/>
binding.textView.text=getString(R.string.txt_data2)
binding.textView.setTextColor=(ResourcesCompat.getColor(resources, R.color.txt_color, null))
binding.textView.textSize = resources.getDimension(R.dimen.txt_size)
스타일 리소는 style 태그로 등록합니다. 여러 속성을 스타일로 등록해 한꺼번에 적용하거나 중복되는 속성을 스타일로 정의해 재사용하는 용도로 쓰입니다.
<resources>
<style name="MyTextStyle">
<item name="android:textSize">@dimen/txt_size</item>
<item name="anroid:textColor">@color/txt_color</item>
</style>
<style name="MyTextStyleSub" parent="MyTextStyle">
<item name="android:textColor">#0000FF</item>
<item name="android:background">@color/txt_bg_color</item>
</style>
</resources>
MyTextStyle을 적용하면 스타일 두개 적용, MyTextStyleSub를 적용하면 parent와 맞물려 속성 세개가 적용됩니다.
<Textview
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/MyTextStyleSub"
android:text="Hello World"/>
위와 같이 사용해 적용할 수 있습니다.
색상 리소스 - color 디렉토리
color 디렉토리에는 색상 리소스를 등록합니다.
색상 리소스는 values 디렉토리에 <color>태그로 등록할 수 있는데 왜 별도의 디렉토리가 있을까요 ?
color 디렉토리의 리소스는 특정 뷰의 상태를 표현하고, 그 상태에 적용되는 색상을 등록할 때 사용합니다.
예를 들어, 어떤 버튼을 눌렀을 때와 누르지 않았을 때의 색상을 리소스로 등록하고자 할 때, 버튼의 상태에 다른 색상을 하나의 XML에 등록해 적용하면 더 편리합니다. 이 때 color 디렉토리를 사용합니다.
<selector xmls...
<item
android:state_pressed="true"
android:color="#ffff0000"/>
<item
android:state_focused="true"
android:color="#ff0000ff"/>
<item android:color="#ff000000"/>
</selector>
뷰를 눌렀을때와 뷰에 포커스가 주어졌을 때를 의미하는 색상을 지정하고, 각 상태의 기본 색상을 지정했습니다.
뷰에 등록해 사용할 때는 다음과 같습니다.
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Click Me !!"
android:textColor="@color/button_text"/>
글꼴 리소스 - font 디렉토리
font 디렉토리는 글꼴 리소스를 저장합니다. 이곳에 TTF나 OTF 파일을 저장한 후 글꼴을 적용할 뷰에서 이용합니다.
<TextView
...
android:fontFamily="@font/pacifico"/>
플랫폼 리소스 사용하기
앱 리소스 외에 안드로이드 플랫폼이 제공하는 리소스가 있습니다.
스튜디오 프로젝트 탐색 창에서 보기 옵션을 [Packages]로 설정 후 [Libraries]항목을 살펴보면 확인할 수 있습니다.

플랫폼 리소스도 R 파일의 식별자로 이용할 수 있습니다.
그러나 앱 리소스가 아니라서 R 파일이 아니라서 android.R 이라는 플랫폼 라이브러리의 R 파일로 등록되어있습니다.
binding.imageView.setImageDrawable(ResourcesCompay.getDrawable(resources,
android.R.drawable.alert_dark_frame, null))
binding.textView.text=getString(android.R.string.emptyPhoneNumber)
XML에서 앱 리소스는 @기호로 R파일의 리소스를 이용했습니다.
플랫폼의 리소스를 XML 파일에서 이용할 때는 @android:패턴으로 사용합니다.
@android:drawable/save 와 같은 형식으로 사용합니다.
09-2 리소스 조건 설정
리소스를 특정 환경에서 적용되도록 설정하는 것을 말합니다.
만약 기기마다 화면 크기가 달라지면 특정 이미지가 선명하게 나오지 않는 문제가 발생합니다.
기기별 실행 아이콘 크기는 다음과 같습니다.
| 화면 밀도 | 크기 |
| XXXHDPI | 192 * 192 |
| XXHDPI | 144 * 144 |
| XHDPI | 96 * 96 |
| HDPI | 72 * 72 |
| MDPI | 48 * 48 |
따라서 보통 앱을 개발할 때에는 아이콘을 5개씩 준비해야 합니다.
그런데 모두 같은 이름으로 저장할 수 없어 디렉토리 이름 뒤에 붙임표(-)와 조건을 추가합니다.
- mipmap-mdpi/ic_launcher.png
- mipmap-hdpi/ic_launcher.png
- mipmap-xhdpi/ic_luancher.png
- ...

리소스 디렉토리명에 지정할 수있는 조건은 다음과 같습니다.
| 조건 | 예시 | 설명 |
| MCC 및 MNC | mcc310 mcc310-mnc004 |
이동통신 국가 코드(MCC)와 선택적으로 이동통신 네트워크 코드(MNC) 추가 가능. mcc310(미국), mcc310-mnc004(버라이즌) |
| 언어 및 지역 | en ko-rKR |
ISO639-1 언어 코드이며 선택적으로 뒤에 나올 소문자 r을 추가해 ISO3166-1-alpha-2의 지역 코드가 나올 수 있음 |
| 레이아웃 방향 | ldrtl ldltr |
히브리어처럼 우→좌 로 쓰는 언어의 레이아웃 이용 ldrtl은 우에서 좌, ldltr은 좌에서 우 방향 레이아웃 |
| 더 작은 쪽 | sw320dp | 화면 방향과 상관없이 화면의 높이와 너비 중 작은 쪽에 대한 조건을 의미 sw320dp 이면 너비든 높이든 상관없이 작은 쪽의 치수가 320dp 인경우를 의미 |
| 이용 가능한 너비 | w720dp | 화면 너비에 대한 조건. w720dp이면 너비가 720 인 기기 |
| 이 외의 다양한 조건을 아래 문서에서 확인 가능 https://developer.android.com/guide/topics/resources/providing-resources?hl=ko#AlternativeResources |
||
이런 다양한 조건을 어느 리소스 디렉토리에 적용할 지는 개발자의 선택에 달렸습니다.
예를 들어 언어 조건은 values디렉토리에 적용해 values-ko-rKR로, drawable 디렉토리에 적용해 drawable-ko-rKR로 사용할 수 있습니다.
이어 붙여 여러 조건을 지정해도 됩니다.
그러나 위 표의 순서대로 조건을 지켜야 합니다.
화면 회전에 대응하기
화면 회전에 대응하려면 가로와 세로 방향일 때 출력할 레리아웃 XML 파일을 각각 준비해야 합니다.
그리고 어느 방향에서 어떤 XML을 출력할지 지정해야 하빈다.
이를 리소스 조건으로 설정해 처리하면 편리합니다.
가로, 세로 방향에 적용할 레이아웃 XML 파일을 만들고 각 리소스 디렉토리명에 조건을 명시해 저장합니다.
세로방향 xml파일은 layout 디렉토리에, 가로방향 xml 파일은 layout-land 디렉토리에 저장합니다.
국제 언어 제공하기
이 부분도 리소스 조건 설정으로 처리합니다.
strings.xml 파일에 <string> 태그로 문자열 리소스를 작성하는데, 파일을 여러개 만들어서 각 언어에 맞는 리소스 문자열을 담고 어느 XML 파일을 적용해야 하는지를 리소스 디렉토리명으로 지정하면 됩니다.
<resources>
<string name="app_name">TextEnglish</string>
<string name="intro">Hello</string>
</resources>
<resources>
<string name="app_name">테스트</string>
<string name="intro">안녕하세요</string>
</resources>
문자열 리소스는 values 디렉토리의 리소스이므로 식별자는 파일명이 아니라 태그의 name 값입니다.
따라서 각 파일에 문자열을 등록할 때 name값은 같아야 합니다.
09-3 폰 크기의 호환성
폰 크기의 호환성은 안드로이드 시스템에서 도와주는 부분이 있고 개발자가 직접 해결해야 하는 부분이 있습니다.
논리적인 단위 알아보기
| 크기 | 설명 |
| ldpi | 저밀도 화면 ~120dpi |
| mdpi | 중밀도 화면 ~160dpi |
| hdpi | 고밀도 화면 ~240dpi |
| xhdpi | 초고밀도 화면 ~320dpi |
| xxhdpi | 초초고밀도 화면 ~480dpi |
| xxxhdpi | 초초초고밀도 화면 ~640dpi |
위 표처럼 기기의 크기를 구분해 콘텐츠의 크기를 늘리거나 줄이도록 안드로이드 시스템이 돕습니다.
하지만 이 도움을 받으려면 개발자가 콘텐츠의 크기를 지정할 때 논리적인 단위를 사용해야 합니다.
앱 개발시 크기 지정에 사용할 수 있는 단위는 다음과 같습니다.
- dp(dpi: density-independent pixels): 스크린의 물리적 밀도에 기반을 둔 단위
- sp(sip: scale-independent pixels): dp와 유사하며 글꼴 크기에 적용
- pt(points): 스크린 크기의 1/72를 1pt로 함
- px: 픽셀
- mm: 밀리미터
- in: 인치
화면 정보 가져오기
안드로이드 시스템은 기본으로 크기 호환성을 지원하지만 때로는 개발자가 직접 코드에서 조정할 수도 있습니다.
이때 기기의 크기 정보를 가져오기위해 API를 사용합니다.
30 이전 버전에서는 DisplayMetrics로 크기 정보를 가져왔지만, 이 후부터는 WindowMetrics를 이용해야 합니다.
아래는 버전에 따라 다르게 적용하는 예시입니다.
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.R){
val windowMetrics: WindowMetrics = windowManager.currentWindowMetrics
binding.textView.text = "width: ${windowMetrics.bounds.width()}, hieght:
${windowMetrics.bounds.height()}"
}else{
val display = windowManager.defaultDisplay
val displayMetrics = DisplayMetrics()
display?.getRealMetrics(displayMetrics)
binding.textView.text =
"width: ${displayMetrics.widthPixels}, height: ${displayMetrics.heightPixels}"
}
Build.VERSION.SDK_INT는 앱이 실행되는 기기의 버전값이며 Build.VERSION_CODES.R은 안드로이드 11버전, API 레벨30을 의미합니다.
09-4 메신저 앱의 인트로 화면 만들기
(실습)




'Java > Kotlin' 카테고리의 다른 글
| Kotlin Programming Study - 08 (0) | 2025.12.17 |
|---|---|
| Kotlin Programming Study - 07 (0) | 2025.12.16 |
| Kotlin Programming Study - 06 (0) | 2025.12.15 |
| Kotlin Programming Study - 04 (0) | 2025.12.10 |
| Kotlin Programming Study - 03 (0) | 2025.12.09 |





