1. 안드로이드의 특징

안드로이드는 다른 소프트웨어 개발 분야와 비교했을 때 많은 부분이 오픈되어 있다는 특징이 있다. 특히 애플의 iOS와 비교했을 때, 이 특징은 더욱 크게 느껴진다. 다음은 주요 특징들이다.

▪︎ 안드로이드는 공개 운영체제인 리눅스 기반이다.

▪︎ 안드로이드 앱 개발은 자바와 코틀린을 이용해 개발한다.

▪︎ 운영체제의 핵심 코드, 라이브러리 코드, 스마트폰에 기본으로 탑재된 구글에서 만든 앱 코드 등 대부분 코드가 오픈되어 있다.

▪︎ 안드로이드 플랫폼 기반의 스마트폰을 여러 제조업체에서 만들 수 있다.

▪︎ 개발자가 만든 앱은 구글 play 스토어뿐만 아니라 다양한 방법으로 사용자에게 배포할 수 있다.

▪︎ 안드로이드 기반의 모든 애플리케이션은 평등하다는 사상으로 스마트폰에 기본 탑재된 앱과 개발자들이 만드는 앱이 같은 환경에서 같은 API를 이용한다.

이 처럼 많은 부분이 오픈되어 있다는 점은 소프트웨어 개발자 관점에서 장점일 수 있다.

다음은 안드로이드의 단점에 대해 알아보자.

개발자가 느끼는 가장 큰 단점 중 하나가 기기의 파편화(Fragmentation)이다. 스마트폰 제조사들이 스마트폰을 제조할 때 구글에서 만든 플랫폼을 그대로 사용하지 않고 수정과 추가 과정을 통해 제작한다.
따라서 표준 API로 개발된 코드가 특정 스마트폰에서 수행되지 않거나 에러가 발생할 수 있다.
이러한 기기 파편화 때문에 테스트의 중요성이 더욱 커졌다.

또 다른 대표적인 단점으로는 멀티테스킹(Multitasking)이 있다.
iOS와 다르게 안드로이드는 여러 프로세스가 동시에 작동할 수 있다. 어떤 프로세스가 화면을 점유하여 사용자가 이용하고 있어도 우리의 앱이 백그라운드에서 동작하여 계속 업무를 수행할 수 있다. 하지만 이는 개발자 관점에서는 이점이지만 사용자 관점에서는 백그라운드에서 너무 많은 앱이 수행됨으로써 배터리 소비, 네트워크 트래픽 증가, 메모리 부족 등의 현상이 발생할 수 있어 단점일 수 있다.

2. 안드로이드의 플랫폼 아키텍처

안드로이드 아키텍처

앱 개발자 관점에서는 안드로이드 플랙폼의 아키텍처를 자세히 응용할 필요는 없다. 안드로이드 플랫폼이 어떻게 설계되었는지, 앱이 어떤 환경에서 수행되는지 둥 상식 수준에서 알아두면 좋다.

그림) 안드로이드 소프트웨어 아키텍처 스택

안드로이드 플랙폼은 리눅스 커널 기반이다. HAL(Hardware Abstaction Layer)은 자바 API 프레임워크에 하드웨어 기능을 이용한 표준 인터페이스를 제공한다. 자바 API 프레임워크에서 하드웨어 기기(카메라, 블루투스 등)를 이용하기 위한 코드가 실행되면 내부적으로 HAL의 라이브러리 모듈이 로딩되어 처리된다.

안드로이드 런타임(Android Runtime)은 ART 기상 머신을 이용하며 그 위에 일반 어플리케이션 개발 시 이용할 수 있는 자바 API 프레임워크를 제공한다. 대부분의 앱 개발자들은 이 자바 API 프레임워크에서 제공하는 다양한 클래스를 이용해 앱을 개발한다.

안드로이드 런타임(ART)

