앱 구성 파일 분석

Ted_Moon99·2024년 6월 15일
0

Android

목록 보기
2/4
post-custom-banner

1. 프로젝트의 폴더 구성 알아보기

Android앱 프로젝트를 만들면 많은 폴더와 파일이 생성된다. 하지만 대부분은 빌드 도구와 관련된 것이며 개발자가 관심을 두어야 할 파일은 프로젝트 폴더에서 [Module명 -> src -> main]안에 존재한다.

참고로 안드로이드 스튜디오의 프로젝트 탐색 창은 모든 폴더와 파일을 보여주지 않는다. 개발자가 분석하거나 작성해야 하는 폴더와 파일만 보여준다.

프로젝트를 만들면 app이라는 Module이 자동으로 생성된다. Module 하나가 app 하나이며 프로젝트는 여러 모듈을 묶어서 관리하는 개념이다.

하나의 프로젝트에는 자동으로 만들어지는 app Module 이외에 여러 모듀을 추가할 수 있다. Module은 App 단위이므로 새로운 Module을 추가한다는 것은 새로운 App을 개발하는 것과 같다.

2. 모듈의 폴더 구성 알아보기

이름설명
build.gradle빌드 설정 파일
AndroidManifest.xml앱의 메인 환경 파일
res리소스 폴더
activity_main.xml레이아웃 XML 파일
MainActivity.kt메인 액티비티 파일

2.1 그래들 빌드 설정 파일(build.gradle)

그래들(gradle)은 안드로이드 앱의 빌드 도구이다.

그래들의 설정 파일이 바로 build.gradle이다.

build.gradle파일은 안드로이드 스튜디오의 탐색 창에서 코끼리 모양의 아이콘이 있는 Gradle Scripts에서 찾을 수 있다.

탐색 창을 보면 build.gradle 파일은 2개가 존재한다. 하나는 프로젝트 수준의 그래들 파일이고, 다른 하나는 모듈 수준의 그래들 파일이다. 모듈은 앱을 의미하므로 대부분의 빌드 설정은 모듈 수준의 그래들 파일에 작성을 하게 된다.

프로젝트 수준의 그래들 파일build.gradle.kts(Project: Component_Practice)

모듈 수준의 그래들 파일build.gradle.kts(Module: app)

  • 플러그인 선언
plugins {
    alias(libs.plugins.android.application)
    alias(libs.plugins.jetbrains.kotlin.android)
}

위의 코드는 플러그인을 선언한 것이다. 기본적으로 com.andoid.applicationkotlin-android 플러그인이 선언되어 있으며, 필요에 따라 추가한다.

  • 컴파일 버전 설정

이 코드는 앱을 컴파일하거나 빌드할 때 적용할 버전을 설정한다. compileSdk 34로 지정되어 있으면 안드로이드 SDK34 버전을 적용해서 컴파일하라는 의미이다.

  • 앱의 식별자 설정

applicationId는 앱의 식별자를 설정ㅇ한다. 이곳에 지정한 문자열은 앱의 식별자가 되므로 고유한 문자열로 지정해야 한다. 만약 구글의 플레이 스토어에 등록된 어떤 앱이 똑같은 식별자를 이미 사용하고 있다면 이 앱은 플레이 스토어에 등록될 수 없다. 또한, 스마트폰에 식별자가 똑같은 앱이 설치되어 있다면 이 앱은 설치되지 않는다.

  • SDK 버전 설정

targetSdk는 개발할 때 적용되는 SDK 버전이다. 34로 지정하면 34 버전의 SDK 로 개발한다는 의미이다.

minSdk는 이 앱을 설치할 수 있는 기기의 최소 SDK 버전을 의미하는데, 최대한 많은 사용자를 수용하기 위해서는 최소 SDK는 낮을수록 좋다.

물론 최대한 많은 사용자를 모집하기 위해서 minSdk를 1로 설정할 수도 있지만 하위 버전에서도 오류가 발생하지 않도록 개발하는 하위 호환성이 좋아야 하는데 이는 그렇게 쉬운 작업은 아니다

  • 앱의 버전 설정

앱의 버전을 설정한다. 초기값은 1이지만 앱이 사용자의 스마트폰에 설치되어 이용되다가 업데이트될 때 이 버전을 올려 다시 배포한다

  • 컴파일 옵션

개발 언어의 버전을 설정한다. 참고로 자바 버전 선언을 생략하면 기본으로 1.6이 적용된다.

  • 라이브러리 설정

targetSdk에 명시한 안드로이드 SDK는 기본으로 적용되지만 그 외에 개발자가 추가하는 오픈소스 라이브러리구글의 adnroidx 라이브러리SDK 라이브러리가 아닌 것들은 모두 dependencies에 선언해야 한다.

실제 개발할 때에는 dependencies에 많은 라이브러리를 선언한다. 즉, 안드로이드 앱은 보통 안드로이드 SDK 라이브러리만으로 개발하지는 않는다.

2.2 메인 환경 파일(매니패스트 파일)

AndroidManifest.xml은 안드로이드 앱의 메인 환경 파일이다. 안드로이드 시스템은 이 파일에 설정한 대로 사용자의 폰에서 앱을 실행한다. 즉, 매니페스트 파일은 개발부터 실행까지 중요한 역할을 한다.

  • 네임스페이스 선언

