2023.02.08 - 안드로이드 앱개발자 과정

CHA·2023년 2월 8일
0

Android



안드로이드 개발

안드로이드 앱을 개발하기 위해서는 안드로이드 스튜디오 라는 코드편집기가 필요합니다. 자바에서 코드 편집기로 eclipse 를 사용하고, 실행도구로 JRE, 컴파일러로 JDK 를 사용했던것과 비슷하게 안드로이드에서는 안드로이드 스튜디오라는 코드편집기를 사용합니다. 안드로이드 개발자 사이트에서 다운받을 수 있습니다. 편리하게도, 안드로이드 스튜디오를 다운받게되면 자동으로 JDK 가 설치됩니다. 또한 안드로이드에서는 추가적으로 Android SDK(Software Developement kit) 와 AVD(Android Virtual Device) 까지 설치하면 안드로이드 개발을 위한 준비는 끝납니다.


안드로이드 xml

검은색 화면의 글씨만 써내려가던 CLI 프로그래밍과 다르게 GUI 프로그래밍에서는 다양한 화면을 구성해야 합니다. 자바의 Swing 처럼 GUI 프로그래밍을 하려니, 자바의 코드작성 방식과 동일하게 화면도 구성하고 버튼들의 액션도 코딩해야 하니 상당히 코드가 복잡해질것같습니다. 가독성도 안좋고 말이죠. 그래서 안드로이드에서는 이러한 방식을 채택하지 않고, 화면을 만들어주는 코드를 따로 분리시키기로 합니다. 그리고 이러한 화면구성을 할 때 효과적으로 사용할 수 있는 언어가 XML 이었습니다.

추가적으로 안드로이드에서는 앱에 들어가는 문자열들도 xml 로 따로 만들어서 문자열을 처리해야합니다. 만일, 직접 문자열을 작성하는 경우 이를 하드코딩되었다고 하며, strings.xml 에 작성하여 사용할것을 권장합니다. 그렇게 작성된 strings.xml 을 앱을 사용하는곳이 한국이냐 미국이냐에 따라 한국어, 영어의 xml 을 따로 가져다가 씁니다. 그 과정은 앱에서 알아서 처리해줍니다. 이를 대체 문자열(Alternative Resourcing) 방식이라고 합니다.


Android Project 폴더 구조

안드로이드 스튜디오를 열고 프로젝트를 하나 만들어 실행해보면 왼쪽에 프로젝트 내부 폴더들이 나옵니다. manifests, java, res, gradle Scripts 이렇게 4가지로 구성되어있습니다. 하나씩 살펴보겠습니다.

1. AndroidManifest.xml

manifests 폴더의 안쪽에 보면 AndroidManifest.xml 이라는 파일이 있습니다. 쉽게 설명해서 이 xml 은 책의 목차와 같은 역할을 합니다. 즉, 이 앱이 어떠한 정보를 가지고 있는지 알려주는 역할을 합니다. 다음은 xml 파일에 작성되어 있는 코드입니다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
    <application
        android:allowBackup="true" 
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/Theme.Hello"
        tools:targetApi="31">
      
        <activity
            android:name="com.cha.MainActivity" 
            android:exported="true">
            <intent-filter>
              
              <action android:name="android.intent.action.MAIN" />
              <category android:name="android.intent.category.LAUNCHER" />
              
            </intent-filter>
        </activity>
    </application>
</manifest>

간단하게만 봅시다. <manifest></manifest> 는 포장지와 비슷한 개념이라고 생각하면 좋겠습니다. 그리고 그 포장지 안에 <application></application> 이 들어있는 구조입니다. 여기서 <application> 은 시작태그, </application> 은 종료태그라고 합니다. 그리고 시작태그 안쪽에 그 객체의 속성을 적을 수 있습니다. android:allowBackup = "true" 처럼요. android: 는 마치 namespace 처럼 속성 이름의 중복을 막기 위해서 설정된것이며, 속성의 값을 넣어줄 때는 항상 "" 을 이용하여 값을 넣어주어야 합니다.

android:allowBackup="true"
백업을 허용할지 말지 설정하는 속성입니다. 예를 들어, 핸드폰을 바꿨을 때, 기존 ID 로 구글 로그인을 시도하면 백업이 되어있던 앱들을 다시 설치할것인지 묻습니다. 이때 이 속성이 true 라면 앱들의 리스트에 추가할 수 있습니다.

android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
위 두가지는 아직 설명하기 힘들기 때문에 추후에 다시 알아봅시다.

android:icon="@mipmap/ic_launcher"
앱의 아이콘 이미지를 설정합니다.

android:label="@string/app_name"
앱의 이름을 설정합니다.

android:supportsRtl="true"
일본어와 같은 언어의 경우 오른쪽에서 왼쪽으로 작성됩니다. 이 설정을 이용하면 이런 언어들의 대한 지원이 활성화됩니다.

android:theme="@style/Theme.Hello"
앱의 테마를 정합니다.

tools:targetApi="31"
이 앱의 타켓 API 를 정합니다.

2. java

기존의 java 문서가 들어가는 폴더입니다. 클래스를 만들려면 이 폴더에 만들어주어야 합니다.

3. res

Resource 의 약자로, 앱에서 사용하는 자원들을 모두 모아놓은 폴더입니다. 음악, 영상, xml 등 .java 가 아닌 자원들은 모두 이곳에 있다고 보면 됩니다.

4. gradle Scripts

gradle 은 안드로이드의 빌드 도구 입니다. 빌드 도구가 무엇인지는 아래에서 살펴봅시다.


마켓에 어떻게 업로드할까?

