BeOS Programming

From 흡혈양파의 인터넷工房
Revision as of 15:38, 24 March 2013 by Onionmixer (talk | contribs) (BeOS 프로그래밍 이야기 페이지 추가)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search
BeOS 프로그래밍 이야기


BeOS 프로그래밍 환경

왜 당신은 Be에서 프로그램을 짜려 합니까? 아마도 여러가지 이유를 찾을수 있겠지요.... 상업적인 목적이든 비상업적인 목적이든 이 글을 읽는 당신은 이미 Be에서의 프로그래밍을 원하는 사람일겁니다.... 그렇다면 Be에서의 프로그래밍에는 무엇이 있어야 하는지 부터 하나하나 생각해 보기로 하지요....


BeIDE

정말 다행인 사실이지만 Be는 GCC(egcs)를 제공해줍니다....그것도 C++로 말입니다... 그렇담 예전에 하던 습관대로 그냥 하면 될까요...? 아니요.. 그건 아닙니다...Be에서의 프로그래밍에는 BeIDE라는 프로그램을 사용해야 합니다(현재까지는요..^^)이 프로그램은 Be에서 기본으로 제공하는 editor같은 프로그램으로서 ms-windows의 notepad정도로 생각하시면 됩니다. notepad에서 프로그램에 필요한 project관리 기능을 넣은것이 BeIDE입니다.

commented by 배철환 (chelhan@hotmail.com)
 
유감이지만 BeIDE를 이런 식으로 설명하는 건 너무 과소평가된 것입니다.
프로젝트의 메인제어센터가 BeIDE이고 에디터를 내장하고 컴파일작업과 편집, 디버깅작업을 가능케하는 중심이 되는 통합개발환경입니다. 비쥬얼스튜디오처럼 말입니다.
기존의 유닉스나 여타 운영체제에서 개발된 프로그램들이 프로젝트파일이라는 특정파일형식이 아닌 텍스트파일로 된 Makefile도 지원하기 위해 /boot/develop/etc에 가보면 Makefile의 템플릿이 있습니다. 이부분을 약간 고치면 자신의 프로젝트에 적용하여 컴파일을 할 수 있습니다.
오히려 텍스트 에디터는 vi나 Emacs이 있습니다. 비록 vi는 BeOS설치시 기본적으로 같이 설치되지만 Emacs은 CD에서 찾아서 환경다시 설정해주며 설치해주어야 쓸수 있는 불편함이 있지만 말입니다.


Be book

이건 어떠한 프로그램이 아니라 BeOS를 install하게되면 기본으로 들어있는 file로서 net-positive로 볼수 있습니다.... (welcome to BeOS.html)이라는 file안의 Be Document라는 section에 들어가 있는 문서로서 BeOS에서 프로그래밍을 할때 사용되는 class와 그에따른 함수들이 설명되어 있는 문서입니다. BeOS에는 linux에서처럼 consol상에서의 man page를 이용한 도움이 없기때문에 당신이 원하는 프로그래밍에 관한 자료는 아마도 Be book이 대부분일 것입니다... 당신은 이것을 사용하는 버릇을 들여야 할겁니다.

위에서 본 두가지를 사용할 마음이 되어있다면 당신은 BeOS용 appl을 설계하고 짤수있는 준비가 된것입니다. 여기에 더 필요한것이 없냐구요? 있지요..! 바로 당신의 열정과 시간입니다.

난시간에는 Be에서 프로그래밍을 하기위한 준비물을 살펴 보았습니다. 이제는 어떤식으로 시작해야 되는지를 살펴 보기로 하지요...


BeOS 프로그래밍의 요소

다른 분들은 쉽다고 하시던데... 순 사기라고 생각합니다..T.T 전 익히는데 반나절 걸렸습니다.. 왜냐구요....? 자 이제 이유를 알려드리죠..

Be에서 프로그래밍을 할때는 다음의 세가지 요소로 구분됩니다.

  1. 라이브러리
  2. 소스(.cpp)
  3. 헤더화일(.h)
 
commented by 배철환 (chelhan@hotmail.com)
 
