안드로이드와 자바의 비교

이 글은 자바와 안드로이드의 API와 가상 머신을 비교하는 글이다. 대부분의 안드로이드 응용 프로그램은 자바로 작성되어 있으나 자바와 안드로이드의 API에는 많은 차이가 있으며, 안드로이드는 자바 가상 머신(이하 JVM)이 아닌 달빅이라는 별개의 가상 머신을 사용한다.

가상 머신 
안드로이드 안에는 JVM이 없고, 따라서 자바 바이트코드도 안드로이드에서 실행되지 않는다. 안드로이드에서는 자바 클래스를 또다른 바이트코드로 컴파일한 것을 달빅이라는 독자적인 가상 머신에서 구동한다.

JVM과 달빅은 몇 가지 다른 점이 있다.
 JVM은 스택 머신이며, 달빅은 레지스터 머신이다.
 달빅은 디스크 공간을 JVM에 비해 덜 사용하도록 설계되었다.
 달빅의 상수 풀은 32비트 인덱스만을 사용하도록 설계되었다.
 JVM에서는 바이트코드가 8비트 스택 인스트럭션을 실행하며 이 때 지역 변수는 별개의 인스트럭션을 따라 피연산자 스택으로부터 또는 피연산자 스택으로 복사되어야 한다. 반면 달빅에서는 지역 변수에 직접 접근하는 독자적인 16비트 인스트럭션을 사용하며 지역 변수는 통상 4비트짜리 가상 레지스터 영역에 의해 채택된다.

달빅이 읽는 바이트코드도 JVM이 읽는 그것과 다르고, 달빅이 클래스를 읽는 방식도 JVM의 그것과 다르기 때문에 달빅에서는 JVM으로 패키징된 자바 라이브러리를 읽지 못하며 안드로이드 라이브러리를 읽는 데에도 별도의 로직이 필요하다. (특히 안드로이드 라이브러리를 읽을 수 있게 되기 전에 내부 .dex 파일의 내용이 응용 프로그램 내부의 격리된 공간에 복사되어야 하는 것이 있다)

시스템 속성 
자바 SE와 안드로이드의 System 클래스는 둘 다 시스템 속성을 담고 있지만 이들 중 JVM 쪽에서 설정하는 일부 속성들이 안드로이드에서는 의미가 없거나 다르다. 대표적으로 다음과 같은 차이들이 있다.
 안드로이드에서 java.version 속성은 쓰이지 않으며, 값은 0이다.
 안드로이드에서 java.specification.version은 무조건 0.9를 반환한다.
 안드로이드에서 java.class.version은 무조건 50을 반환한다.
 안드로이드에서 user.dir은 다른 의미로 받아들여진다.
 안드로이드에는 user.home과 user.name이 없다.

클래스 라이브러리 
달빅은 자바 SE나 자바 ME의 클래스 라이브러리 프로필에 기대지 않으며, 이에 따라 자바 ME의 클래스, AWT, 스윙도 지원하지 않는다. 달빅이 사용하는 라이브러리는 아파치 하모니를 기반으로 한다.

java.lang 패키지 
자바의 기본 출력 스트림인 System.out과 System.err은 안드로이드에서 기본적으로는 아무것도 출력하지 않는다(ADB를 통해 설정을 변경해 출력하게 할 수는 있다). 안드로이드에서는 기본적으로 Log 클래스를 통해 출력이 이루어지며 출력된 내용은 logcat 툴을 통해 확인할 수 있다.

그래픽스와 위젯 
안드로이드는 AWT나 스윙 대신 View 기반의 여러 클래스들로 스윙과 비슷하게 구성한 독자적인 프레임워크를 사용하며, 응용 프로그램의 Context는 생성될 때 위젯에 제공되어야 한다.

외형 
안드로이드의 위젯 라이브러리는 기본적으로 스윙의 교체 가능한 외형같은 것이 없고, 외형은 위젯 자체에 코딩되어 있어야 한다. 그러나 스타일과 테마 일부는 응용 프로그램별로 지정할 수 있다.

레이아웃 관리기 
레이아웃 관리기가 어느 컨테이너 위젯에든 적용될 수 있는 자바와 달리 안드로이드는 컨테이너 안에 레이아웃이 인코딩된다.

같이 보기 
 안드로이드
 달빅
 자바

각주 

안드로이드 (운영체제)