메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

IT/모바일

코코아 프로그램 만들어보기

한빛미디어

|

2002-12-07

|

by HANBIT

9,119

저자: 마이크 빔(Mike Beam), 역 한빛리포터 왕수용

지금까지는 객체지향언어라는 큰 개념과 Objective-C가 이 개념을 어떻게 구현했는지에 대해서만 다루어 왔다. 이제부터는 본격적으로 프로젝트 빌더와 인터페이스 빌더라는 개발 도구를 이용해 기능적으로는 완전히 동작하는 코코아 프로그램을 만들어 볼 것이다. 하지만 실제로 코딩은 단 한 줄도 하지 않을 것이다.

툴박스

Mac OS X프로그램은 프로젝트 빌더와 인터페이스 빌더, 2개의 개발 도구를 이용해서 만든다. 프로젝트 빌더는 소스를 편집하고, 컴파일하고, 디버그할 수 있는 애플의 통합개발 환경이다. 그리고 프로젝트 빌더를 이용해서 프로그램 제작에 관련된 모든 파일을 한 곳에서 관리할 수 있다.

반면, 인터페이스 빌더는 매킨토시 기본 정신에 따라 그래픽 환경에서 완벽히 동작하는 GUI 요소를 만들고 배치하는데 사용된다.

개발 툴에 대한 자세한 내용을 하나 하나 설명하는 것 보다는, 직접 프로그램을 만들어 가면서 이야기 할 것이 좋을 것이다.


Learning Cocoa

참고 도서

Learning Cocoa
Apple Computer, Inc.


프로젝트 빌더

애플의 프로젝트 빌더는 마이크로소프트의 비주얼 스튜디오나 코드워리어 정도로 생각하면 된다. 프로젝트 빌더에는 소스코드 편집기, Objective-C 컴파일러, GNU 디버거가 모두 통합되어 들어가 있다. 더구나 프로젝트 빌더를 이용해서 모든 소스코드, 프레임워크, 설정 파일, 프로그램과 관련된 리소스 파일들을 관리할 수 있다. 이 프로그램에 연관된 파일들을 묶어서 모아놓은 것을 "프로젝트" 파일이라 한다.

프로젝트 빌더에는 디바이스 드라이버, 커널 확장 프로그램, 코코아, 카본, 자바 등의 개발을 위한 표준 프로젝트 템플릿 파일이 준비되어 있다. 템플릿 파일에는 그 템플릿에 해당하는 프로그램에 필요한 모든 기본 파일과 기본 코드들이 이미 작성되어 있다. 거기에 더해서 컴파일 선택사항까지 이미 설정되어 있다. 오늘 작성할 프로그램의 형태는 코코아 도큐먼트형(document-based) 프로그램이다.

프로젝트 빌더는 /Developer/Applications 디렉토리에서 찾을 수 있다. 일단 실행한 후, 새 프로젝트를 만들어야 한다. 파일(File) 메뉴에서 새로운 프로젝트(New Project) 메뉴를 선택하면 선택가능한 기본 프로젝트 타입들의 목록이 나온다. 여기서 코코아 도큐먼트형 프로젝트(Cocoa document-based project)를 선택하면 된다. 다음(Next)를 클릭하면 프로젝트 이름과 저장할 디렉토리를 선택하라고 한다. 적당한 디렉토리를 선택한 다음 프로젝트 이름은 "SimpleTextEditor"라고 해준다. 마침(Finish) 버튼을 누르면 새로운 프로젝트 윈도우가 나타난다.


[그림] 새로운 프로젝트 윈도우

프로젝트 윈도우는 몇 가지 부분으로 나누어져 있다. 왼쪽에 있는 부분에는 폴더(프로젝트 필더에서는 실제 파일시스템의 폴더와 개념이 다르기 때문에 이것을 "그룹(Group)" 이라 부름)가 나열되어 있고, 그 안에 프로젝트에 포함되는 각종 파일들과 리소스들이 있다. 실제로 파일 시스템 상의 폴더 구조와는 다르고 단지 프로젝트에서 쉽게 재구성할 수 있도록 되어 있기 때문에 실제로 그룹을 바꾸어 주어도 파일의 위치가 변하든지, 파일이 없어지든지 하지는 않는다.