여기다가 resource파일에 대한 이야기를 더 추가했으면 좋겠습니다.
리소스란 프로그램의 한 요소라고 요약해 말할 수 있는 데 그래픽하게 표시할 수 도 있고 전혀 그래픽하게 표현되지 않는 것들도 있습니다.
예를 들면 application의 signature(운영체제가 응용프로그램을 구분해내는 유일한 문자스트링이다)는 전혀 그래픽으로 표시될 것이 아닙니다. 아이콘은 아이콘에디터로 만들어서 그 프로그램이 실행되지 않음에도 데스크탑상에 놓여 그 프로그램임을 나타내는 개체로서 존재합니다.
여러가지 종류의 리소스가 있는데 BeOS는 각 리소스타입에 대해 32비트 정수로 구분하고 있습니다. 무엇보다도 개발에 있어 많은 리소스를 만들게 되겠지만 운영체제가 애플리케이션이 비록 실행중이 아니라도 효과적으로 통신하기 위해 실행파일내에 저장된 타입’APPI’(APPlication Information)을 필요로 합니다.
그래서 .rsrc라는 확장자를 가진 파일을 열어보면 signature와 Application Flags, Supported Types, Version Info라는 항목들을 볼수 있고 32x32크기의 아이콘을 볼수 있습니다. 그중 Application Flags 부분에 보면 Launch(프로그램실행)유형이 Single이냐, Multiple이냐, Exclusive인가를 구분하도록 되어있습니다. Single은 애플리케이션을 더블클릭해서 실행시키면 그 프로그램을 또한번 더 실행시킬수 없지만 사본을 만들어 실행시킬 수는 있고 Multiple은 같은 프로그램을 여러 번 실행시킬수 있으며, Exclusive는 어떠한 경우에서든 동일프로그램이 동시에 실행할 수 없습니다. 그리고 Background App는 사용자인터페이스 없이 백그라운드 상태에서 실행합니다. 예를 든다면 웹서버나 FTP서버들입니다. Argv Only는 운영체제로부터 메시지를 받기를 거부하고 Terminal에서 커맨드라인상에서 실행시킬 때에만 애플리케이션에게 argc와 argv argument를 전달해줄수 있는 동작을 가집니다. 예를 들면 % cp filea.cpp fileb.cpp에서 argv[0]는 cp, argv[1]는 filea.cpp, argv[2]는 fileb.cpp이며 argc는 3입니다.그 창에서 아이콘을 더블클릭하면 아이콘에디터가 실행됩니다.


위의 세가지는 어디서 많이 들어본것들이지요...? 맞습니다.. 마니 들어본것 들입니다... 대부분의 프로그램이 이 세가지로 이루어 지니까요.. 그럼 위의 세가지 요소가 어떤식으로 구분되고 사용되어 지는지 제가 아는 한도내에서 알려드리도록 하겠습니다.. 순서는 당신이 처음 프로그램을 작성하는 시점으로 하겠습니다.

당신은 BeIDE를 실행시켰습니다. 멀거니 허연 화면이 나오지요? 맞습니다.. 당신은 지금부터 이 공간에 프로그램을 짜야 합니다. #include부터 시작해서 main()에 이르기 까지 당신이 작성한 소스는 완벽합니다. 그러면 이제부터 이 소스를 컴파일을 해서 실행을 시켜봐야 할텐데 make는 아무리 누르려고 해도 사용불능이 되어 있습니다... 어떻게 해야 할까요...? 음.... file메뉴의 project에 그 해답이 있습니다.

