Resources

  • anim : 화면 전환 등에서 애니메이션 효과를 주는 리소스
  • drawable : 정적인 이미지 파일 혹은 View에 적용할 리소스
  • layout : Activity, Fragment, Dialog, Custom View 등의 레이아웃 리소스
  • menu : 리본 메뉴 등을 눌렀을 때 표시될 메뉴 목록을 구성하는 리소스.(문자열 외에 항목마다 표시될 이미지나 옵션을 지정할 수 있음)
  • mipmap : 어플 런처 아이콘 이미지 리소스
  • values : 문자열이나 값(dp, sp, etc)과 관련한 리소스 파일을 모아놓은 디렉터리. 모든 값들이 key-value 형태로 이루어져 있다는 특징이 있으며 여기서 설정한 key값을 통해 자바 코드에서 value 값을 추출해 사용한다.
    - strings.xml : 단순 문자열을 관리
    - arrays.xml : 관련있는 문자열의 집합을 관리
    - colors.xml : 색상값 관리
    - dimens.xml : 공통적, 자주 사용되는 폰트 사이즈나 View의 widh, height 사이즈 등을 관리 
  • values/themes : 어플리케이션에서 사용할 테마 리소스를 관리하는 디렉터리
    - themes.xml : 사용자 시스템 모드가 기본 모드(라이트 모드)일 경우 적용할 테마

    - themes.xml (night) : 사용자 시스템 모드가 다크 모드일 경우 적용할 테마

 

주요 Resource 파일

strings.xml, arrays.xml

string.xml에 기본적으로 등록된 리소스

 어플 내에서 사용되는 문자열 관련 리소스를 관리한다. 여기서 key-value 형태로 문자열 리소스들을 작성한 뒤 문자열이 필요할 때 key값을 통해 문자열을 추출한다. 사실 과제물 정도의 작은 프로젝트를 하고 있다면 이 작업은 매우 귀찮은 작업으로 보일 수 밖에 없다. 이 파일을 활용하지 않아도 문자열을 출력할 수 있음에도  굳이 이 파일을 써야 하는 이유는 무엇일까?

 

 프로젝트를 하다 보면 어플리케이션에서 사용하는 리소스 중 서버에서 받아오는 데이터가 있는가 하면 어플 이름, 비상 연락망(119, 112 등) 등과 같이 좀처럼 바뀔 일이 없기에 처음부터 정해져 있는 데이터도 있다. string.xml의 존재를 모른다면 이러한 데이터들은 대부분 java 코드 내에 하드 코딩되기 마련이다. 안드로이드에서는 이러한 하드 코딩을 권장하지 않고 있으며 이러한 정적인 데이터들은 리소스 파일(*.xml)에 작성한 뒤 자바 코드에서 추출해 사용하는 것을 권장하고 있는데 그 이유는 다음과 같다.

 

  • 지역화(Localization) : 지역화(또는 글로벌화)란 사용자의 언어 설정에 맞게 어플리케이션이 다양한 언어를 제공하는 것을 말한다. 즉 UI에 표시될 리소스(문자열 등)들이 사용자의 언어 설정에 따라 다르게 표시된다는 것인데 이를 가능하게 하려면 하드 코딩이 아닌 각 언어에 맞는 xml 파일을 생성하여 유동적으로 데이터를 읽어와야 한다.
  • 자원의 재사용 : 하드 코딩된 데이터가 여러 곳에서 공통적으로 사용되어야 하는 경우를 생각해보자. 배열을 멤버 변수로 지정한 뒤 접근 제한자를 public으로 하거나 정적 자원(static)으로 설정하여 자원을 공유하는 방법과 같은 코드를 두 개 이상의 클래스에 복사해 각각 사용하는 방법을 떠올릴 수 있다. 전자는 코드를 복잡하게 만들며 후자는 중복된 코드를 생성하기에 그다지 좋은 방법으로 볼 수 없다. 반면 xml에 문자열을 등록한 뒤 추출하여 사용하면 여러 곳에서 자원을 공유할 수 있다.
  • 관리의 용이성 : 하드 코딩된 데이터를 수정해야 한다고 생각해보자. 프로젝트의 규모가 크면 클수록 수정할 데이터를 가진 클래스를 찾기 어려울 것이고 작성한지 시간이 지난 프로젝트일수록 그 난이도는 올라갈 것이다. 반면 xml에서 모든 리소스를 관리하게 되면 UI에서 본 단어를 검색하는 것으로 빠르게 리소스를 찾고 수정할 수 있다.

 

 문자열 리소스 파일을 사용해야 하는 이유를 세 가지 나열했지만 강제성을 발휘하는 것은 지역화 뿐이다. 지역화만큼은 언어 별로 리소스를 따로 관리하지 않으면 불가능하기 때문이다. 다른 두 가지는 만들고 있는 프로젝트의 규모가 작으면 작을 수록 메리트가 없다고 느끼겠지만 프로젝트의 규모가 커질 수록 큰 메리트로 작용한다.

 

 

 

