OS X 10.5에는 Ruby(v 1.8.6)와 Rails(v 1.2.6)가 설치되어 있습니다. Ruby를 이용하여 Cocoa Application을 만드는 방법을 간단히 알아 보겠습니다. 실제 테스트를 해보니 Ruby와 Cocoa가 이정도까지 잘 결합될 수 있는 것이 신기하네요.

1. 프로젝트 생성
사용자 삽입 이미지
New Project를 클릭하고 프로젝트 템플릿의 Max OS X/Application에서 Cocoa-Ruby Application을 선택합니다. 프로젝트명에 'CocoaRuby' 또는 원하시는 프로젝트명을 입력하고 Save 버튼을 클릭합니다.




2. 기존 코코아 어플리케이션과 차이점
사용자 삽입 이미지
그룹에서 보시면 Objective-C의 main.m과 함게 새로 추가된 Ruby의 rb_main.rb 파일이 생성되어 있습니다.



1) main.m
#import <Cocoa/Cocoa.h>
#import <RubyCocoa/RBRuntime.h>

int main(int argc, const char *argv[])
{
    return RBApplicationMain("rb_main.rb", argc, argv);
}

Ruby를 위한 'RBRuntime.h'가 import되어 있습니다. 그리고 Cocoa에서 일반적으로 사용하는 'return NSApplicationMain(argc,  (const char **) argv);' 대신에 RBApplicationMain("rb_main.rb", argc, argv)로 대체되었습니다. 어플리케이션이 시작되면 'rb_main.rb' 루비 스크립트가 실행됩니다.

2) rb_main.rb
require 'osx/cocoa'

def rb_main_init
  path = OSX::NSBundle.mainBundle.resourcePath.fileSystemRepresentation
  rbfiles = Dir.entries(path).select {|x| /\.rb\z/ =~ x}
  rbfiles -= [ File.basename(__FILE__) ]
  rbfiles.each do |path|
    require( File.basename(path) )
  end
end

if $0 == __FILE__ then
  rb_main_init
  OSX.NSApplicationMain(0, nil)
end

* if $0 == __FILE__ then
현재 파일이 메인일 경우에 실행됩니다. 위의 'RBApplicationMain'에서 'rb_main.rb'을 실행하기 때문에 if내의 명령들이 실행됩니다.

* rb_main_init
Ruby에서 코코아와 기타 프레임워크에 접근을 위해 필요한 파일을 include 합니다.

* OSX.NSApplicationMain(0, nil)
기존의 NSApplicationMain을 실행합니다.


3. Ruby AppController 생성

AppController를 Ruby class로 만들어 보겠습니다. NewFile을 클릭하고 아래와 같이 Ruby 항목에서 'Ruby NSObject subclass'를 선택합니다.

사용자 삽입 이미지

FileName에 'AppController.rb'를 입력하고 Finish버튼을 클릭합니다. 아래와 같이 NSObject의 서브클래스로 AppController Ruby 클래스가 생성되어 있습니다. 푸른색으로 되어 있는 부분을 추가합니다.

require 'osx/cocoa'

class AppController < OSX::NSObject
    ib_outlet :inputText
    ib_outlet :outputText
   
    def buttonClicked(sender)
        OSX.NSLog("Button Clicked");
        @outputText.setStringValue("Hello~ #{@inputText.stringValue}")
    end
   
    ib_action :buttonClicked
end

* ib_outlet, ib_action
IBOutlet과 (IBAction) 대신에 Ruby에서는 ib_outlet과 ib_action을 사용하며 용도는 동일합니다.

* dot(.)
기존 프레임워크들의 클래스 메소드는 '.'를 이용해서 호출하고 함수들은 앞에 'OSX.'를 추가해서 호출합니다.


4. 인터페이스 빌더에서 작업
1) 윈도우
메인 윈도우에 라이브러리에서 Label, TextField, Button을 드래그 해서 아래와 같이 배치합니다.
사용자 삽입 이미지

2) AppController
사용자 삽입 이미지
라이브러리 윈도우에서 'Object'를 드래그해서 MainMenu.nib 윈도우에 드랍합니다.

Object의 Class를 앞에서 만들어 놓은 Ruby의 AppController로 선택합니다.




아래와 같이 inputText는 TextField에 outputText는 Label에 buttonClick는 buttonClicked에 각각 연결합니다.

사용자 삽입 이미지사용자 삽입 이미지

이제 완료되었습니다. 빌드를 하고 실행을 합니다. 아래와 같이 ruby를 입력하고 버튼을 클릭하면 Label이 변경되는 것을 확인할 수 있습니다.
사용자 삽입 이미지

Ruby 스크립트들은 어플리케이션 번들의 Resource 디렉토리 밑에 위치합니다. Ruby는 인터프리터 방식으로 실행되기 때문에, 배포 후에도 사용자들이 목적에 맞게 Ruby(*.rb) 파일을 수정하여 어플리케이션을 쉽게 변경할 수 있습니다.
 
사용자 삽입 이미지