BeIDE에서 project에 소속되지 않은 소스는 일반적인문서로 취급이 됩니다. 설사 그 소스가 c++의 문법에 맞추어 작성되어 있고 c++의 소스처럼 각 부분이 색색으로 mark되어 잇다 하더라도 BeIDE에게 있어 그것은 일반적인 text또는 Be문서에 불과한 것입니다. 그러면 당신이 만든 소스를 어떻게 프로그램으로 만들수 있을까요...? 일단 file->new project로 당신은 새로운 프로젝트를 만듭니다. 이 과정에서 프로젝트화일이 어디에 놓이는가, 프로젝트의 이름은 무엇인가를 설정하게 되고 당신이 만든 프로그램에서 사용할 lib를 결정하게 됩니다. 프로젝트의 개괄적인 style을 설정하는 과정에서 기본포함lib의 종류가 결정되게 되는데 당신은 Be Appl(맞나?)을 설정하시면 됩니다. 아마도 여기까지 했다면 당신의 프로젝트파일에는 두개정도의 lib가 있게 될겁니다. 이걸 어떻게 확인하냐구요? 자알 보세요. 당신의 새로운 프로젝트 관리창에 두개의 lib가 보일겁니다. 자 이제 프로젝트도 만들어 졌으니 당신이 만든 소스를 이 프로젝트에 포함 시켜 볼까요?

프로젝트 관리자 창에서 소스창으로 이동을 해 봅시다(편의상 "편집창" 이라고 하겠습니다.) 그러면 위에 menu에서 "Add to Project"라는게 사용 가능하게 되어 있을겁니다. 그럼 이걸 눌러주세요. 그렇게 하면 당신의 소스는 이제부터 당신이 만든 프로젝트에서 관리할수 잇게 된겁니다. 당신의 소스가 당신 프로젝트의 일부분이 되었는지는 프로젝트 관리자 창에서 찾아보세요. 당신의 소스가 aaa.cpp라면 같은 화일이름이 거기에 있을테니까요.

자 이제 컴파일을 해봅시다. 프로젝트관리자창에 있는 menu중에서 "Run"을 눌러보세요. 당신이 작성한 프로그램이 정상이라면 컴파일을 마친후에 자동으로 실행이 될것이고 만약에 오류가 있다면 문제부분에 따른 메세지를 출력해 줄겁니다. 참고로 컴파일을 하게되면 소스와 프로젝트 파일은 자동으로 저장이 된답니다.

자. 이제 BeIDE의 대체적인 사용법은 아셨겟지요...? 모르시겠다구요..? 에이..설마... 휴가나온 저도 하는데.. 금방할수 있어요...힘내요!!!


BeOS 프로그래밍 참고사항

자 지난글까지 BeIDE의 간단한....아주 간단한 사용법을 살펴 보았습니다. 구렇담....이제는 Be에서 프로그래밍할때의 도움이 될만한걸 몇자 적어보지여....

일단 이 홈페이지의 맨 처음페이지에 있는 간단한 강좌를 읽어보신분들은 알수 있겟지만 저는 그걸 나름대로의 생각으로 바꾸어 보려 합니다. 제경우는 다른사람과는 달라서 머리가 상당히 나쁘기 때문에 다른사람이 그런식으로 적어 놓으면 못알아 먹습니다. 결국 알아들을때까지 보고 또보고 결국 제 멋대로 해석을 해버리고는 하는데 그걸 여러분들게 설명을 드리도록 하지여...

Be에는 참으로 많은 class들이 있습니다.(물론 다른OS에도 class는 허벌나게 많습니다만...T.T) 그런데 이 class들을 어떻게 사용해야 Be용 프로그램이 나올까요...? 허참... 난감하지요...한글로 된 책도 없고 영문책은 넘 어렵고 이게 현재의 현실입니다. 결국 필요한건 익혀야 하는데... Be에서 중요한 class는 BWindow, BView 이 두가지 입니다. 물론!! 더욱 원초적 으로 중요한 class가 있으니 BApplication입니다. 그러나! 이건 제가 짠 기본적인 프로그램에서는 코딩해본적이 없으니 앞에 글을쓰신 rainow님의 말을 잠시 인용하도록 하지요....

BApplication 클래스

