정보공간_1

[bada 모바일플랫폼] basics of bada Programming 1 본문

IT 놀이터/IT Storehouse

[bada 모바일플랫폼] basics of bada Programming 1

알 수 없는 사용자 2011. 6. 6. 10:23

basics of bada Programming 1



 안녕하세요! 열정 하나로, 바닷물을  붉은색으로 젖히는 '붉은고래'라는 닉네임을 가지고 있는  삼성 소프트웨어 멤버십 20기(부산지역) 이승철입니다.
 
 저번 시간에 바다 플랫폼에서 개발하기 위해, SDK 설치와 Hello bada! 프로그램을 만들었습니다. 
오늘은 basics of bada Programming1  라는 주제를 잡고,  바다 플랫폼에서 앱 개발을 하기 위한 기초적인 설명을 하도록 하겠습니다. 
  

바다 모바일 플랫폼은 다중 패러다임프로그래밍언어(multi paradigm programming language)인 C++ 기반으로 되어 있습니다.

 
                                                     [그림 1]   C++의 언어적 특징.

원래 C++은 
절차적
(procedural) 프로그래밍, 객체지향(object-oriented), 함수식(functional), 일반화(generic)개념 까지 지원 하는 다중 패러다임 프로그래밍언어(multi paradigm programming language)로써, 엄청난 표현력과 유연성을 가지고 있습니다. 

하지만, 바다 모바일 플랫폼은 "C++ 기반의 객체 지향적인 '바다 언어'라고 생각 해야합니다. 
기본적으로 클래스, 캡슐화, 상속, 다형성, 가상 함수등 객체 지향 설계의 규칙 대부분이 그대로 적용이 가능 하지만, 몇가지 바다 모바일 플랫폼만의 특색을 이해해야 합니다.

  

                                                   [그림 2] 바다 플랫폼의 특징.



표준 C++에서 Interface라는 키워드가 없음에도 불구하고, I+ClassName으로 명명하여, 인터페이스를 설계하여 활용하였습니다.
(인터페이스에 대해서는 앞으로 강의에 설명할 예정입니다. ^^)

또한 예외처리 부분에서도 try/catch보다는 bada exception mechanism을  사용을 권장 하고 있으며, STL(Standard Template Library)의 Collection보다는 
bada Collection을 사용 합니다. 
이처럼, 속도가 빠르고, 안정화된 바다 앱 개발을 하기 위해서는 바다 모바일 플랫폼만의 언어적 특징을 잘 이해하시고, 프로그래밍 작업을 해야 합니다. 

그럼 지금 부터 basics of bada Programming
의 첫번째 단계인 메모리와 할당에
대해 설명 하겠습니다. 

  
- 메모리 할당과 해체 -
 바다 플랫폼에서 개발자가 아래의 코드와 같이 메모리를 할당 하게 되면, 메모리 사용이 종료된 후에는 반드시 그 메모리를 명시적으로 해체해 주어야 합니다. 

 Object* pObj = new Object();

 ........ // 코드 생략.

delete
pObj;
명시적으로 해체를 하지 않을 경우, 메모리 누수가 발생 합니다.  
 

ContentSearch search; result r = search.Construct(CONTENT_TYPE_IMAGE); if(IsFailed(r)){ } //Call GetValueListN() of ContentSearch IList* pValueList = search.GetValueListN(L"Author"); if(IsFailed(GetLastResult())){ //do something for an error } //Delete resource pValueList->RemoveAll(true); delete pValueList;


바로 위의 소스 코드처럼, 내부적으로 메모리를 할당하여 사용하는 메소드들에 대해서는 메소드 이름 뒤에 "N"이라는 알파벳을 붙여서 개발자들이 메소드의 이름만 보고도 메모리를 해체 해야 한다는 사실을 알리고 있습니다. 

이처럼, 할당된 메모리는 리소스 누수를 막기 위해, 반드시 delete 연산자를 통해서 메모리 해체를 해야 합니다. 

하지만, 바다 플랫폼에서는 몇가지 예외적인 규칙이 있습니다.
모든 컨트롤들은 객체를 할당하여, 힙에 의해서 관리 되어야 하고, 개발자가 꼭 명시적으로 자원을 해체 할 필요는 없습니다.

Button *pButtonnew Button();

pButton->Construct(Rectangle(10, 100, 460, 60));

pButton->SetText(L”붉은고래”);

pButton->SetActionId(10);

pButton->AddActionEventListener(*this);

AddControl(*pButton);


 위의 예제 소스 코드는 바다 모바일 플랫폼에서 Button 객체를 생성하였습니다. 
생성된 Button 객체는 프로그램이 종료 될때 자동적으로 해체가 되므로, 절대로 
개발자가 명시적으로 delete 연산자를 이용하여, 절대로 메모리 해체를
하시면 안됩니다. 

하지만, MessageBox, ContextMenu, OptionMenu, Popup(
[그림3] 참고) 와같이 명시적으로 개발자가 delete 연산자를 이용하여 직접 메모리 해체를 해야 합니다.  

                                                      [그림 3] 명시적으로 메모리 해체 해야 하는 컨트롤
 
다시 말해, MessageBox, ContextMenu, OptionMenu, Popup 와 같은 Container들은 개발자가 직접 명시적으로 메모리 해체를 해줘야 하지만, Button과 같이 Child Control들은 부모Container가 파괴 될때, 자동적으로 Child Controls을 delete를 해줍니다. 따라서 개발자가 Child Controls에 대해서는 메모리를 해체 할 필요가 없습니다.

그럼 아래의 예제를 한번 살펴보고, 이번 강의를 정리 하도록 하겠습니다.

- 소스코드 설명:
   Child Controls인 버튼 객체 생성 하여, 
Popup Container에 넣기
 

result bada::OnInitializing(void) {

result r = E_SUCCESS;
 

__pPopup = new Popup();


Dimension dim(300, 400);


__
pPopup->Construct(true, dim);


__
pPopup->SetTitleText(L"Popup Test");


Button* 
pBtnClose = new Button();


pBtnClose
->Construct(Rectangle(10, 10, 250,
60), 
L"Close");


pBtnClose
->SetActionId(ID_BUTTON_CLOSE_POPUP);


pBtnClose
->AddActionEventListener(*this);


__
pPopup->AddControl(*pBtnClose);


}


result bada::OnTerminating(void) {

  result r = E_SUCCESS;

  delete pPopup;

  return r;

 
 Container : Popup delete(0)
 Child Controls : Button delete(x)

- 실행 결과 화면 - 



※ 오늘의 강의 정리!    ★ 꼭 기억 하세요 ★
 
1.  모든 컨트롤들은 힙에 생성해야 한다. 
2.  Container Controls들은 명시적으로 메모리 해체를 해야 한다.
3. Child Controls들은 메모리 해체를 할 필요가 없다.  



 이번강의는 바다 모바일 플랫폼에서 꼭 지켜야 할 메모리 할당과 해체 부분에 대해서 강의를 하였습니다.
혹시 잘모르는 경우가 있을 경우에는 아래의 메일로 연락 주시거나(lscpjyoon@gmail.com), 댓글을 남겨주세요. 

 
다음 강의에서는 더욱더 알찬 정보를 가지고 오겠습니다. ^^
좋은 하루 보내세요!