한가지 조심해야 할 것은, 그룹과 파일 목록(Groups and Files list)에서 파일을 삭제 할 때이다. 파일을 삭제할 때에는 파일을 선택하고 삭제(delete) 키를 누르면 되는데, 삭제키를 누르면 아래와 같은 화면을 볼 수 있다.


[그림] 삭제 대화창

디스크에서 실제로 파일을 지우지 않으려면 "Delete" 버튼을 눌러서는 안된다. 그냥 기본 버튼인 "Don"t Delete" 버튼을 누르면 파일은 사라지지 않고 그대로 남는다. 필자도 가끔씩 별로 신경을 쓰지 않았을 때, 실수로 "Delete"를 눌러 파일을 잃어버린 적도 있다.

그룹과 파일 목록(Groups and Files list) 옆에는 몇 개의 탭이 붙어 있다. 북마크 보기(Bookmark view)를 누르면 파일의 특정한 위치를 북마크해 두고 볼 수 있는데 소스 양이 방대할 경우에 아주 유용하다. 우리가 만들 프로그램에서는 별로 필요할 것 같지는 않다. 타겟 보기(Target View)를 누르면 컴파일 선택 사항이나 실행파일에 관한 설정을 볼 수 있다. 마지막으로, 정지점(Breakpoints)은 디버그 할 때, 정지할 부분을 지정해 준다. 디버깅에 관해서는 다음 번에 좀더 상세히 다룰 예정이다.

툴바 아래에 있는 탭들을 누르면 컴파일러, 런타임 시스템, 디버거의 상황을 볼 수 있다. (프로젝트 빌더는 컴파일러로 gcc를 사용하고, 디버거로 gdb를 사용하기 때문에 GNU 도구를 사용해 본 사람은 이 탭들을 눌러보면 도움이 되는 내용을 확인할 수 있을 것이다.) 그리고 마지막으로, 프로젝트 윈도우의 나머지 부분은 코딩을 할 수 있는 편집 화면 부분이다.

문서 편집 프로그램을 만들기

앞 부분에서도 이미 언급했듯이, 이 프로그램에서는 소스를 단 한 줄도 입력하지 않을 것이다. 믿을 수 없겠지만 사실이다. 직접 간단한 문서 편집 프로그램을 만들어 보도록 하자. 먼저, 코코아에서 어떻게 인터페이스를 만드는지 기본 지식부터 알아보자.

인터페이스 빌더

인터페이스 빌더는 이름에서 생각할 수 있듯이 복잡하고 기능적인 사용자 인터페이스를 손쉽게 만드는 데 사용한다. 인터페이스 빌더에서는 Appkit에 있는 거의 모든 인터페이스 요소들(버튼, 윈도우, 스크롤바, 슬라이드 등)을 준비해 놓고 있다.

인터페이스는 이러한 인터페이스 요소들을 메인 윈도우에 드래그 해서 올려놓고 Objective-C 객체와 연결하면 만들어 진다. 이 객체는 인터페이스와 프로그램 코드상의 객체를 상호 연결해주는 고리 역할을 한다. 첫 프로그램을 만들어 가면서 이 인터페이스 빌더의 구성요소들을 살펴보면 좀 더 쉽게 이해가 갈 것이다.

NIB 파일

코코아는 인터페이스를 NIB 파일을 통해 관리한다. 또한, 이 인터페이스는 nib 확장자를 가진 파일로 저장되고 이 파일은 인터페이스 빌더를 통해 생성하고 수정한다. NIB 파일은 기본적으로 인터페이스 상의 모든 요소를 표현하는 객체를, 속성과 다른 객체와의 연결 정보를 그대로 지닌 채 저장(archiving) 하는 것이다. 이전 기사에서 객체 지향 프로그램은 객체들의 네트워크라고 한 적이 있다. 바로 이 NIB 파일이 인터페이스와 관련한 모든 객체들의 작은 네트워크이다.

그래픽 사용자 인터페이스를 가진 모든 프로그램은 메인 윈도우와 메인 메뉴를 포함하는 메인 NIB 파일을 가지고 있다. 또한 메인 NIB 파일이외에도 얼마든지 많은 NIB 파일을 가질 수 있다. 일반적으로는 프로그램에서 특정한 윈도우마다 하나의 NIB파일을 가지고 있다. 예를 들면 환경 설정 윈도우는 기본 NIB 파일이 아닌 환경설정 NIB 파일에 저장된다.

