본문 바로가기

Programming/Android

2. 안드로이드 기본 구조의 이해 (4) - 앱 디렉토리와 파일

android studio logo image

 

 

 

이번 아티클에서는 안드로이드 스튜디오에서 앱을 개발하게 될 때, 개발자가 이해해야 하는 파일, 디렉터리 구조를 살펴보도록 하겠습니다. 우선 프로젝트에서 '모듈(앱)' 레벨의 작업이 시작되었을 때 주로 확인해야 하는 폴더는 아래와 같습니다. 

 

{n}:\{폴더명}\{프로젝트명}\{모듈명}\app\src\main

 

 

안드로이드 스튜디오를 실행했을 때를 기준으로 보면, 위 폴더에 있는 파일들 중 개발자와 직접 관련이 되는 리소스 파일들은 다음과 같이 확인이 가능합니다. 

 

 

 

주요 파일들의 이름과 용도를 살펴보자면 다음과 같습니다. 

 

· AndroidManifest.xml : 앱의 메인 환경 파일. 여기서 정의한 대로 앱이 실행되며, 이를 분석하거나 수정하면서 개발을 진행
· java/MainActivity.java : 화면 구성을 위한 액티비티 컴포넌트로, 실제 이 파일 실행을 통해 화면에 UI 출력
· res : 앱의 모든 리소스 파일은 res 폴더 하위에 위치함
· res/drawable : 리소스 중 이미지 파일 저장용 폴더
· res/layout : 리소스 중 UI 구성을 위한 레이아웃 XML 파일 폴더
· res/mipmap : 리소스 중 앱의 아이콘 이미지 
· res/values : 리소스 중 스트링 값 등을 위한 폴더

 

 

 


 

 

 

○ R.java의 이해

 

안드로이드 앱 개발 과정에서 사용하는 모든 리소스 파일은, [.../app/src/main/res] 폴더 안에 저장하게 됩니다. res 하위의 폴더는 이름이 정해져 있기 때문에 임의로 추가할 수 없습니다. 즉, 이미지는 무조건 res/drawble, 레이아웃은 res\layout 폴더에 있어야 하는 것이죠. 비슷한 논리로 하위에 서브 폴더를 만들 수 없습니다. drawable 파일에 이미지 파일이 많다고 해서 서브 폴더를 만들 수 없습니다. 

 

자, 굳이 이런 제약 조건이 생기는 이유는 무엇일까요? 이는 우리가 살펴볼 [R.java]라는 기묘한 파일의 존재 이유와 이어집니다. 주의할 것은, 현재 최신 버전의 안드로이드 스튜디오에서는 이 [R.java] 파일은 [R.jar] 패키지로 관리되고 있습니다. 또한, 경로도 기존 버전에서 알려진 것과 다르게 [.../app/build/intermediates/compile_and_runtime_not_namespaced_r_class_jar/debug/R.jar]에 위치합니다. 현재는 자유롭게 편집할 수 있는 형식은 아니기 때문에, 원리만 이해하시면 됩니다. 

 

 


 

 

 

우리가 안드로이드 스튜디오에서 개발을 진행할 때, 다음과 같은 코드를 자주 만나게 됩니다. 

 

 findViewById(R.id.text_01);
 setContetView(R.layout.activity_main);

 

 

여기서 R이 사용되는데, 이 R의 정체와 원리를 알아보겠습니다. 결론만 얘기하자면 R은 안드로이드 스튜디오에서 개발할 때 사용되는 리소스( /res 폴더 )를 관리하기 위한 파일입니다. 예를 들어, 우리가 res 폴더에 어떤 파일을 하나 추가하게 되면, 그 파일 명으로 된 int 타입 변수가 R에 추가됩니다. 그리고 자바 코드 영역에서는, 해당 변수 명으로 리소스를 지칭하게 되는 것입니다. 구조를 설명하기 위해 가상의 [R.java] 파일을 구성해 보겠습니다. 

 

public final class R {
    public static final class anim {
        public static final int abc_fade_in = 0x7f0978734;
        ...
    }
    
    public static final class layout {
        public static final int activity_main = 0x7f097875114;
        ...
    }
    
    public static final class drawable {
        public static final int ic_launcher_background = 0x77323dadf8d
        ...
    }
}

 

 

R 파일에는 int 타입 변수가 위와 같이 각각의 폴더 명을 기반으로 한 클래스에 선언됩니다. 변수는 결국 '파일 명'을 사용하게 되고, 각각의 하위 폴더명 클래스로 관리되기 때문에 함부로 폴더를 생성하거나 자바의 명명 규칙을 벗어날 수 없는 것입니다. 

 

만일 우리가 drawable 폴더 하위에 ic_test.png라는 파일을 추가한다면, [ic_test = 0x883124...]와 같은 라인이 추가되는 것입니다. 그리고 이때 코드에서는 이 리소스를 다룰 때 [R.drawable.ic_test]라는 변수로 식별해서 사용하게 되는 것입니다.