자바로 개발된 다른 애플리케이션은 런타임 때 JVM(Java Virtual Machine)이 수행하지만, 안드로이드의 VM(Virtual Machine)은 ART(Android Runtime)을 이용한다. 참고로 ART는 API Level 21(Android 5.0)에서 새로 추가된 VM이며, 이전 버전의 VM은 Dalvik이었다. ART는 앱을 실행 DEX 파일을 실행한다. 일반적으로 자바를 이용하여 개발하면 실행 시 JVM이 class 파일을 해석하는데, 안드로이드는 개발 언어만 자바를 이용한다고 보면 된다.

자바로 개발된 개발자 코드는 컴파일러(compiler)가 자동으로 DEX 파일로 변경하며, 런타임 때 ART가 이 DEX 파일을 해석하여 수행하는 구조이다.

※ 달빅 가상 머신(영어: Dalvik virtual machine 댈빅 버추얼 머신[*])은 레지스터 머신 형태의 (register-based) 가상 머신이다. 댄 본스타인이 다른 구글 엔지니어들의 도움 하에 설계/구현하였다. 현재 안드로이드 (4.4.4이전)휴대 전화 플랫폼에 들어간다.

애플리케이션 프레임워크

앱을 개발할 때 안드로이드 앱 개발자 관점에서 가장 중요한 요소는 '자바 API 프레임워크' 이다. 자바 API 프레임워크는 개발자가 안드로이드 앱을 만들 때 이용하는 표준 라이브러리라고 생각하면 된다.
많은 기능의 라이브러리 클래스를 제공하지만, 대표적으로 UI를 구성할 수 있는 View 클래스부터 리소스 관리, 데이터 영속화 들의 기능을 제공한다.
앱 개발자들은 하위의 커널이나 시스템 라이브러리를 직접 이용할 필요없이, 자바 API 프레임워크에서 제공하는 클래스를 이용하여 앱의 모든 기능을 구현할 수 있다.

3. 컴포넌트 기반 개발

컴포넌트 란?

안드로이드 앱의 아키텍처에서 가장 큰 특징은 컴포넌트 기반이라는 것이다. 컴포넌트의 개념과 특징을 잘 이해하면 이후 안드로이드 앱을 개발할 때 큰 발판으로 이용할 수 있을 것이다.

▪︎ 컴포넌트는 앱의 구성 단위이며, 컴포넌트 여러 개를 조합하여 하나의 앱을 만든다.
안드로이드 앱에서 컴포넌트의 물리적 모습은 클래스이다. 안드로이드 클래스는 컴포넌트와 일반 클래스로 나뉘는데, 이 둘의 차이는 클래스의 생명주기를 누가 관리하는지에 있다. 일반 클래스의 생명주기는 개발자 코드로 관리한다.
즉, 필요한 순간 new 연산자로 생성해 이용하고, 필요 없는 순간 null을 대입해서 소멸시킨다. 안드로이드 컴포넌트는 똑같은 클래스라도 생명주기를 개발자 코드로 관리하지 않고, 안드로이드 시스템이 생성하여 관리하다가 소멸한다.

▪︎ 컴포넌트 앱 내에서 독립적인 실행 단위이다.

앱을 만들 때 컴포넌트도 다른 여러 클래스와 조합해야 한다.
그렇다면 객체지향 프로그램이라고 지칭하면 되는 것을 굳이 컴포넌트라고 하는 이유는 컴포넌트 클래스는 독립적인 수행 단위로 동작하기 때문이다.

왼쪽 그림처럼 MainActivity 클래스에서 DetailActivity 클래스를 실행하기 위해 객체를 생성해서 실행하려 하지만 되지 않는다. 실행하고자 하는 DetailActivity 클래스가 컴포넌트 클래스이기 때문에 직접 개발자 코드로 생성해서 실행할 수 없는 것이다.

오른쪽 그림처럼 MainAvtivity 컴포넌트가 DetailActivity 컴포넌트를 실행할 때 개발자 코드로 직접 결합하여 실행하지 않고, 인텐트(Intent)라는 매개로 하여 결합하지 않은 상태에서 독립적으로 실행하는 구조이다.