우리가 만드는 도큐먼트형(document-based) 프로그램에는 2개의 NIB 파일이 있다. 하나는 프로그램 전체에 필요한 메뉴바를 저장하고 있고, 또 하나는 도큐먼트 윈도우의 인터페이스와 관련한 것을 가지고 있다. 도큐먼트 인터페이스라고는 오른쪽의 스크롤바와 위쪽의 자(ruler) 뿐이지만, 사용자가 이용할 수 있게 하기 위해서는 직접 만들어 주어야 한다.

(덧붙이는 말로, NIB 파일은 지난번에도 말한 Mac OS X에 숨어있는 NeXT의 흔적중의 하나이다. NIB은 NeXT Interface File의 약자이다. 그리고 글을 읽다보면 왜 모든 코코아의 클래스 이름이 NS로 시작하는지 의문이 들것이다. NS는 NextStep의 약자이다. 특별한 이유는 없지만 필자는 이 점이 마음에 든다.)

사용자 인터페이스 만들기

프로젝트 빌더의 그룹과 파일 목록(Groups and Files list)에서 리소스(Resources)라고 적힌 그룹 옆의 화살표를 클릭하면 그룹이 열린다. 그 그룹 내에는 프로그램의 NIB 파일들이 있다. 모든 코코아 도큐먼트형 프로그램 템플릿은 기본적으로 MainMenu.nibMyDocument.nib 2개의 NIB 파일이 들어있다. MainMenu.nib은 프로그램 전체에 쓰이는 것이고, MyDocument.nib는 도큐먼트 하나를 위한 NIB 파일이다.

MainMenu.nib를 더블클릭하면 인터페이스 빌더에서 열린다. 인터페이스 빌더에 3개의 윈도우를 볼 수 있을 것이다. 하나는 메뉴바를 표시하는 것이고 탭이 여러 개 있는 윈도우에는 NIB 파일 내에 저장될 객체들이 나열 되어 있고, 마지막 또 다른 윈도우는 팔레트라는 것이다.

인터페이스 빌더에서 팔레트는 Appkit에 정의되어 있는 클래스들을 기능적으로 분류해서 모아 놓은 것으로 일종의 가져다 쓸 수 있는 인터페이스 객체들의 모음이다. 자신이 만든 클래스로 새로운 팔래트로 만들 수도 있다. 팔레트는 코코아의 플러그인 방식을 아주 잘 보여주는 본보기이다. 프로그램에 플러그인을 만들어서 프로그램의 기능을 추가하는 것은 코코아에서는 아주 간단한 일이다.

먼저 프로그램의 메뉴부터 수정해 보자. 코코아-메뉴(Cocoa-Menu) 팔레트에는 미리 만들어 놓은 몇 가지 기본적인 메뉴가 있다. MainMenu에 몇 가지 메뉴를 추가하려면 팔레트에서 원하는 메뉴의 원형(prototype)을 선택한 다음 원하는 위치에 끌어다 놓으면 된다. 이미 놓여있는 메뉴도 드래그 해서 위치를 바꿀 수도 있고 선택을 한 다음 delete키를 눌러서 삭제할 수도 있다.


[그림] MainMenu에 새로운 메뉴 추가하기

NIB 파일을 저장하고, 다시 프로젝트 빌더로 돌아오자.

MyDocument.nib 파일을 열고 인터페이스 빌더를 보면 똑같은 화면이 나타나는데 조금 달라진 것으로 이제는 MainMenu 대신에 빈 윈도우가 하나 보일 것이다. 이 빈 윈도우에 도큐먼트의 인터페이스를 그려넣을 것이다.

여기에 그려넣은 내용이 프로그램 실행시 모든 도큐먼트 윈도우가 생길 때마다 나오는 모양이 될 것이다. 여기서는 간단히 NSTextView 클래스를 이용한 텍스트 뷰 인터페이스만 넣을 것이다. NSTextView 클래스는 텍스트를 다루는 NSText 클래스의 하위 클래스이다. NSText 클래스에는 많은 양의 텍스트를 관리할 수 있는 기능들이 포함되어 있다. 또한 NSTextView 클래스에는 텍스트 데이터와 관련된 사용자 인터페이스 부분이 포함되어 있다.