colors.xml

검은색

 안드로이드에서 색상을 사용하려면 #과 함께 16진수 색상 코드 6자리를 포함한 총 7자리를 입력해야 한다.

 

55% 투명도가 적용된 검은색

 여기에 추가로 투명도를 주게 되면 # 다음 2자리 코드가 추가되기 때문에 총 9자리를 사용해야 하는데 아무리 자주 사용하는 색상의 코드라 해도 이를 모두 외우기는 어렵다. 또한 특정 색상이 여러 곳에서 공통적으로 사용되는 경우 매번 코드를 복사/붙여넣기 해야 하고 어플의 색상 컨셉을 바꾼다고 하면 이 코드가 사용된 모든 코드를 찾아 변경해줘야 하는 불편함이 있을 수 밖에 없다.

 

color.xml
color.xml에 등록된 색상 사용

 위와 같은 이유로 우리는 color.xml 파일을 사용하여 색상 코드와 관련된 리소스를 관리한다. 각 색상 코드에 대해 이름(key)을 부여한 뒤 실제로 사용할 땐 코드가 아닌 이름을 사용하는 것으로 코드를 사용할 때보다 훨씬 직관적이고 편하게 사용할 수 있다.

 

 

 

themes.xml

 이 파일에는 어플 전체의 테마나 각 View에 대한 커스텀 테마를 생성할 수 있다. 예를 들어 어플의 모든 버튼에 하늘색 배경과 빨간색 폰트를 적용하고 싶다면 적용이 필요한 View를 가진 모든 레이아웃 파일을 수정하고 다녀야 할 것이다.

 

theme.xml
button에 style 적용

 이러한 경우 테마를 활용하면 일종의 템플릿을 만들어 두고 모든 View에 한 번에 적용하는 것이 가능해진다. 여러 뷰에서 공통적으로 사용하는 속성을 테마에 작성한 뒤 각 뷰의 style로 지정해주면 중복되는 코드들을 없앨 수 있고 수정/관리 측면에서 매우 효율적이다.

 

 테마를 다루는데 있어서 중요한 것 중 하나는 라이트 모드와 다크 모드의 테마 파일을 구분하는 것이다. View에 스타일을 적용할 때 현재 테스트 중인 기기의 기본 설정이 다크 모드일 경우 아래 파일을, 라이트 모드일 경우 위 파일에서 불러오게 된다. 한쪽에만 작성한다고 해서 오류가 나진 않지만 작성하지 않은 모드에서는 스타일이 적용되지 않으므로 주의해야 한다.

 

 


 

 

 나는 안드로이드를 시작했을 무렵 이 파일들을 쓰지 않았다. 구글링을 통해 이 파일들이 어떤 파일인지는 정도는 인지하고 있었지만 과제물같은 작은 프로젝트를 만드는데 이런 작업은 불필요하다고 생각했기 때문이다. 하지만 포트폴리오와 관련된 프로젝트들을 만들면서 파일의 수가 점점 늘어나게 되니 리소스 관리는 꼭 필요하다고 느끼고 있고 지금은 최대한 활용해보려 노력하고 있다.

+ Recent posts