S/W Development/bada2010. 11. 16. 17:10

바다 플랫폼에서는 2단계 생성자를 사용하는 것이 안전합니다. 심비안(Symbian)에서 사용하던 방식을 차용한 것인데요. 기존 C++ 코드처럼 기본 생성자에서 다른 객체에 대한 메모리를 확보하도록 선언했다고 가정하면, 이 때 생성자 코드를 수행하던 중에 알수 없는 오류로 인해 생성자를 나가게 되면 메모리 누수(Memory Leak)가 일어납니다. 일반 PC에서는 이런 것이 큰 문제가 되지 않을 수도 있지만, 모바일에서처럼 메모리 크기가 큰 이슈로 작용하는 경우에는 문제로 작용될 가능성이 큽니다. 이러한 메모리 누수를 해결할 방법이 2단계 생성자입니다. 기본 생성자에서는 내부 인스턴스에 대한 메모리 확보를 하지 않고 따로 메모리 확보를 위한 메서드를 추가하는 방식입니다.

코드를 보면서 설명하겠습니다.


5번째 줄에서 에러가 발생하는 경우에는, 소멸자가 호출되지 못해서 메모리가 할당된 b1객체는 메모리 누수가 일어나게 됩니다. 이를 방지하기 위해서 11번째 줄처럼 실제 생성자에서는 내부 인스턴스에 대한 메모리 할당을 해주지 않기 때문에 이미 객체는 생성이 되었기 때문에 앞으로 클래스 객체를 사용하면서 문제가 발생되더라도 소멸자가 호출되기 때문에 메모리 누수가 일어나지 않도록 할 수 있습니다.

그래서 바다에서는 객체를 생성하고 사용할 때에는 다음과 같이 2단계 생성자 방식을 따릅니다.

Posted by ILTAL
S/W Development/bada2010. 11. 15. 18:51

아이콘과 로딩 화면 교체 방법
다국어 지원시 작성 방법
2phase construction
Posted by ILTAL
S/W Development/bada2010. 11. 15. 18:15

이번 강좌는 바다 애플리케이션 동작 방식에 대한 기본적인 이해를 돕고자 작성되었습니다.

 

바다 플랫폼에서 애플리케이션 타입은 다음과 같은 크게 두 가지로 구성됩니다.

 

  • Base Application
  • bada Application

 

Base Application은 Dialer, Contact, Camera, Music Player와 같은 핵심적인 애플리케이션을 의미하고, bada Application은 설치와 삭제가 가능한 애플리케이션 즉, 모든 3rd party 애플리케이션을 의미합니다.

 

바다 플랫폼에서 동작하는 bada Application Model은 다음과 같은 다이어그램을 참고하면 이해하기 쉽습니다.

가장 하위단에는 OS(멘토 그래픽스사의 Nucleus RTOS를 기반으로 동작함)가 있고, 그 위에 Framework을 위미하는 F라는 접두어를 포함한 FApp 이라는 Application Framework이 있습니다. 이 프레임워크는 애플리케이션에서 발생하는 모든 이벤트를 처리하고, 우리가 만들 애플리케이션과 상호 작용합니다.

 

 

bada Application의 Life Cycle은 다음과 같이 크게 세 단계로 구성됩니다.

 

  • Launch
    • OnAppInitializing : 애플리케이션이 실행될 때, 초기화를 위해서 Application Framework에서 호출합니다.
    • OnForeground : 애플리케이션이 실행되면 처음에는 Foreground로 실행되어 지기 위해 Application Framework에서 호출됩니다.
  • Running
    • OnBackground : bada Application(유저가 홈키를 눌렀거나 전화가 왔을 때와 같은 이벤트가 발생되면)의 실행되면 OnBackground 가 Application Framework에서 호출됩니다.
    • OnForeground : bada Application이 종료되면 다시 OnForeground 가 Application Framework에서 호출됩니다.
  • Termination
    • OnAppTerminating : 다음과 같은 상황이 발생되면 Application Framework가 이 동작을 수행합니다.
      • 유저가 종료 키를 눌렀을 때
      • 유저가 다른 bada Application을 실행했을 때(현재 바다 플랫폼에서는 한번에 하나의 bada Application만 실행할 수 있습니다.)
      • 가용 가능한 메모리가 현저히 적을 때

 

 

바다 애플리케이션이 실행되는 전체적인 흐름은 아래 다이어그램을 보면 이해에 도움이 됩니다.

 

 

이와 함께, 지난 번에 만들었던 Hello Bada 프로젝트의 HelloBada 헤더 파일을 살펴보면 어떻게 Virtual Class들을 상속받아서 구현하여 우리가 만드는 bada Application이 동작하는 지 이해하기 좋습니다.

 

다음 코드는 HelloBada.h 파일에 대한 소스 코드입니다.

 

 