"BApplication은 프로그램을 전체적으로 관리하는 [메인 쓰레드] 역할을 하는 클래스입니다" 자 위의 말을 살펴보지요...메인 스레드라.. 일단 스레드라는 개념부터 설명을 해야 겠군요. 스레드는 간단하게 말하면 "작업단위"입니다. 하나의 작업이 시작된다는 말은 하나의 스레드가 생성되었다는말과 일맥상통합니다. 그렇다면 과면 일반적인 프로그램이 실행되었을때의 스레드는 "메인스레드"가 맞을까요...? 아닙니다. 엄밀한 의미에서는 메인스레드가 아니지요. Be를 예로 들자면 일반적인 프로그램의 위에는 tracker가 상위스레드로 존재합니다. 이걸 parent thread라고 합니다. 그럼 왜 일반적인 프로그램이 실행될때 생성되는 스레드를 메인스레드라고 할까요? tracker같은 스레드는 이러한 프로그램샐행시 생성되는 스레드와는 약간 다른 의미에서의 스레드이기 때문에 편의상 이런 하위스레드들을 메인스레드라고 하는것입니다. 그럼 메인 스레드가 있다는것은 tracker와 일반적인 프로그램의 관계를 볼때 하위스레드를 가질수 있다는 소리가 됩니다. 일단 하위스레드를 child thread라고 하는데 이러한 법칙(?)에 의거, 일반적인 프로그램들은 프로그래머의 의도에 따라 다시 하위 스레드를 가질수 있다는 얘기가 됩니다. 그렇다면왜 이러게 복잡(?)한 스레드 얘기를 꺼냈을까요? 이건 BeOS의 핵심인 SMP기능과도 무관하지 않기 때문입니다. Be는 기본적으로 2개 이상의 cpu를 지원하는데 이 기능을 smp라고 합니다. 그러나! 대부분의 컴퓨터(저 역시도 그렇습니다만...)는 cpu를 1개만 가지고 있습니다. 여기서 cpu scheulling이라는기법이 등장합니다.

cpu스케줄링은 어려운개념이 아닙니다. 여러분이 이것을 직접적으로 제어할 일은 거의 없으며 이거을 매번 프로그래머가 직접 제어하게 한다면 그건 정말로 좋지 않은 OS라고 할수 있습니다. 그러나 Be는 좋은OS이기 때문에 우리에게 이런 부담은 주지 않습니다. 그러나 스레드를 알고자 하면 이런 것들은알아두면 좋기 때문에 그냥 알아보고 가기로 하지요.

여러분이 두개의 프로그램을 실행했다고 하지요. 음악프로그램으로 음악을 들으면서 문서작업을한다고 합시다. 요즈음 나오는 대부분의 컴퓨터는 이런 두가지의 작업이 이루어질때 사용자가 아무런 불편을 가지지 않을 정도로 쓸만한 성능을 가지고 있습니다. 그렇다면 한개의 cpu로 어떻게 이러한 일들이 가능할까요? 그렇습니다. cpu는 우리가 생각할수 없을만큼 빠른속도로 두개의 작업을 왔다갔다하면서 일을하고 있는겁니다. 결국 cpu가 빠르면 빠를수록 여러개의 프로그램을 cpu에게 믿고 맏길수 있겠지요. cpu가 두개인 경우에는 두개가 번갈아 가며 일을하기 때문에 더욱더 system이 원활하게 움직일수 있는거구요. 이쨌든 이러한 일들이 컴퓨터 속에서 벌어지는데 이것들이 원활하게 무리없이 되기 위해서는 각 프로그램에 제어단위가 필요한데 이게 바로 스레드입니다. 스레드에는 우선순위가 있는데 대부분 우선순위는 OS에서 프로그램실행시에 지정해준답니다. 이러한 스레드들이 가지고 있는 정보들을 토대로 cpu는 작업을 하게 되는데 이러한 스레드 생성과 관리에 관한 것을 BApplication class가 책임지게 되는겁니다.(이에따른 child thread에 관한건 다음에 얘기하기로 하지여. 아직 제가 Be에서 하위스레드 생성,관리에 관한걸본적이 없어서리..^^;)


 
commented by 배철환 (chelhan@hotmail.com)
 