manifest는 매니페스트 파일의 루트 태그이다. xmlns는 XML의 네임스페이스 선언이며 URL이 http://schemas.android.com/apk/res/android로 선언되었다면 안드로이드 표준 네임스페이스이다.

application 태그는 앱 전체를 대상으로 하는 설정이다.

application 태그에는 앱의 아이콘을 설정하는 icon 속성이 있는데, 이곳에 지정한 이미지가 앱을 설치한 사용자의 폰에 보이는 실행 아이콘이다. res/mipmap/ic_launcher.png 파일을 의미한다.

label 속성에는 앱의 이름을 등록한다. res/values/strings.xml 파일에 app_name으로 등록된 문자열 리소스를 가리킨다.

theme 설정은 앱에 적용하는 테마를 설정하는 것으로 res/value/themes.xml 파일에 존재하는 Theme.ComponentPractice 이름으로 선언한 테마를 적용하겠다는 의미이다.

  • Component 선언

Android 앱 개발의 특징에서 보는 것처럼 안드로이드 Component는 Android System에서 생명주기를 관리한다.

Android System은 Manifest 파일에 있는 대로 앱을 실행한다. 따라서 Component는 Manifest 파일에 등록을 해야 시스템이 인지할 수 있다.

Component 하나당 태그 하나로 등록한다

Component태그
액티비티<activity>
서비스<service>
브로드캐스트 리시버<receiver>
콘텐츠 프로바이더<provider>

액티비티를 등록할 때 필수 속성은 name이다. name 속성에는 클래스 이름을 등록한다.

예를 들어 name=".MainActivity"라고 했다면 MainActivity 클래스를 액티비티로 등록하겠다는 의미이다.

클래스 이름 앞에 있는 점(.)은 해당 클래스가 <manifest> 태그에 등록한 package 경로에 있다는 의미이다.

<intent-filter> 태그는 생략할 수 있다. 이에 대한 내용은 추후에 작성하도록 하겠다.

2.3 리소스 폴더

Module이 만들어지면 res 폴더 아래에 다음과 같은 폴더가 기본적으로 생성된다.

res 폴더 아래에 리소스를 만들면 이 리소르를 식별하기 위한 상수 변수(drawable, layout의 경우 int형 변수)가 자동으로 R.java 파일에 리소스가 등록되며 코드에서는 이 상수 변수로 리소스를 이용한다. R.java는 개발자가 만드는 파일이 아니고 res 폴더에 있는 리소스를 보고 자동으로 만들어진다.이전에는 R.java 파일을 확인할 수 있었으나 업데이트 되면서 볼 수 없게 되었다고 한다. for 개발자의 직접 접근 차단

어떻게 사용하는가?

리소스코드
drawableR.drawable.블라블라
layoutR.layout.블라블라
mipmapR.mipmap.블라블라
valuesR.values.

안드로이드 리소스 파일이 R.java 파일에 상수 변수로 등록되어 이용된다.
1. 각 리소스 폴더에 다시 하위 폴더를 정의할 수 없다.
(지정된 폴더명을 사용해라 ex. drawble, layout, values, mipmap 등등)
2. 리소스 파일명은 자바의 이름 규칙을 위배할 수 없다.
(자바 이름은 숫자로 시작할 수 없다)
3. 리소스 파일명에는 알파벳 대문자를 이용할 수 없다.
(그래서 두 단어를 연결할 때에는 add_user.xml처럼 밑줄(_)을 이용한다)

2.4 레이아웃 xml 파일

화면을 구성하는 레이아웃 XML 파일이다. 사용자에게 보여지는 화면을 만들 때 사용한다.

[activity_main.xml]

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

Android Studio에서는 3가지 모드를 지원한다.

  1. 코드만 보기

  1. 코드와 화면 보기

  1. 화면만 보기

개인적으로 초보자에게는 화면만 보기(3번) 모드로 시작하는 것을 추천한다. 왼쪽에 보이는 palette로 요소들을 끌어다가 넣는 방식으로 화면을 만들 수 있다.

어느 정도 익숙해졌다 싶으면 코드와 화면 보기(2번) 모드로 작업하는 것을 추천한다. 코드를 작성하면서 화면이 어떻게 변화하는지 관찰할 수 있다.

리팩토링 작업을 할 때에는 코드만 보기(1번) 모드로 작업하는 것을 추천한다.

2.5 메인 액티비티 파일

[MainActivity.kt]

package com.example.componentpractice

import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContentView(R.layout.activity_main)
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
            insets
        }
    }
}

MainActivity 클래스는 AppCompatActivity()를 상속받고 있는데 AppCompatActivity는 Activity의 하위 클래스이다. 즉, 결국에는 Activity를 상속받고 있으므로 MainActivity는 Activity Component Class이다. 즉, 이 클래스는 화면 출력을 목적으로 하는 액티비티 클래스이다.

참고- 1.4문단

MainActivity 클래스가 실행되면 onCreate() 함수가 자동으로 호출되면 onCreate() 함수 안의 구문을 실행한다. 여기서 setContentView() 함수는 매개변수에 지정한 내용을 액티비티 화면에 출력한다.

profile
서버 및 모바일 앱 개발자
post-custom-banner

0개의 댓글