안드로이드의 특징
안드로이드는 여러 주체에 의해 공동으로 개발된 공개 운영체제여서 다른 모바일 OS와는 다른 고유한 특징이 있다. 이 특징은 주로 안드로이드의 태생에 기인하며 이를 이해하면 안드로이드의 장점과 한계에 대해 감을 잡을 수 있다.
1. 운영체제의 핵심인 커널은 공개 운영체제인 리눅스에 기반한다. 리눅스는 상당히 오랜 기간 개발 및 관리된 커널이어서 정교한 메모리 관리, 안정적인 멀티 스레드, 엄격한 보안 등의 고급 기능을 공짜로 사용할 수 있다. 안드로이드는 리눅스를 모바일 환경에 맞게 개조하여 핸드폰에 어울리지 않는 크고 무거운 기능은 제거하고 알람, 디버거 등의 기능을 추가하여 만든 것이다.
2. 공식적으로 자바 언어를 사용한다. 고수준 언어인 자바는 생산성이 높으며 하드웨어 추상층을 제공하여 전문 지식이 없어도 개발 가능하다. 다란 고급 언어이다 보니 성능이나 섬세함은 다소 부족하다. C로 개발할 수 있는 NDK가 발표되어 있고 더 많은 부분에 네이티브 언어를 쓸 수 있도록 개선되고 있다.
3. 검증된 많은 라이브러리를 대거 포함하고 있어 웬만한 기능은 별도의 외부 라이브러리를 사용할 필요가 없다. 자바가 언어 차원에서 제공하는 라이브러리 외에도 OpenGL, SQLite, FreeType 등의 써드 파티 라이브러리까지 오픈 소스 중에 쓸만한 것을 모두 집대성해 놓은 셈이다.
4. 플랫폼에 내장된 빌트인 프로그램과 사용자가 많은 프로그램이 동일한 API를 사용하므로 모든 프로그램은 평등하다. 원한다면 기본 제공되는 프로그램을 장비 제조사나 사용자가 원하는 것으로 교체할 수 있다. 플랫폼을 구성하는 요소를 자유롭게 선택할 수 있다는 면에서 유연성이 뛰어나다.
5. 개방된 환경인 만큼 개발툴과 관련 문서가 모두 무료로 제공된다. 심지어 운영체제의 핵심 소스까지도 대부분 공개되어 있다. 별도의 라이선스 비용이 들지 않으므로 단말기 가격이 저렴해지는 효과가 있으며 대중화에 유리해서 소프트웨어 수요도 많다.
이 외에 여러 운영체제에서 개발 가능하다는 이점이 있는데 윈도우 모바일이나 아이폰은 특정 운영체제나 장비를 요구한다는 점과 대비된다. 개발자의 접근이 용이해야 훌륭한 프로그램이 나올 사능성이 높아진다. 다른 운영체제에 비해 비교적 젊은데다 발전 속도가 빨라 최신 기능을 빨리 도입한다는 점도 장점이다. 잦은 버전업으로 인해 찌거기가 좀 생겼지만 아직까지는 하위 호환성을 잘 유지하고 있다.
그러나 추종자들이 한껏 치켜 세우는 것과는 달리 한계도 분명히 있다. 역사가 오래되지 못하다 보니 고도로 숙련된 개발자가 많지 않으며 개발 관련 자료가 부족하고 공식 문서조차 완전히 정비되지 않은 상태이다. SDK도 너무 자주 업그레이드되어 안정성이 떨어지며 개발툴의 사소한 버그도 상당히 많은 편이다. 기능 구현에 너무 급급하다 보니 아직은 안정화나 문서 정비에는 약한 면이 있다.
개방된 환경이다 보니 통제 불가능한 변종의 출현이 걱정되기도 하는데 이는 실제 현실의 문제로 대두된 상태이다. 이 문제를 파편화라고 하는데 각 제조사마다 하드웨어 구성이 다르고 통신사의 필요에 의해 OS도 편의에 따라 확장 및 변경함으로써 소프트웨어가 호환되지 않는 문제이다. 환경의 일관성이 부족해 개발 비용이 증가하고 사용자도 자신의 단말기에 맞는 소프트웨어를 찾아야 하는 불편함이 있다. 가이드라인을 제시하여 통일성을 유도하고 있지만 분명 한계가 있다.
공개된 운영체제는 일단 공짜라서 좋지만 명확한 지원을 기대할 수 없다는 것도 불안 요소이다. 운영체제는 리눅스에서 빌려 온 것이고, 언어는 자바를 채용했고, 개발툴은 안드로이드 스튜디오를 사용하며 하드웨어는 각 벤더마다 제각각 따로 만든다. 좋게 말하자면 오픈 소스를 멋드러지게 조합한 것이지만 나쁘게 얘기하면 오만 잡것을 다 모아 놓은 것이다. 아무래도 통합성이 떨어질 수밖에 없으며 골치아픈 문제 발생시 원인을 발견하기 어렵고 민첩하게 대응하기도 쉽지 않다.
안드로이드의 4가지 구성요소
안드로이드의 실행 파일은 다른 운영체제의 전통적인 실행 파일과는 달리 구조가 독특하다. 실행 파일에는 프로그램을 구성하는 코드와 데이터가 들어 있으며 메모리상으로 올라와 실행을 시작하면 프로세스가 되는 것이 보통이다. 즉, 실행 파일과 프로세스가 1:1로 대응되며 응용 프로그램끼리는 서로 완전히 독립적이다.
그러나 안드로이드의 실행 파일은 같은 패키지에 속한 자바 클래스와 리소스의 집합일 뿐 프로세스와 반드시 대응되지 않는다. 대부분 실행 파일이 곧 프로세스이지만 안드로이드에서는 응용 프로그램끼리 서로의 기능을 공유할 수 있고 다른 프로그램의 구성요소를 불러와 같은 주소 공간에서 실행되기도 한다. 윈도우즈의 COM이나 OMG의 CORBRA와 개념적으로 유사하되 다만 로컬 내부에서만 기능을 공유한다는 점이 다르다.
안드로이드 응용 프로그램은 적절한 권한만 있으면 언제든지 인스턴스화할 수 있는 4개의 주요 컴포넌트로 구성된다. 그래서 main 같은 유일한 진입점이 따로 없으며 처음 생성되는 인스턴스의 생성자가 실질적인 진입점이다. 응용 프로그램을 구성하는 4개의 컴포넌트는 다음과 같다.
- 액티비티
사용자 인터페이스를 구성하는 기본 단위이다. 일단 윈도우와 유사한 것으로 생각하되 정확하게 같지는 않으며 윈도우보다 큰 개념이다. 눈에 보이는 화면 하나가 액티비티이며 여러 개의 뷰나 프래그먼트로 구성된다. 응용 프로그램은 필요한 만큼의 액티비티를 가질 수 있으며 그 중 어떤 것을 먼저 띄울지 지정한다.
- 서비스
UI가 없어 사용자 눈에 직접적으로 보이지 않으며 백그라운드에서 무한히 실행되는 컴포넌트이다. 전형적인 예로 미디어 플레이어를 들 수 있는데 비활성 상태라도 노래는 계속 재생되어야 한다. 그 외에 네트워크 감시나 백그라운드 계산 등에 서비스가 활용된다. UI가 없으므로 사용자의 명령을 받아들일 수 있는 액티비티와 연결해서 사용된다.
- 방송수신자
시스템으로부터 전달되는 방송을 대기하고 신호 전달시 수신하는 역할을 한다. 예를 배터리가 떨어졌다거나 사진을 찍었다거나 네트워크 전송이 완료되었다거나 하는 신호를 받는다. 신호만 대기할 뿐 UI를 따로 가지지 않으며 방송 수신 시 방송의 의미를 해석하여 적절한 액티비티나 서비스를 띄우는 역할을 한다. 격리된 실행 환경에서 컴포넌트끼리 통신할 수 있는 공식적이고도 유일한 방법이다.
- 콘텐츠 제공자
다른 응용 프로그램을 위해 자신의 데이터를 제공한다. 안드로이드는 보안이 엄격하여 다른 프로그램의 데이터를 함부로 액세스 하지 못하도록 되어 있다. 응용 프로그램 간에 데이터를 공유할 수 있는 합법적인 유일한 장치가 바로 콘텐츠 제공자이다 전형적인 예가 데이터베이스이며 주소록이나 미디어DB도 콘텐츠 제공자로 제공된다.
응용 프로그램은 이들 컴포넌트 중 일부 또는 여러 개를 가진다. 응용 프로그램의 컴포넌트 구성은 매니페스트라는 설정 파일에 저장 및 관리되며 최초 실행 시 어떤 액티비티를 띄울 것인가도 매니페스트에서 지정한다. 다음 몇 가지 예를 보자.
단 하나의 화면으로 구성되는 간단한 프로그램은 액티비티 하나만 있으면 된다. 예를 들어 현재 시간을 보여주는 시계 프로그램이라면 시간을 표시하는 액티비티만으로도 응용 프로그램을 완성할 수 있다. 이 프로그램을 실행하면 시계 액티비티가 메인으로 실행되며 액티비티가 종료되면 응용 프로그램도 같이 종료된다. 예제 수준의 지극히 간단한 프로그램이 이런 구조를 가진다.
일반적인 프로그램은 여러 개의 액티비티가 필요하다. 주소록이라면 메인 목록 외에도 추가, 편집을 위한 액티비티가 필요하며 이 프로그램은 3개의 화면으로 구성된다 최초 메인 액티비티만 실행되지만 메인이 서브 액티비티를 호출하면 메모리로 올라와 실행된다. 만약 이 주소록이 와부의 프로그램에게 주소를 제공하고자 한다면 콘텐츠 제공자가 필요하다. 일정한 형식에 따라 자신의 주소 데이터를 콘텐츠 제공자로 공개해 놓으면 권한을 가진 외부 응용 프로그램이 콘텐츠 제공자를 통해 주소록 데이터를 액세스할 수 있다.
좀 더 복잡한 프로그램은 액티비티 외의 컴포넌트를 가지는데 MP3 플레이어는 노래를 재생하는 서비스와 사용자에게 곡명을 보여주고 재생, 정지 명령을 입력받는 액티비티로 구성된다 UI액티비티가 종료되어도 노래는 계속 재생되어야 하므로 서비스가 필요하고 서비스는 UI를 가지지 않으므로 사용자의 명령을 받기 위애 액티비티가 필요하다. 시스템의 여러 가지 이벤트에 적절하게 반응하려면 방송수신자도 필요할 것이다.
4가지 컴포넌트는 서로 독립적으로 동작하므로 상호 간의 통신을 위한 장치가 필요한데 이 역할은 인텐트가 담당한다. 인텐트는 컴포넌트 간의 통신 수단이며 메시지에 대한 상세한 정보를 가진다. 예를 들어 주소록 목록 액티비티에서 편집 액티비티를 호출할 때 누구의 주소를 어떤 식으로 편집하라는 지시가 인텐트에 실려 전달된다.
'99. 기타' 카테고리의 다른 글
세계 10대 해킹 사건 (0) | 2016.11.10 |
---|---|
정보보안이란? (0) | 2016.11.10 |
엘라스틱서치(elasticsearch)의 특징에 대해 알아보기 (0) | 2016.09.01 |
언프리티랩스타 시즌3 5회까지 개인적인 순위 및 후기 (1) | 2016.08.30 |
AngularJS 소개 (0) | 2016.08.09 |