그리고 클래스에 대한 이야기가 있었습니다. 이야기를 약간 더 정교하게 하겠습니다. BeOS상에서 실행되는 애플리케이션들은 BApplication클래스로부터 파생된(또는 상속받은) 클래스 타입의 오브젝트(객체)생성을 합니다. 이 애플리케이션 오브젝트는 그 애플리케이션의 메인 스레드를 만들고 이 메인스레드는 애플리케이션과 Application Server와의 연결을 시키게 됩니다. 앞서 Rainbow님의 글에서 말했던 것처럼 BeOS는
 
	
        --------------
        Application   
        --------------
        Server kit    
        --------------
        Server        
        --------------
        Microkernel   
        --------------
        Hardware      
        --------------
	

 
라는 층(layer)가 있습니다. Application Kit에 정의된 클래스인 BApplication클래스에서 파생된 오브젝트는 Application Server와 서로 메시지라는 오브젝트로 통신하게 되는데 예를 들어 사용자가 마우스버튼을 클릭하거나 키보드상의 키를 눌렀을 때 Application Server는 애플리케이션에 이 정보를 알립니다. 이 정보는 메시지의 형태로 전달되며 아까 말한 애플리케이션의 메인스레드가 수신하게 됩니다. 더욱이 BeOS에서는 위의 마우스클릭이나 키보드 눌림, 윈도우의 닫기버튼을 누르기라든지 하는 사용자의 Action을 운영체제가 인지하여 알려줍니다. 이를 시스템 메시지(system message)라 하는데 command constant라는 이름으로 찾을 수 있습니다. 예를 들면 B_KEY_DOWN, B_WINDOW_RESIZED등등입니다. 그래서 운영체제가 알아서 해주는 부분외에 애플리케이션이 정할 수 있는 메시지를 BMessae라는 오브젝트를 정의하여 사용할 수 있습니다. 그럼 메시지를 받고 취급하는 메커니즘은 어떻게 되는 지 알아봅시다. Application Kit에 BLooper클래스와 BHandler클래스가 정의되어 있습니다. Blooper 클래스는 스레드를 하나 생성하는데 이 스레드의 목적은 메시지루프를 실행시키는 것입니다. 메시지가 메시지루프스레드에 도착하면 메시지큐(Queue)에 놓이게 되며 자기차례를 기다리게 됩니다. 메시지가 온 것을 감지하고 받아들이는(dispatch)하는 일을 합니다. 그후 받아들인 메시지는 BHandler클래스의 오브젝트로 보내지고 도착한 메시지를 다루게 됩니다(Handle). 어떻게 다루어지는 가는 도착한 메시지의 유형이 어떠한 것이냐에 따라 다릅니다.
 
돌아가서 Bapplication 클래스를 보면 클래스 상속관계를 보면
	
        BObject ------- BHandler ----- BLooper ------ BApplication
                          |                     |
                          |                     |
                                                ---- Bwindow
	

 
와 같습니다. 다시 말해 BLooper클래스는 BHandler클래스로부터 파생되어 BHandler클래스가 할 수 있는 기능, 즉 메시지를 받아들이는 일을 하는 메시지루프를 실행시키는 스레드를 생성시킬수 있고 BLooper클래스는 거기다 받아들인 메시지를 유형에 따라 처리한다. 그로부터 상속받은 BApplication클래스는 당연히 위의 일을 처리하는 스레드를 만들 수 있다. BeOS의 그래픽유저 인터페이스의 핵심은 윈도우입니다. Interface Kit는 애플리케이션이 윈도우를 포함한 그래픽유저 인터페이스를 제공합니다. Helloworld라는 예제프로그램을 보면
	
        ########################## HelloWindow.h ########################
        #include 
        #endif

        class HelloWindow : public BWindow 
        {
        public:
        HelloWindow(BRect frame); 
        virtual bool QuitRequested();
        };
	

에서 BWindow클래스로부터 파생된 HelloWindow클래스를 볼 수 있습니다. 멤버함수로서 가상함수로 정의한 QuitRequested()는 HelloWindow.cpp에 구현해 놓았습니다. 그런데
	
        bool HelloWindow::QuitRequested()
        {
        be_app->PostMessage(B_QUIT_REQUESTED);
        return(true);
        }
	