이처럼 안드로이드 앱이 컴포넌트 기반으로 설게되어 발생하는 부가적인 특징이 있다.

▪︎ main 함수 같은 애플리케이션의 진입 지점이 따로 없다.

앱의 프로세스가 구동되어 최초로 실행되는 개발자 코드 부분을 흔히 main 함수라고 부르는데, 안드로이드에는 이런 개념이 없다.
안드로이드 컴포넌트가 앱 내에서 각각 독립적인 단위로 수행되기 때문에 모든 컴포넌트는 프로세스가 구동되었을 때 최초로 실행되는 수행 시점이 될 수 있다.

▪︎ 애플리케이션 라이브러리 개념이 있다.

개발자가 따로 만들지 않았는데 어떤 앱이 기능처럼 느껴진다면, 그것은 라이브러리이다. 개발자 관점에서는 안드로이드 스마트폰의 다른 앱들을 라이브러리로 생각할 수 있다.

▪︎ 안드로이드 컴포넌트 종류

∙ 액티비티(Activity)
∙ 서비스(Service)
∙ 콘텐츠 프로바이더(ContentProvider)
∙ 브로드캐스트 리시버(BroadcastReceiver)

액티비티(Activit)는 사용자 화면을 제공하는 컴포넌트이다. 안드로이드 앱은 클라이언트 측 애플리케이션이므로 화면 구성이 중요하다. 따라서 가장 많이 작성하는 컴포넌트이다.

서비스(Service)는 화면과 전혀 상관없이 사용자 눈에는 보이지 않지만, 백드라운드에서 장시간 무언가를 수행할 수 있는 컴포넌트로 이해하면 된다.

콘텐츠 프로바이더(ContentProvider)는 앱 간의 데이터 공유 목적으로 사용하는 컴포넌트이다.

브로드캐스트 리시버(BroadcastReceiver)는 흔히 이벤트 모델로 수행되는 컴포넌트라고 이야기한다. 안드로이드 개발 시 자주 이용하지만, 인텐트 원리를 이해하지 못하면 이해가 쉽지 않다. 그냥 시스템에서 베터리가 부족하거나 시스템 부팅이 완료되는 등의 이벤트가 발생했을 때, 이 이벤트를 받기 위해 작성하는 컴포넌트 정도로 이해하면 된다.

4. 리소스를 이용한 개발

안드로이드 앱 개발의 또 하나의 큰 특징 중 하나가 리소스 외부화를 극대화해서 개발한다는 것이다. 리소스 외부화란, 코드 영역에 누가 언제 실행하든 항상 같은 결과가 나오는 정적인(static) 콘텐츠를 코드에서 분리하여 개발하자는 개념이다. 모든 개발 분야에서 리소스 외부화는 프로그램의 유지보수의 도움이 된다는 사실에 이견이 없다. 정적인 문자열을 리소스 파일로 분리하면 코드 영역은 알고리즘 위주의 코드만 남게되고, 그만큼 코드가 짧아져서 프로그램 유지보수가 좋아진다는 개념이다.

✏️ 오늘 늦게라도 작성할 수 있어서 다행이다. 오늘 작성한 내용은 안드로이드의 기본적인 개념과 특징들을 정리해 보았다.
내일부터는 간단한 UI와 이벤트를 실행해 보도록 할 것이다.
처음에 공부했을 때 올렸으면 좋았을 거라는 생각이 들지만 앱을 만들 때 정리된 메모장이라고 생각하니 시간낭비라는 느낌은 받지 않는다.
오늘은 두개를 올려 볼 생각이다. 이걸 다 하고나면 앞으로 만들어야할 알람과 예약 어플 기획을 해야 한다. 그건 깃허브에 올린 후 여기에 올릴 생각이다.. 오늘도 오공완

이미지
출처) https://developer.android.com/guide/platform?hl=ko
출처) https://velog.io/@alsgk721/안드로이드-6-Intent
달빅 가상 머신
출처) https://bugday.tistory.com/45

profile
찌끄레기 코딩

0개의 댓글