2011년 9월 7일 수요일

Hello Android 분석

이클립스에서 안드로이드 프로젝틀 생성 하면 아래와 같이 생성 된다.

HelloAndroidActivity.java

package org.eltro.helloandroid;

import android.app.Activity;
import android.os.Bundle;

public class HelloAndroidActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}






package org.eltro.helloandroid;

패키지란 일반적인 정의외에 상위 클래스를 포함하는 네임 스페이스(Name Space)라 정의 할 수도 있다. 네임 스페이스의 주된 용도는 같은 이름의 함수가 사용될 경우와 같은 충돌을 방지 하기 윈한 것으로 다수의 개발사 혹은 다수의 솔루션을 사용하여 프로젝트가 진행 될때 유용하다. 일반적으로 자주 접하기는 어려우나 프레임 워크에 해당되는 소스들은 네임 스페이스를 사용하는 경우를 볼수 있다.


예를 들어 여러개의 솔루션을 사용하여 프로젝트가 진행되는 경우  A 솔루션과 B 솔루션에 다른 기능을 하지만  같은 이름을 사용을 하는 경우가 있다면 어떻게 될까? 일반적으로 이런 경우  링크시 에러로 처리되기도 하고 경고 정도로 무시하고 지나가기도 한다. B 솔루션의 tree()함수를 호출했어야 하는데 A 솔루션의  tree()함수가 호출 되었다면 아마도 십중 팔구는 엉뚱한 결과가 나올것이다. 이런 상황은 실무에서도 목격되기도 하는데 이를 디버깅 하기 위해서는 며칠 혹은 몇주 의 시간이 허비 될 수 있다. 아마 이런 경험을 해본 사람도 있을 것이다.
각 솔루션에 고유의 네임 스페이스를 사용하면 이런 상황을 예방 할 수 있으며, 기존의 표준 라이브러리 등에서 사용되는 함수 이름을 써야 하는 경우도 적용할 만 하다.

자바에서의 패키지는 일종의 네임스페이스기 때문에 결국은 유일 무이한 이름이 되어야 한다. 패키지 이름을 만드는데 있어 특별한 룰은 없지만 아래와 같이 만드는 경우가 많다.

com.android.mms.ui
com.company.hellowworld
org.myname.helloword
org.group.team.name.helloword

import android.app.Activity;
이클립스에서 Activity를 마우스로 더블 클릭 해서 선택된 상태에서 F4를 누르면 타입 계층 구조 창이 보일것이다. 부모 클래스, 파생 클래스 등 클래스간의 연관 관계를 볼때 유용하게 사용될 수 있다.






일반적으로 액티비티를 설명할때 가장 먼저 나오는 얘기가 생명주기(life cycle)에 대한 언급을 한다. 아마도 회사 면접시 단골 질문중에 "하나가 액티비티가 먼지 설명하시요" 라고 하는 경우도 꽤 있으리라 생각한다. 이러한 생명 주기에 대한 정의 일반적으로 어플리케이션의 정의를 내릴때 많이 사용되며 일반적인 윈도우 시스템에서의 윈도우의 생성과 소멸되는 과정에 대한 정의도 마찬가지이다.
액티비티는 유저와의 인터페이스의 출발점으로서 초기에 윈도우를 생성 시켜줘야 할 책임을 가지고 있다.

그렇다면 액티비티는 어플리케이션이라 보면 되는 것인가? 사실 본인의 경우 액티비티의 생명주기에 대한 설명을 액티비티는 생명주기를 가지고 있으니 일종의 어플리케이션이라고 생각을 했고 그렇다면 View가 윈도우에 해당될것이라 추측하기도 했었다. 하지만 구글에서는  4개의 주요 컴포넌트중 하나 혹은 그이상을 사용하는 것이 어플리케이션이다라고 정의를 하고 있다. 어플리케이션을 구성 하는 핵심 컴포넌트인 액티비티가 하나만 가지고 어플리케이션을 만든다 라고 가정하면 액티비티의 생명 주기는 바로 어플리케이션의 생명 주기와 같아 진다고 할 수 있다.

import android.os.Bundle;
Bundle은 Parcerlable type에 대한 스트링 값을 매핑 하기 위한 것이다. 보충 설명이 필요하다.

public class HelloAndroidActivity extends Activity {
액티비티 클래스를 상속받아 HelloAndroidActivity클래스를 정의한다. 상속을 하는 이유는 부모 클래스의 코드를 재사용하기 위함이다. 자바에서는 상속의 의미로  extends를 사용하는데 아마도 상속을 받게 되면 부모 클래스를 그대로 사용하는 것이 아니라 확장을 해서 사용하기 때문이 아닐까 생각된다.
 C++ 스타일은 아래와 같다.
class WXDLLIMPEXP_CORE wxWindow : public wxWindowBase --> C++ style.




   /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {

@Override는 대치 한다는 의미로 슈퍼 클래스의 메소드가 교체가 된다는 알려주기 위해 상용된다. 액티비티 클래스에는 아래와 같이 onCreate함수가 정의 되어 있다.
    protected void onCreate(Bundle savedInstanceState) {
        mVisibleFromClient = !mWindow.getWindowStyle().getBoolean(
                com.android.internal.R.styleable.Window_windowNoDisplay, false);
        mCalled = true;
    }

윈도우Visible인지 아닌지만 체크한다.



        super.onCreate(savedInstanceState);

슈퍼클래스의 onCreate 함수를 호출하여 윈도우가 Visible 아닌지 체크 한다.

        setContentView(R.layout.main);


리소스 파일의 main.xml을 이용하여 Contents를 표시한다.
액티비티 클래스의 setContentView의 원형 함수를 보면 윈도우에 콘텐츠(뷰)를 배치 하는 것으로 보인다. 안드로이드는 윈도우 시스템일 까? 아닐까? 
R.layout.main에서 하필이면 main이라고 했을까 ?

    public void setContentView(int layoutResID) {
        getWindow().setContentView(layoutResID);
    }


    }
}



댓글 없음:

댓글 쓰기