일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- 알고리즘
- BFS
- 백준
- mybatis
- db
- 이펙티브자바
- 프로그래머스
- java
- IntelliJ
- 그리디알고리즘
- 깊이우선탐색
- 다이나믹프로그래밍
- DFS
- Spring
- 정렬
- 코테
- Database
- join
- springboot
- Greedy
- 탐욕법
- 너비우선탐색
- mariaDB
- SQL
- Effective Java
- select
- 데이터베이스
- 우선순위큐
- 피보나치
- DP
- Today
- Total
땀두 블로그
안드로이드의 이해 1 본문
오늘은 안드로이드의 특징 및 프로젝트에 대한 공부를 해보려고 한다.
안드로이드 앱 개발 특징
안드로이드의 특징
- 공개 운영체제인 리눅스 기반
- 안드로이드 앱 개발은 자바(Java) 및 코틀린(Kotlin)을 이용
- 운영체제의 핵심 코드, 라이브러리 코드, 기본으로 탑재된 구글에서 만든 코드 등 대부분의 코드가 오픈되어 있음
- 다양한 방법으로 개발자가 제작한 앱을 배포할 수 있음
이렇듯 안드로이드는 많은 부분이 오픈되어 있다는 점에서 개발자 관점에서는 장점이 될 수 있다.
이 중 가장 중요한 요소는 라이브러리 코드와 구글의 기본 코드가 공개되어 있기 때문에 개발자가 어떠한 앱을 개발할 때 필요에 의해서 사용할 수 있다는 점이다. 또한 iOS에서는 허용하지 않는 멀티태스킹을 허용하여 어떤 프로세스가 화면을 점유하고 이용 중이더라도 백그라운드에서 동작하여 업무를 계속적으로 할 수 있도록 한다. 또한 서드 파티(Third party) 앱에서 구현할 수 없는 여러 가지 기능을 구현할 수 있다.
- ※ 서드 파티 앱이란? : 제조사나 통신사에서 만든 기본 탑재 앱이 아닌 일반 앱스토어 등에서 다운받을 수 있는 앱을 의미한다. 이는 누구든지 만들 수 있어 제조사에서 만든 앱(First party app)이나, 통신사에서 만든 앱(Second party app)에 비해서 앱의 종류가 다양하다는 특징이 있다.
하지만 안드로이드 프로그래밍의 단점으로는 기기의 파편화(Fragmentation)이다. 휴대폰 제조사들은 구글에서 만든 안드로이드 플랫폼을 그대로 탑재하는 것이 아니라, 수정이나 추가를 통해서 제작하기 때문에 어떠한 앱을 개발하였을 때 테스트에 더욱 신중을 기해야 한다.
안드로이드 플랫폼 아키텍처
https://developer.android.com/guide/platform?hl=ko 에 있는 그림을 참고하였다.
우리가 안드로이드 스튜디오를 다운받았던 사이트를 가보면 다음과 같은 안드로이드 소프트웨어 스택에 대한 그림을 볼 수 있다.
안드로이드 플랫폼은 리눅스 커널 기반이다. 예를 들면 ART는 스레딩 및 하위 수준의 메모리 관리와 같은 기본 기능에 리눅스 커널을 사용하고, 리눅스 커널을 이용하게 되면 안드로이드 주요 보안기능을 활용하고, 커널용 하드웨어 드라이버를 개발할 수 있다고 한다.
HAL(Hardware Abstraction Layer)은 자바 API 프레임워크에 하드웨어 기능을 이용하는 표준 인터페이스를 제공한다. 자바 API 프레임워크에서 카메라나 블루투스 등과 같은 하드웨어 기기를 이용한 코드가 실행되면 내부적으로는 HAL의 라이브러리 모듈이 로딩되어 처리하는 것이다.
안드로이드 런타임은 ART 가상머신을 이용하여 그 위에 일반 앱을 개발시 이용할 수 있는 자바 API 프레임워크를 제공한다. 대부분 이 자바 API 프레임워크에서 제공하는 클래스를 이용하여 개발한다. 안드로이드 앱 개발은 자바를 사용하여 자바 개발자들의 접근성은 좋지만 자바로 개발된 앱들은 런타임 시 JVM에서 컴파일하지만 안드로이드의 VM은 ART를 이용한다. 이는 라이센스 문제 때문에 구글에서 Dalvik VM을 따로 개발하였기 때문이라고 한다. 다음은 Dalvik VM과 ART VM의 차이점이다.
Dalvik VM
- 32비트만 지원
- JIT 컴파일러 사용
- 실행할 때마다 컴파일
- CPU와 메모리 사용이 높음
- 설치 파일이 작음
- 배터리 소모가 큼
- 실행시마다 컴파일하기 때문
ART VM
- 32, 64비트 모두 지원
- AOT 컴파일러 사용
- 안드로이드 Kitkat부터 생겼고, Lolipop 이후로 AOT 컴파일러가 기본으로 적용
- 안드로이드 Nougat 부터 JIT과 AOT 모두를 탑재하여 최초 설치시에는 JIT을 사용하여 설치시간과 용량을 줄이고, 차후에는 AOT 방식으로 전환하는 것으로 바뀜
- 설치 시 컴파일 코드를 전체적으로 변환하고 저장하여 실행할 때마다 변환된 코드를 읽어옴
- CPU와 메모리 사용이 낮음
- 설치 파일이 큼
- GC 향상
다음은 JVM과 ART가 코드를 컴파일하는 과정이다.
앱 개발시 개발자가 가장 중요하게 보는 요소가 자바 API 프레임워크이다. 이는 앱을 만들 때 이용하는 표준라이브러리로 많은 기능의 라이브러리 클래스를 제공한다. 대표적으로 UI를 구성하는 View나 리소스 관리, 데이터 영속화 등의 기능을 제공한다. 개발자들은 하위의 커널이나 System library를 이용할 필요 없이 자바 API 프레임워크를 이용해 앱의 모든 기능을 구현할 수 있다.
컴포넌트 기반 개발
컴포넌트란 앱의 구성 단위이며, 컴포넌트 여러 개를 조합하여 하나의 앱을 구성한다. 즉 앱을 만드는 것은 컴포넌트를 만드는 것이고, 이러한 컴포넌트들을 모아서 하나의 앱을 완성하는 것이라고 할 수 있다.
안드로이드에서는 이러한 컴포넌트를 물리적으로 클래스로 나타낼 수 있다. 하지만 앱에서 만든 클래스 중 개발자 코드에서 new나 null등을 이용하여 직접 생명주기를 관리하는 클래스는 컴포넌트가 아니다.
또한 컴포넌트는 클래스이지만 일반적인 클래스와는 다르게 생명주기를 시스템이 관리한다. 하지만 컴포넌트의 생명주기를 시스템이 관리한다고 해도 컴포넌트는 클래스의 일종이므로 다른 클래스들과 조합을 해야한다. 이 점에서 그냥 객체지향 프로그램이라고 해도 되지만 굳이 컴포넌트라고 하는 이유는 컴포넌트 클래스가 독립적 수행단위로 동작하기 때문이다. 즉, 결합도가 낮다는 장점이 있다는 것이다.
또한 우리가 흔히 프로그래밍을 할 때 C나 C++, Java와 같은 언어를 사용하면 main문에서 최초 실행을 하게 되는데 안드로이드는 이러한 함수 없이 어떠한 프로세스던 개발자가 원하는 클래스가 최초실행될 수 있다.
마지막으로 애플리케이션 라이브러리라는 개녕미 있다. 예를들어 어떠한 어플래케이션1과 2가 존재한다고 하자. 여기서 사용자가 어플리케이션 1을 실행하였고, 1의 기능 중 하나가 어플리케이션 2의 화면을 띄워 정보를 가졍는 것이라고 하면 사용자는 어플리케이션 1에서 2를 실행할 수 있다. 이는 안드로이드가 컴포넌트 기반이기 때문에 두 클래스가 직접 결합하여 실행되지 않아 외부 어플리케이션을 사용하더라도 해당 앱의 컴포넌트를 실행할 수 있다.
컴포넌트의 종류
여태까지 설명한 안드로이드의 컴포넌트는 4가지 종류이다. 아래에서 이에 대해서 설명하겠다.
-
액티비티 : UI를 구성하는 컴포넌트
-
서비스 : UI 없이 백그라운드에서 오랜 시간 수행되는 컴포넌트
-
콘텐츠 프로바이더 : 어플 간 데이터를 공유하기 위한 컴포넌트
-
브로드캐스트 리시버 : 이벤트 모델로 수행되는 컴포넌트
우리는 위에 설명한 4가지 컴포넌트들을 잘 조합하여 앱을 만들 수 있다. 때로는 액티비티가 많은 앱이 될 수도 있고, 액티비티는 거의 없지만 서비스가 많은 앱이 될 수도 있다. 이는 앱을 제작하는 개발자에 달렸다고 할 수 있다.
리소스를 이용한 개발
안드로이드 앱 개발을 하면서 가장 큰 특징 중 하나는 리소스 외부화를 통한 개발이다. 리소스 외부화란 코드 영역에 정적인 콘텐츠를 코드에서 분리하여 개발하는 개념이다. 즉 코드에서 원하는 문자열을 직접 입력하는 것이 아니라 정적인 문자열을 별도의 리소스 파일로 정리하여 묶어두고 코드에서는 해당 리소스를 얻어 사용함으로써 유지보수의 편의성을 높이는 개념이다.
다음 포스팅에서는 앱 개발 시 디렉터리와 파일의 구조에 대한 포스팅을 진행하겠다.
'Android' 카테고리의 다른 글
안드로이드의 이해 2 (0) | 2020.06.21 |
---|---|
안드로이드 스튜디오 첫 어플 실행 (0) | 2020.05.11 |