Intro
- 오늘부터 안드로이드 입문강의가 시작되었다. 문법을 지나 드디어 앱을 만들기 시작한다.
오늘 배운내용
안드로이드 개관
- 안드로이드의 역사와 안드로이드 플렛폼이 무엇인지, 대략 어떻게 구성되어있는지, OS가 무엇인지에대한 간단한 설명으로 시작되었다.
- 안드로이드에서 UI는 xml로 디자인하고 실제 기능은 Activity에서 구현하는 형태이다. 프로젝트를 처음 만들고 실행하면 우선 manifest.xml에 선언되어있는 acitivity(당연히 application 안에) 중 intent-filter에서 category가 Launcher이며 action이 메인인 Activity를 찾아 실행한다. 좀더 들어가면 실행할 Activity(MainActivity라고 하겠다.)의 onCreate 메서드를 실행하는데 onCreate 메서드 안에는 setContentView라는 메서드가 존재한다.
- setContentView 메서드에 R.id.activity_main 과 같은 layout xml을 매개변수로 넘겨 해당 xml파일에 구현한대로 ui를 화면에 보여주게된다. setContentView에는 3가지 종류가 있던데.. 처음 앱을 만들때 사용하는 메서드는 int 숫자를 넘겨준다. 그리고 이 숫자는 R.java가 자동으로 생성하고 관리한다. R.java는 Android의 모든 리소스를 관리한다. 그리고 res폴더 아래에있는 drawable, layout, value에 접근하여 리소스를 사용할 수 있도록 한다. setContentView에 int값으로 넘기는 그 값은 R.java에서 자동으로 생성한 int번호가 넘어간다. 간단하게 안드로이드 실행과정에대해 알아보고 정리하는 시간이었다.
안드로이드 프로젝트 구조
- Gradle: 안드로이드 앱의 빌드도구로 Project 수준의 gradle과 app 수준의 gradle이 존재한다.
- res : 앱을 만드는데 필요한 여러 리소스들을 보관하는 폴더. 여기에 보관해야 안드로이드에서 R로 접근하여 사용가능하며 주의점은 res하위에 폴더생성은 할 수없고, 파일명 역시 대문자, 숫자로 시작할 수 없다. res폴더에는 drawable, layout, mipmap, value가 존재한다.
- manifest.xml: 앱의 설정, 앱의 구성요소인 컴포넌트를 정의한 xml파일이다. 여기에는 앱 이름과 아이콘 Activity, Service 등이 정의되어있고 여기에 정의되어있지않은 Activity, Service등은 당연히 앱에서도 사용하지 못한다. 이번에 강의를통해 확실히 정리되었다.
프로젝트 빌드
- 프로젝트 빌드에대해서는 아직 그런게 있구나정도로만 학습하였다. 사실 이런영역들이 참 궁금하고 깊게 들어가고싶은 영역이지만.. 막상 들어갈때가되면 머리에 쥐가날 듯하다. 어쨋든 간략히 정리해보면 다음과 같다.
- 내가 짠 소스코드, 리소스파일, AIDL(다른 프로세스와 통신하기위한 인터페이스)파일 들을 컴파일하여 DEX라는 파일이 떨어지는데 이게 기계어로 되어있다고함.
- 그리고 이와 더불어 개발에 사용한 Library들을 컴파일하여 이 역시 DEX파일에 같이 들어가게된다.
- DEX에는 class 정보, method정보, checksum 등 앱을 실행하는데 필요한 모든 정보들이 들어있다.(지금은 이정도만 정리해놓고 추후 하나씩 파보려고 한다..!)
- 이제 DEX파일과 컴파일된 리소스들 그리고 Keystore에서 생성한 키 값을 통해 apk를 만들게된다. 요즘에는 .aab 파일사용을 권장한다고 하는데 apk와 aab 이 두가지도 DeepDive 할 영역이다.(찜꽁)
- 이걸 정리하다가 문득 든 생각이 플러터에서 안드로이드 기기 기능을 사용하기위해서는 메소드체널이라는 것을 사용해서 실제 Android의 기기와 통신을 한다고 알고있었다. 그렇다면 이건 AIDL로 만드는 것인지.. 아니면 새로운 무언가인지..(이것도 찜꽁)
실습
- 이제부터는 프로젝트 만들기 -> UI마우스로 짜보기(나는 불편해서 그냥 xml 코드로 짰다.) -> xml 코드로 UI작성하기 -> Activity에서 onClickListener 사용해보기 정도였다.
- 사실 강사님도 그냥 xml로 작성하시더라..(코드로 짜는게 익숙해지면 확실히 편한듯)
Layout
- 주로 배운 레이아웃은 3가지였다.
- Linear Layout: 수평(horizontal) 혹은 수직(vertical) 중 한가지 Layout을 사용하여 컴포넌트를 배치할 수 있다. 단, 컴포넌트끼리 겹쳐서 배치할 수 없다.
- Relative Layout: 관계를 통해 컴포넌트들을 배치하는 레이아웃. 컴포넌트들간의 관계 혹은 부모 레이아웃과의 관계로 배치한다. 컴포넌트들끼리 겹쳐서 배치가 가능하다.
- Constraint Layout: 제약조건을 통해 배치하는 레이아웃. 가장 자주쓰는데 그 이유는 Linear Layout, Relative Layout에서 사용하는 대부분의 기능을 이 Layout 하나로 다 구현가능하기때문. 컴포넌트들간 제약사항으로 배치하기에 배우는데 개인적으로 시간이 좀 걸렸지만 확실히 자주쓰게되는 레이아웃이다.
- 개인적으로 학습하면서 느낀것은 플러터를 하다와서그런지 자꾸 Column 과 Row로 매칭해서 생각하게된다. 확실히 UI 짜는건 플러터가 체감상 빠르다고 생각이 들었다.
Activity Lifecycle
- 인텐트와 액티비티는 사용하면서 익숙해지기 + 컨셉과 개념에대한 이해가 필요하다고 느껴졌다.
- 생명주기는 유니티에서도 플러터에서도 사용했었기에 익숙한 개념이었지만 안드로이드의 생명주기를 로그를 찍으며 보니 확실히 정리가 되었다.
- 생명주기 정리
- onCreate : 앱 구동시 가장먼저 실행되는 부분. 최초실행시에 단 1번만 실행된다.
- onStart : onCreate 이후 실행되는 부분. Start 이후에는 Resume으로 넘어간다.
- onResume : Activity에서 여기까지 도달한 이후에 사용자가 다른 Activity로 넘어가거나 다른 앱으로 넘어가지 않는이상 변화하지 않는 것 같다.
- onPause : 사용자가 다른 Activity 혹은 앱으로 넘어갈때 실행됨. 단어에서도 보이듯 해당 Activity의 작업을 일시정지하는것으로 보인다.
- onStop : 다른 Activity로 넘어갔을때, 해당 앱에서 onCreate, onStart, onResume이 실행된 이후 그제서야 해당 메서드가 실행된다. 완전히 다른 Activity로 넘어갔음을 여기서 확인할 수 있을듯.
- onRestart : 다른 Activity에서 넘어올때 실행되는 부분. 최초 Activity 실행이 아닐경우에 바로 원래있던 Activity에서는 onPause로 넘어가고 넘어가고자하는 Activity에서는 onRestart에서 시작된다. 그 후 onStart -> onResume 이 순서대로 실행된다.
- onDestroy : 해당 Activity가 완전히 종료될 때 동작한다. Activity의 가장 마지막에 실행됨.
Outro
- 오늘 상당히 많은 개념을 배웠다. 한번 훑고나니 깊게 들어가야 할 개념들이 눈에 보였다. Activity, Intent, 빌드과정(DEX, AIDL, apk, aab) 등.. 다른 프레임워크도 그렇겠지만 안드로이드역시 공부하면 할수록 공부할게보여서 참 좋다(이렇게 파고드는게 맞나 싶긴하다만..)
- 내일배움캠프에서 제시한 사전과제가 끝나면 하나씩 파봐야겠다. 그리고 배운 개념들을 velog에 잘 정리해서 올려야겠다.
- 예전에 한번씩 어떻게든 실행만되게 만들었었지만, 하나씩 정리하며 알고 사용하니 확실히 어떻게 쓰면좋을까에대해 더 분명하게 고민할 수 있어서 좋았다.