C언어 때는 컴파일러의 컴파일을 통해 class 파일로 만들고 , 링커의 링크 작업을 통해 실행파일로 만들었습니다. 자바때도 최종 산출물인 jar(자바 아카이브) 를 만들었으며 안드로이드 또한 최종 산출물을 만듭니다. 안드로이드는 apk(Android package)라는 산출물을 만드는데요, 이 apk 는 어떠한 방식으로 만들어지는지 한번 알아봅시다.

안드로이드 역시 자바를 기반으로 하다보니, 자바의 과정과 비슷합니다. 단, 자바에서 사용되던 JVM 은 초창기에 핸드폰에 싣기에는 무겁다 보니 , 안드로이드는 Dalbik 이라는 가상머신을 도입하였습니다. 이 달빅에 의해 안드로이드 압축 파일인 dex(dalbik execute) 을 만들어 냅니다. (다만, 달빅의 성능이슈 때문에 추후에 ART(Android RunTime) 으로 가상머신이 교체되었습니다.) apk 를 만들기 위해 dex 파일만 필요한건 아닙니다. res 와 manifest, 외부 라이브러리까지 다 합쳐야 apk 를 만들 수 있습니다.

그래서 apk 가 만들어지는데, 이러한 과정을 누가 하는걸까요? 앞서 소개되었던 Gradle 이 바로 이 과정을 담당합니다. apk 를 만드는 과정을 빌드 라고 하며 이 Gradle 을 빌드도구 라고 합니다. 빌드도구는 초창기에는 Ant, 그리고 Ant 를 개선한 Maven, 그 Maven 을 개선한 Gradle 로 이어집니다. 즉, 이 Gradle 이 dex, res, manifest, 외부라이브러리 등의 파일들을 합쳐 apk 파일을 만드는 역할을 하는것입니다.


Android App 실행순서 앱의 시작점이 어딘데?

그러면 이제 안드로이드 프로젝트를 한번 열어볼까요? 그런데 기존에 우리가 보아왔던 자바, C 언어와는 조금 달라보입니다. 일단 제일 먼저 눈에 띄는게 main 함수가 없다는것입니다. 우리가 프로그램을 실행하면 가장 먼저 실행되고, 이 함수가 끝나면 프로그램이 끝난다던 main 함수가 안드로이드에는 없습니다. 그러면 안드로이드 프로젝트를 Run 하면 어떤 부분이 제일 먼저 실행이 되는걸까요?

1. AndroidManifest.xml

앞서 AndroidManifest.xml 은 마치 책의 목차와 같은 역할을 한다고 하였습니다. 즉, 앱의 내부에 어떠한 내용들이 들어가 있는지 알려줍니다. 앱을 실행시키면 가장 먼저 실행되는게 manifest 입니다.

<?xml version="1.0" encoding="utf-8"?>
<manifest>
    <application>
        <activity>
            <intent-filter>
              
              <action android:name="android.intent.action.MAIN" />
              <category android:name="android.intent.category.LAUNCHER" />
              
            </intent-filter>
        </activity>
    </application>
</manifest>

위에서 봤던 manifest 의 코드를 속성들 빼고 간략하게 작성했습니다. manifest 안에는 우리가 만든 application 이 있으며, 그 앱 안에는 activity 가 존재하게 됩니다. 액티비티란 앱의 화면을 이야기합니다. 그리고 우리가 앱을 실행하면 가장 먼저 등장하는게 바로 앱의 화면이죠. 그렇다면 어떤 앱의 화면이 가장 먼저 등장할 까요? 바로 intent-filter 를 가지고 있는 액티비티입니다. 내부적으로 intent-fliter 가 있는 액티비티를 찾아서 그 액티비티를 가장 먼저 화면에 띄워줍니다.

만일 앱 안에 액티비티가 여러개라면 어떨까요? 이때도 마찬가지 입니다. 액티비티가 몇개건 intent-filter 를 가진 액티비티가 우선권을 가지게 됩니다. 만일 intent-filter 를 모두 갖고 있다면, 코드가 작성된 순으로 실행됩니다. 단, 별로 좋지 않은 코드겠죠.

2. MainActivity 객체 생성

앱을 실행 후 intent-filter 가 있는 액티비티를 찾아 실행해주었다면 그다음으로 MainActivity 의 객체를 생성하게 됩니다. 단, 주의할 점은 MainActivity 의 생성자는 건드리지 않아야 합니다. 내부적으로 하드웨어를 건드리는 코드가 작성되어있다고 합니다.

3. 콜백메소드 onCreate()

MainActivity 의 객체를 생성했다면, 콜백 메서드인 onCreate() 를 실행합니다. 앞서 MainActivity 의 객체를 생성할 때 생성자는 건드리지 않는다고 하였습니다. 그 대신, 라이프 사이클 메소드 중 하나인 onCreate() 콜백메소드를 호출하는것입니다.

4. setContentView(R.layout.activity_main);

그리고 콜백메서드 내에 호출문인 setContentView(R.layout.activity_main) 실행됩니다. 여기서 R 은 res 를 의미하며, res 파일 안에 있는 layout 파일 안에있는 activity_main.xml 을 파라미터로 넘겨준것입니다. setContentView() 는 말 그대로 View 를 세팅한다는 의미입니다. 즉, 파라미터로 뷰 객체를 넘겨주면 그걸 화면에 보여주겠다는 의미죠. 그래서 new Button() 을 파라미터로 전달한다면 화면에 버튼 하나를 크게 보여줍니다. 여기에서는 activity_main.xml 이라는 뷰 객체를 넘겨주었습니다. 이로써 우리가 만든 화면을 보여줄 수 있게됩니다.

profile
Developer

0개의 댓글