MFC 개발에 익숙한 사람들을 위한, 안드로이드 애플리케이션 개발 기초 강좌입니다.
MFC에서 사용하는 프로그램 구성 요소가 안드로이드에서는 무엇에 대응되는지 간단히 설명합니다.

* 이 글의 전체 혹은 일부를 복사해서 다른 곳에 옮기는 행위를 금지합니다. *
* 이 글은 www.androidpub.com에서만 보실 수 있습니다.



안드로이드 애플리케이션을 개발하는 일은,
MFC로 애플리케이션을 개발하는 일과 비슷한 측면이 많이 있습니다.

MFC에서 하던 방식

우선 MFC로 애플리케이션을 개발할 때 하던 일들을 간단히 떠올려 보겠습니다.
1. CWinApp를 상속받아서 애플리케이션 오브젝트를 만드는 일입니다.
2. CWinApp::InitInstance()에서 기초적인 준비 작업을 마치고, 실제 화면 처리를 담당할 CWnd의 서브클래스 인스턴스를 만듭니다.
3. 코드가 드러나 있지는 않지만, 내부적으로 메시지 펌프가 실행되어 각종 이벤트가 윈도우 메시지 형태로 전달됩니다.
4. 2에서 만들어진 윈도우에서 윈도우 메시지를 적절히 처리하여 기본 작업을 하고, 오버라이드된 OnPaint()에서 화면에 그리기 작업을 합니다.
5. 사용자의 입력을 받기 위해서, 화면에 버튼을 추가하기도 하며 버튼이 눌리면 적절한 작업을 수행합니다. 버튼도 하나의 CWnd 오브젝트입니다.

안드로이드에서 하는 방식

안드로이드 애플리케이션에서 하는 일도 이것과 크게 다르지 않습니다.
1. 안드로이드에서는 CWinApp 대신 Activity 클래스를 상속받아서 액티버티를 만듭니다.
2. CWinApp::InitInstance() 대신 Activity::onCreate()에서 초기 작업을 처리합니다. 이 때 화면 처리를 담당할 View를 만듭니다.
   View는 MFC에서의 CWnd와 비슷한 역할을 합니다.
3. 안드로이드도 내부적으로 이벤트 처리가 수행되며, 각종 이벤트가 View로 전달됩니다.
4. View는 onDraw()에서 화면에 원하는 내용을 그릴 수 있습니다.
5. View도 화면에 버튼 등의 UI 구성요소를 추가할 수 있습니다. 추가되는 버튼도 하나의 View 오브젝트입니다.


비교

정리해 보면, 다음 표와 같습니다.

   MFC 안드로이드 
 프로그램  CWinApp Activity 
 화면  CWnd View 
 그리기  OnPaint() onDraw() 

물론, 이런 식의 비교가 아주 정확한 내용은 아닙니다.
대략적인 개념 세우기 목적으로 참고해 주세요.


안드로이드 애플리케이션 만들어 보기

Activity

이클립스에서 안드로이드 프로젝트를 시작하면, 기본적인 Activity가 만들어집니다.
( 이클립스에 안드로이드 플러그인을 설치하고, 프로젝트를 새로 만드는 과정은 다른 게시물을 참고해 주세요. )
자동으로 만들어진 코드를 살펴보면, onCreate()에서 setContentView를 부르는 내용이 있습니다.
 public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
R.layout.main을 가지고 화면을 구성하라는 것입니다.
R.layout.main은 xml로 만들어진 화면 레이아웃입니다.
Visual Studio에서 다이얼로그 리소스를 편집하면 IDD_TEST 같은 식으로 만들어졌던 리소스 이름과도 같은 개념입니다.

이대로 두면, 리소스에 적혀 있는 대로 화면이 구성되는데 이 내용을 조금 바꿔보겠습니다.
 public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView( new TestView( this ) );
    }
TestView 오브젝트를 만들어서 Content View로 지정했습니다.
이렇게 하면, 리소스에 적힌 대로 화면이 구성되는 것이 아니라, TestView가 화면에 가득 차게 됩니다.
MFC의 경우,  CWinApp::InitInstance()에서 CWnd 오브젝트를 만들고 m_pMainWnd에 연결했던 것과 비슷합니다.

View

이제, 위에서 만들지도 않고 써버린 TestView를 만들 차례입니다.
새로운 자바 파일 TestView.java를 만듭니다.
당연히 클래스 이름은 TestView이고 View를 상속받습니다.
public class TestView extends View
{
 public TestView( Context context )
 {
  super( context );
 }
}
하는 일은 전혀 없습니다.

onDraw()

이제 화면에 뭔가 그려볼 차례입니다.
MFC에서 CWnd::OnPaint()를 오버라이드했듯이,
안드로이드에서는 onDraw()를 오버라이드합니다.
다음 코드는 화면을 하얀 색으로 지우고,
까만 색 선을 10개 그립니다.
Canvas가 사용되었는데, MFC의 CDC와 비슷한 개념으로 보면 됩니다.

 @Override
 protected void onDraw(Canvas canvas)
 {
  canvas.drawColor( Color.WHITE );
  
  Paint paint = new Paint();
  paint.setColor( Color.BLACK );
  
  for ( int i = 0; i < 10; ++i )
  {
   canvas.drawLine( 0, i * 10, 100, i * 10, paint );
  }
 }