과 같이 구현해 놓았습니다. QuitRequested()는 BLooper클래스의 멤버함수인데 BWindow클래스의 상속관계에서 보면 분명해듯 중복(overload)된 것을 알 수 있습니다. HelloWindow클래스에서 QuitRequested()멤버함수를 정의하지 않았다면 Blooper클래스에 있는 QuitRequested()함수가 수행될것입니다. 그렇게 되면 윈도우를 실행시키는 스레드만 죽이게 됩니다. 만약 내가 원하는 바가 윈도우를 닫을 때 애플리케이션까지 종료하고 싶다면 위와 같이 멤버함수를 만들어주어야 합니다. be_app->PostMessage(B_QUIT_REQUESTED); 이 부분을 자세히 보면 윈도우의 닫기버튼을 마우스로 클릭하면 시스템메시지를 생성하여 그 윈도우로 전달됩니다. 윈도우는 BLooper클래스에서 상속된 것으로 메시지루프로 메시지를 잡아와서 또한 윈도우는 BHandler클래스에서 상속된 것이어서 메시지를 처리할 수 있습니다. 그래서 QuitRequested()를 호출하여 메시지를 처리합니다. 그런데 이 함수를 정의하지 않았다면 윈도우는 BLooper클래스에서 정의한 QuitRequested()를 호출하여 실행할 것이고 그 윈도우를 닫게되지만 애플리케이션 자체는 종료시키지 못합니다. BLooper클래스에서 정의된 QuitRequested()함수는 자기자신만의 스레드만 종료시킬수 있어서입니다. be_app는 애플리케이션 오브젝트를 나타내는 전역변수로서 BApplication클래스도 BLooper클래스로부터 상속된 클래스이므로 BLooper클래스에 정의된 함수 PostMessage로 하여금 애플리케이션의 메시지 루프에 메시지 B_QUIT_REQUESTED를 보냅니다. 그 다음에 있는 return(true); 는 자기자신, 즉 윈도우를 종료시키게 되고요. 하나의 윈도우(window)는 언제나 하나 이상의 view를 가집니다. 모든 drawing은 view에서 되고 스크롤바나 버튼, 텍스트박스도 뷰에 놓입니다.
	
        BHandler --- BLooper --- BWindow
               |
               |
               ---- BView   --- BControl --- BButton
	

식으로 클래스계층관계를 가집니다. 그래서 메시지를 처리할 수 있지만 자신의 메시지루프를 실행시키지 못한다는 것을 알 수 있습니다. 그래서 연결된 윈도우(BWindow오브젝트)가 메시지를 받아와서 어떤 뷰가 그 메시지와 관련이 있는 지를 결정해서 그 뷰로 하여금 처리하게 합니다.
	
        ###################### HelloWindow.cpp #######################
        #include "HelloView.h"
        #endif

        HelloWindow::HelloWindow(BRect frame)
        : BWindow(frame, "Hello", B_TITLED_WINDOW, B_NOT_RESIZABLE | B_NOT_ZOOMABLE )
        {
        HelloView *aView;
        // set up a rectangle and instantiate a new view
        BRect aRect( Bounds() );
        aView = new HelloView(aRect, "HelloView", "Hello World!");
        // add view to window
        AddChild(aView);
        }
	

에서 보면 AddChild함수로 뷰를 윈도우의 자식(child)으로 만들어서 HelloWindow클래스의 멤버함수들이 쉽게 접근하고 처리될 수 있게 되었습니다.


BView 클래스

그러면 그다음은 BView입니다. Be에서 BView는 상당히 독특한 class라고 할수가 있습니다. 어떠한 object에 대해 object의 세부적인 모양과 메세지를 받아 동작하는 부분까지 모두 BView가 책임지고 있습니다. 만약에 당신이 Be용 프로그램에서 button을 하나 넣고 싶다면 button의 대체적인 성격을 하나 만든후 세부성격과 눌러졌을때 하는일을 따로 설계한다는 뜻입니다. 이것은 Be에서의 프로그래밍이 상당히 체계적이라는것을 말해줍니다. 두개의 부분을 따로 설계함으로서 수정시에 문제가 나는 부분만을 고쳐서 디버깅에서의 이점을 얻을수 있으며 이러한 모듈화를 통해서 당신이 만든 프로그램에 사용된 object의 재사용성을 극대화 할수 있기 때문입니다. 결국 프로그래밍이 레고를 만들듯 미리 만들어져 있는것으로 만으로도 가능하며, 다른사람이 만든 프로그램중 일부를 가져와서 사용하기도 쉽다는 말이됩니다.(물론 만든사람의 동의정도는 있어야 겠지요^^;) 이런식으로 event부분만 따로 설계한후에 나중에 설명하게될 BWindow에서 button과 event를 가지고 있는 Bview만 합쳐주면 프로그래밍은 끝나는겁니다...하하하하Onionmixer (talk) 00:38, 25 March 2013 (KST) (사실 말은 쉬운데.....이게 까다롭더군요... T.T)