이번 강좌를 통해서 바다 애플리케이션의 동작 방식에 대해서 간략하게 알아봄으로써 앞으로 애플리케이션을 개발하는데 있어 많은 도움이 될 것이라고 생각합니다.

Posted by ILTAL
S/W Development/bada2010. 11. 15. 15:32

이번 강좌에서는 기본적인 Form Based Application인 Hello bada 프로젝트를 만들어보겠습니다. 프로젝트를 생성하고, TextField, Label, Button 컨트롤을 이용하여 간단하게 만든 애플리케이션입니다.

 

 

 

File > New > bada Application Project를 선택하면 다음과 같은 화면에 보입니다. Application과 Library 중에서 선택하여 생성할 수 있습니다.  우리는 Form Based Application을 만들 것이므로, 해당 항목을 선택하고 Project name을 입력하고 Next를 선택합니다.

 

 

image

 

bada SDK가 있는 가장 상위 디렉토리를 지정하고 이 애플리케이션이 동작할 디바이스 모델을 선택하고 Next를 선택합니다.

 

 

image

 

메니페스트(manifest) 파일을 지정하는 화면이 나옵니다. 여기서는 테스트 애플리케이션을 만들 것이므로, Default manifest file에 체크하고 Next를 선택합니다. 만약, 삼성앱스 셀러사이트에 등록할 목적으로 상용 애플리케이션을 만들 것이라면 바다 DS(Developer Site)에 가서 메니페스트를 다운로드 받아서 여기에 추가해야 합니다.

 

 

image

 

Form name을 입력하는 화면입니다. 원하는 이름을 입력하고 Next를 선택합니다.

 

 

image

 

Vender와 Description을 입력하고 Next를 누릅니다.

 

 

image

 

이제 프로젝트 생성을 위한 모든 작업이 끝났습니다. 이에 관한 내용이 Summary되어 표시되고, Finish를 누르면 프로젝트 생성을 마무리 합니다.

 

이제 폼 구성을 해 봅시다.

폼은 코드로도 작성할 수 있지만 Resource Explorer에서 편리하게 추가, 수정, 삭제할 수 있습니다. Project Explorer > HelloBada > Res > 480x800 > IDF_HELLOBADAFORM.xml 더블 클릭하면 됩니다.

(만약, 'Open Resource Explorer View first.' 라는 경고 메시지가 뜬다면 당황하지 마시고,  Window > Show View > Other... > bada > Resource Explorer 를 선택하면 됩니다.)

 

 

image

 

ToolBox에서 TextField, Button, Label 컨트롤을 선택한 다음 Drag하여 UI 화면에 Drop하면 자동으로 추가됩니다. 각 컨트롤을 더블클릭하면 Property에 속성 정보가 나타납니다. 각 컨트롤의 속성 창을 보여드리겠습니다.

 

TextField Control Property

image

 

Button Control Property

image

 

Label Control Property

image

 

이렇게 컨트롤 배치를 마치면, UI 구성은 끝났습니다. 이제부터는 해당 컨트롤들을 실제 코드에서 어떻게 사용하는지 알아보겠습니다.

 

// HelloBadaForm.h File

class HelloBadaForm :
    public Osp::Ui::Controls::Form,
   public Osp::Ui::IActionEventListener
{ …

protected:
    static const int ID_BUTTON_OK = 101;
    static const int ID_BUTTON_GREETING = 102;

    Osp::Ui::Controls::Button *__pButtonOk;
    Osp::Ui::Controls::Label *__pLabel;
    Osp::Ui::Controls::EditField *__pEditField;

}

 

굵게 표시된 부분을 HelloBadaForm.h 에 추가합니다. 버튼에 대한 이벤트 처리를 위해서 ID_BUTTON_GREETING을 선언한 부분과 해당 컨트롤과 연결하기 위해 __pLabel, __pEditField 선언도 합니다.

 

 

// HelloBadaForm.cpp File

result
HelloBadaForm::OnInitializing(void)
{

    __pLabel = static_cast<Label *>(GetControl(L"IDC_LABEL1"));
    __pEditField = static_cast<EditField *>(GetControl(L"IDC_EDITFIELD1"));
    Button* pButton1 = static_cast<Button *>(GetControl(L"IDC_BUTTON1"));
    pButton1->SetActionId(ID_BUTTON_TEST);
    pButton1->AddActionEventListener(*this);

    return r;
}

 

void
HelloBadaForm::OnActionPerformed(const Osp::Ui::Control& source, int actionId)
{


    switch(actionId)
    {
    case ID_BUTTON_OK:
        {
            AppLog("OK Button is clicked! \n");
        }
        break;
    case ID_BUTTON_GREETING: // 헤더에서 선언된 스태틱 변수
        {
            String name(__pEditField->GetText()); // 위에 OnInitializing() 메서드에서 UI 컨트롤과 연결하여 GetText() 메서드를 호출하면 해당되는 값을 가져옴.

            name.Trim();
            if ( name.IsEmpty() ) {
                name.Append(L"bada");
            }

            __pLabel->SetText(L"Hello, " + name);
            this->RequestRedraw(true);

        }
        break;
    default:
        break;
    }
}

 

 