예를 들어 NSText 클래스에서는 오려두기, 붙이기, 선택 하기, 정렬, 그리고 텍스트의 색깔이나 폰트 변경하기와 같은 기능을 코드상에서 할 수 있도록 되어 있다. 반면 NSTextViewNSText에서 구현해 놓은 기본적인 기능을 인터페이스로 접근할 수 있도록 해놓은 것이다. 시간이 나면 이 두 클래스를 설명해 놓은 문서를 읽어볼 것을 권장한다. 온라인 Appkit 참조 문서를 보면 찾을 수 있다.

일반적으로 NSTextViews에는 NSScrollView를 이용한 스크롤바가 포함되어 있다. 이것은 모든 텍스트가 윈도우 안에 한번에 보이지 않기 때문에, 위아래로 스크롤 하면서 볼 수 있게 해놓은 것이다. 인터페이스 빌더는 이 두 클래스를 하나로 묶어두었기 때문에 NSScrollView에 대해서는 별로 신경 쓰지 않아도 되지만 알고 있는 것이 좋다.

NSTextView 객체의 원형(prototype)은 Cocoa-Data Views 팔레트에서 찾을 수 있다. NSTextView는 팔레트에서 가장 큰 모양이다.

NSTextView 객체를 팔레트에서 윈도우로 끌어다 놓는다. 위치는 아무데나 상관없다. NSTextView 객체를 윈도우에 올려놓은 뒤, 위치나 크기를 바꿀 수 있다. 인터페이스 빌더의 최근 버전은 객체가 적당한 위치에 놓이면 가이드라인이 나타나는 기능이 포함되어 있다. 이 가이드라인이 아쿠아 인터페이스에서 기본이 되는 위치이다. 이 가이드라인에 따라 만들면 일관성 있고 잘 정리된 인터페이스를 손쉽게 만들 수 있다.

이번에는 텍스트 뷰의 몇 가지 속성을 변경해 보도록하자. 텍스트 뷰를 선택한 다음, 툴(Tools) 메뉴에서 정보 보기(View Info)를 선택해서 인스펙터(Inspector) 창을 열어보자. 정보 창(Info Window)의 타이틀에는 "NSTextView Info"라고 나올 것이다. 그렇지 않다면 텍스트 뷰를 다시 한번 클릭해 주면 된다. 정보 창의 팝업 메뉴는 속성 보기(attributes info)가 선택되어 있을 것이다. 만일 선택되어 있지 않으면 다시 팝업 메뉴를 이용해서 선택해 주면 된다.


[그림] 속성 보기

이제는 텍스트 뷰에서 그래픽도 불일 수 있게 하고, 실행 취소 명령도 가능하도록 해보자. "그래픽 가능(Graphics allowed)"과 "실행 취소 가능(Undo allowed)"이라고 쓰여 있는 체크박스를 선택해 준다.

마지막으로, 위 팝업 메뉴를 눌러서 크기(Size)라 쓰인 메뉴를 선택해 준다. 여기서는 윈도우 크기가 변할 때 텍스트 뷰 사이즈를 어떻게 변경해 줄지를 결정해 준다. 일단 가운데 상자 안에 있는 가로줄과 세로줄을 클릭해서 스프링모양이 되도록 해준다. 이것은 만일 윈도우 크기가 변했을 경우, 텍스트 뷰의 가장자리와 윈도우와의 거리는 항상 일정하게 유지해주고, 스프링은 나머지가 일정 거리를 유지하게 하기 위해서 자신의 크기가 변할 수 있다는 것을 뜻한다.


[그림] 크기 옵션 설정

다른 방법으로는 상자의 바깥쪽 선을 스프링으로 바꾸어주고, 상자의 안쪽을 곧은 선으로 해준다. 이렇게 해서 윈도우 크기가 바뀌면 텍스트 뷰의 크기는 가만히 있고 윈도우와 텍스트 뷰의 거리만 변경될 것이다.

이제 NIB 파일을 저장하고 다시 프로젝트 빌더로 돌아가서 빌드하고 프로그램을 실행해 본다. 아직 아무런 코딩도 하지 않았다. 모든 것이 코코아 객체만을 사용한 것이다.

빌드하기와 프로그램 실행하기