BWindow 클래스

Bwindow는 개괄적인걸 책임집니다. 만들어진 프로그램의 window크기라던가 window의 성격, 에...뭐,..타이틀바가 없다던가...아니면 크기가 고정된가라던가 하는등의 성질을 부여해줍니다. 그리고 현재 window에 나타나야할 object(예를들어 버튼이라던가 메뉴라던가)들의 제어와 이 object와 event간의 연결을 담당합니다. object는 BRect라는 class를 이용해서 window안의 point를 잡고 이부분에 object를 생성하는것으로서 BRect에 들어가는 숫자가 버튼의 크기등을 결정한다고 할수 있습니다.

이상 크게 3가지의 class에 대해 알아보았습니다. 위의 클래스들중 BView와 BWindow는 어쩔수없이 프로그램 코딩시에 만날수밖에 없는 운명입니다. 아마도 무엇을 하는 녀석들인지를 다시한번 살펴보고 그 성격을 잘 파악해 두시는게 좋을겁니다...^^;


BRect 클래스

지난시간에 Be에서 프로그램을 짤때 기본이 되는 3가지 클래스에 대해서 간단하게나마 알아보았습니다. 이번시간에는 BRect에 대해 아는대로 간단히.. 정말로 간단히 알아보기로 하지요.

지난시간에 우리는 BRect class가 BWindow에서 언급된걸 알고 있습니다. 왜 언급이 되엇을까요? 정답을 알려드리지요. 솔직히 말해서 BRect가 없으면 우리가 만든 object들은 window안에 제대로 표시될수가 없습니다. BWindow class는 BRect class를 상속받고 있습니다(아마도..^^;) 이렇게 해서 window의 좌표를 BRect로 관리하고 있는것이지요. BRect는 기본적으로 4개의 값을 가지고 있습니다.(rect관련 헤더화일을 보면 컨스트럭션부분에 나와있습니다.)

BRect(1,2,3,4)


위에서 1은 시작점-가로,2는 시작점-세로 3은 가로-이동거리,4는 세로-이동거리 입니다.

(제 말이 잘 이해가 안간다면 Be book에 BRect section과 비교해가며 보시기 바랍니다. Be book에는 친절하게도 그림도 있습니다.) 이렇게 4개의 값을가지고 논리적인 사각형의 영역을 가지게 되는데 이렇게 영역을 정의한다음 이 영역에 만들어진 button의 inerface부분을 대입시킨다면 그 영역만큼의 button모양이 나오게 되는것입니다. 이 다음에 만들어진 event를 제어하는 BView를 대입해준다면 완벽한 하나의 button이 되는것입니다. 물론 BRect는 영역만을 표시하는것은 아닙니다. 현재 window상의 가상 point를 나타내기도 하는데 이 가상 point야 말로 BRect의 재미있는점중의 하나입니다. Be book에도 나오지만 만들어진 논리적영역의 오른쪽 아래 구석이 결국 point가 되는것인데, 저도 아직은 이걸 쓸기회가 없었지만 별도 언급이 된걸 보면 아마도 프로그래밍시에 주의해야 될 부분인것 같습니다. 자칫하면 원하는 object가 원하는 위치에 안나오는 수도 생길수 있으니까요.... 여러분이 window에서 원하는 위치에 object를 배치하기를 원한다면 BRect는 꼭익혀야할 class입니다.