이렇게 추가해주시고, 실행해주시면, 다음과 같은 화면이 보입니다.

 

image

 

TextField에 알맞은 이름을 넣고 Greeting 이라고 적인 Button 을 누르면 아래에 있는 Label에 알맞은 인사하는 문구가 출력됩니다.

 

간단한 컨트롤을 배치하고, 이벤트 리스너를 이용해 UI와 코드가 어떻게 통신하는지 간단하게나마 알아볼 수 있었습니다.

Posted by ILTAL
S/W Development/bada2010. 11. 15. 15:16

바다 SDK의 기본 예제 중 하나인 Basic App을 추가하면, Project Explorer에 다음과 같은 파일이 자동으로 추가되어 집니다.

 

 

  • BasicApp.cpp
    • 메인 애플리케이션 컨트롤러
  • Form 1/2/3.cpp
    • 이 애플리케이션이 갖는 세 개의 폼에 대한 인터페이스
  • FormMgr.cpp
    • 폼 간의 이동과 같은 부분을 관리함
  • BasicAppEntry.cpp
    • 메인 엔트리 포인트로 바다 IDE가 자동으로 만들어주는 템플릿이므로 굳이 수정할 필요 없음.
    • C언어와 C++에서 main function과 같은 기능으로써 애플리케이션이 실행될 때 가장 먼저 호출되는 곳.

 

 

BasicAppEntry.cpp 소스 코드입니다.


20번째 줄에서 int OspMain(int argc, char *pArgv[]) 함수를 보면, C언어와 C++에 Main 함수와 함수명만 빼고는 똑같습니다. 바다 플랫폼에서는 모든 애플리케이션이 이 함수부터 시작한다고 보면 됩니다.

 

22번째 줄에서는 unsigned long으로 정의한 result r에 E_SUCCESS를 대입하고, 에러나 익셉션을 발생시킨 부분은 변수 r을 수정하여 전체적인 프로그램 흐름을 잡습니다.

 

30번째 줄에서 Application Framework이 Osp::App::Application을 상속받은 BasicApp의 CreateInstance를 호출하여 실행합니다. 위에서 ArrayList로 인자값을 모두 할당하여 이 때 같이 던져주는 것을 볼 수 있습니다.

 

약간 특이한 부분이라면 34번 째 줄에서 r &= 0x0000FFFF; 으로 비트 연산하는 것을 볼 수 있는데, 이 부분은 OspMain 함수의 리턴값이 Integer형인데, result가 unsigned long으로 선언되었기 때문입니다. 모두 0xFFFFFFF 로 비트연산해도 무방합니다. 리턴할 때는 꼭 integer로 캐스트해주어야 빌드타임에 에러가 발생되지 않습니다.

Posted by ILTAL
S/W Development/bada2010. 11. 15. 14:06

이제 바다 통합개발환경(IDE) 설치를 완료하고, SDK Sample 중 하나인 Basic App을 실행해보도록 하겠습니다.

 

 

바탕화면에 badaIDE 아이콘을 클릭합니다.

 

 

왼쪽에서 네개의 아이콘은 모두 바다 IDE와 SDK에 관한 문서자료입니다.

마지막에 Workbench 아이콘을 클릭하면 일반적인 IDE와 비슷한 화면이 나타납니다.

 

 

 

윈도우 오른편에 있는 bada SDK Samples에서 Basic App 항목을 선택하고, 마우스 오른쪽 버튼을 클릭하고, ‘Copy into my workspace…’ 를 선택합니다.

 

 

image


이제 Project Explorer 윈도우에 Basic App이 추가된 것을 볼 수 있습니다.

 

 

image

 

이제 추가된 Baisc App 프로젝트를 빌드해보겠습니다. Basic App 프로젝트 항목을 선택하고 마우스 오른쪽 버튼을 누르면 Build Project 항목이 보입니다. 이 항목을 선택합니다.

 

 

image

 

이렇게 빌드가 진행됩니다.

 

 

image

 

이제 빌드가 완료되었으므로, 시뮬레이터를 이용하여 실행해보겠습니다.

Basic App 프로젝트 항목을 선택하고, 마우스 오른쪽 버튼을 선택한 다음 ‘Run As…’ –> ‘bada Simulator Application’ 항목을 선택합니다.

 

 

image

 
화면에서 보듯이 바다 웨이브폰 UI가 씌워진 시뮬레이터 위에서 동작하는 Basic App을 확인해 보실 수 있습니다.

Posted by ILTAL