빌드와 프로그램 실행은 툴바에 있는 망치모양과 모니터 모양을 겹쳐놓은 아이콘을 클릭하면 된다. (실행하기 전에 먼저 프로그램을 컴파일 할 것이다.) 또는 간단하게 command-R 키를 눌러도 된다.

프로그램이 실행되면, "무제(Untitled)"라고 쓰인 빈 윈도우가 뜰 것이다. 메뉴를 이것 저것 눌러보고, 무슨 메뉴가 사용가능한지 알아보자. 철자 검사, 자간 간격 조정(Kerning), 영문붙여쓰기(ligature), 실행 취소 등이 가능하다. 이밖에도 여러 가지 더 가능한 것들이 보일 것이다.

아직 아무런 코드도 짜지 않았기 때문에 이것들은 아무런 동작을 하지 않을 것이라 생각을 했을 것이다. 단지 나중에 구현해야 할 기능들이라고 생각할 것이다. 그래도 한번 해보자. 윈도우 내에 글자를 좀 써 보고, 메뉴를 한번 실행해 보자. 와! 모두가 실행 가능한 것들이다.

모두가 다 제대로 실행이 된다. 텍스트를 변경할 수 있고, 폰트 스타일 변경도 가능하고, 철자 검사, 실행취소가 모든 것이 가능하다. 인터페이스 빌더에서 "그래픽 가능"을 설정한 것을 기억해 보자. 이미지 파일을 한번 드래그 해서 가져와 보자. 이미지 파일을 도큐먼트 윈도우 위에 드래그 해보자. 이미지가 도큐먼트에 들어간다. 이 모든 것이 너무도 놀랍다.

이것이 바로 코코아와 Appkit의 강력한 점이다. 코코아와 맥을 선택함으로써 이 모든 것이 공짜로 이루어진 것이다. 그렇지만 이것은 단지 많은 것들 중에서 일부에 지나지 않는다. 이것이 놀라움의 끝이 아니다. 이제 코코아의 세계에 들어온 것을 진심으로 환영한다.

무슨일이 일어난 것일까?

어떻게 아무런 코딩을 해주지 않았는데도 이러한 일이 가능한 것일까? 텍스트 뷰를 메인 윈도우에 올렸을 때, 우리는 NSTextView 클래스의 인스턴스를 우리 프로그램에 생성한 것이다. 이 객체가 생성됨으로써 이 NSTextView와 그 상위 클래스인 NSText에 포함된 모든 기능을 구현한 코드들이 우리의 프로그램과 연결된 것이다. 마술같은 일이 여기서부터 시작된 것이다.

NSText 클래스는 첫 기사에서 쓴 내용의 가장 좋은 예제이다. 애플은 프로그래머가 기능을 처음 부터 일일이 구현하지 않아도 되도록 많은 기능을 가진 것들을 이미 다 구현해 놓았다. NSText가 구현해 놓은 것이 바로 우리가 본 멋진 그 기능들이다. 자간 간격 조정, 폰트 스타일 변경, 철자 검색, 정렬, 자기능. 이 모든 기능은 NSText 클래스 내에 구현이 되어 있고, 그 하위 클래스인 NSTextView의 인스턴스를 만듬으로써 모든 기능을 이용할 수 있게 된 것이다. NSTextNSTextView의 클래스 설명 문서를 읽어 보면 좀더 자세한 내용을 알 수 있다.

공짜로 얻을 수 없는 것들

모든 것이 공짜로 되는 것은 아니지만, 이정도만 해도 그리 나쁜 편은 아니다. 아직은 자동으로 문서를 저장할 수 있는 것도 아니고, 저장한 문서를 여는 것도 할 수 없다. 그렇지만 이러한 기능도 쉽게 추가할 수 있다. 다음 기사는 여기에 관해 다룰 것이다.

다음 번에는 이 프로그램을 가지고, 코드를 조금 추가하여 파일 저장과 파일 열기 같은 기능이 되도록 할 것이다. 그리고 코코아의 도큐먼트형 프로그램 만들기에 대해서 조금 더 알아볼 것이다. 또 다시 얼마나 많은 것들이 코코아에 이미 구현되어 있는지도 알게 될 것이다.
마이크 빔(Mike Beam)은 Geo Center Inc의 프로그래머이며 현재 오라일리 Cocoa 관련서를 집필중이다.
TAG :
댓글 입력
자료실