ÄForte for Java と J2ME WireIess SDK fo 「ロ oJa による i アプリの作成 ーションのデバッグ時には , けっこう便利 なツールかと思います 工デイタのカスタマイズは , メニューの [ ツール ] → [ 汎用オプション ] で設定できま す。フォントの色やキーの割り当てを変更 するだけでも便利になると思います。 i アプリの登場によって携帯電話で気軽 にゲームが楽しめるようになりました。す でにいくつかのソフトハウスや一般ユーザ が , いろいろなゲームを競って公開してい ます。ファミコン時代の懐かしいゲームも グで watch クラスと main クラスを選択しま ると思います。 この 2 つのファイルをサー いくつかあり , とてもおもしろいと思いま しよう ( フィルタリングを設定してディレ バにアップロードすれば実際の端末で実行 す。 i アプリに興味を持っている方はぜひ クトリを選択することもできる ) 。 一度開発してみてください。開発には端末 できるようになります。 あとはダウンロードするべージの HTML の性能やアプリケーションサイズの制限な ・エミュレータで実行してみる ファイルを用意し , その中に List 3 のよう ど , さまざまな問題 ( コラム 2 ) があります これで , やっとエミュレータで実行でき にリンクを記述すればできあがりです。 が , 決められた枠の中でできる限り優れた る状態になりました。長かったですね。 ものを作ろうと努力することは , とてもい ADF ファイルを右クリック , [ 実行 ] で工 い勉強になると思います。 ミュレータが起動します。 i アプリ関係の情報は Atsushi 氏の Webvx さて , 使用方法はだいたい理解していた ・サーバにアップロード だけたでしようか ? 最後にスクラッチパ http://cgi14.plala.or.jp/antun/ ッドのツール起動方法とエデイタのカスタ Windows の工クスプローラで , 作成し に多くの情報があります。開発するときに たアプリケーションのディレクトリを見て マイズについて説明しましよう。 は参考にされるとよいでしよう。 工ミュレータで実行したアプリケーショ 最後になって言うのもなんですが , 今回 ください。 JAM と JAR ファイルができてい ンのスクラッチパッドはツールで参照でき 初めて本誌に執筆させていただきました。 i アプリを表示する HTML どんなことにせよ初めてというのは緊張す るようになっています。ツールを起動する には ADF ファイルを右クリックし , [ ツー るものです。本稿に関してご不明な点 , <OBJECT declare id="application. declaration" data="watch. j 明を type="app lication/x- jam"> く / 0 & 宿 CT > ・ ル ] → [ スクラッチパッドの参照 ] となりま 意見などございましたらメールをいただけ <a ijam="#application. declaration" 耻 ef 5 タ・ウート・く / a > ればと思います。よろしくお願いします。 す。スクラッチパッドを使用するアプリケ Fig. 4 watch クラスと main クラスを選択 Fig. 3 ADF ファイルとソースを追加 0 ファイルシステム や 0 w 山 ・クラス w 山 0 フィールド 0 コンストラクタ ? m メソッド 朝師ーパターン ーー物に 0 物れ′ゴ u-AVA 、等第物 クリア、 おわりに まみ 1 第フィルダりング ~ 、 に ! をユンをンツ圧第 をフィルター 0 ファイルンスデム 、そのほかの機能 Coiumn 2 ず処理速度がかなり異なっています。また , 「ある 機種は画像の描画は速いが , 矩形描画はかなり遅 い」 , 「音楽を鳴らすと処理全体が遅くなる」といっ た同じ機種でも処理によって速度が変わるといった 現象も見られます。 各機種ごとに JAR ファイルを用意するという対応 もありますが , これはけっこうめんどうだと思いま す。携帯の機種名は CGI で取得 ( 環境変数 HTTP_US ER_AGENT) できるので , 起動時に CGI にアクセス して機種を判別し , ウェイト値を調整するといった 方法を使用すれば JAR ファイル 1 つで対応すること ができます。もちろん機種の判別は一度行えば十分 なので , 機種名やウェイト値などをスクラッチパッ ドに保存しておくべきです。 このように i アプリ開発にはいくつかの問題があ りますが , 端末の性能はどんどんよくなっていくと 思います。しばらく我慢するしかありません。 i アプリの開発でとくにつらいのは , 主に 2 つあり ます。 1 つは JAR ファイルのサイズとスクラッチパ ッドの容量です。それぞれ 10K バイトしかありませ ん。しかも , JAR ファイルにはプログラムだけでな くリソースも含むので , あまり大きなプログラムを 組むことはできません。 それでも , できる限りの完成度を持たせたい場合 は JAR ファイルを極限まで減らす努力をしなければ なりません。まずリソースはできるだけ使用しない ほうがよいでしよう。画像や音楽データはサーバか らダウンロードするという方法をとり , リソースを なしにしておけば JAR ファイルの 1 OK バイトをフル にプログラムに使用できます。当然 , 毎回起動する たびに同じ画像のダウンロードをするのはムダです し , バケット料金も高くなります。こういう場合は 初回起動時にスクラッチバッドにダウンロードした データを保存しておけば , 2 回目以降の起動のとき にはスクラッチパッドからデータを読み込めばいい ので接続しなくてもよくなります。初回起動時かど うかを判別するには , スクラッチパッドの 1 バイト 目あたりに初回起動時フラグなどを書き込んでおけ ばできるでしよう。 プログラムの組み方も JAR ファイルのサイズに影 響してきます。 JAR ファイルを小さくするための方 法としては , ・ switch 文は使用せずに if 文を使用する ・変数名 , 関数名の長さも JAR ファイルサイズに 影響するので , できるだけ 1 , 2 文字にする ・クラスはできるだけ少なくする。 2 つまたは 3 つ 程度がベスト といったものがあります。 もうーっつらいことは , 機種間の性能の異常なま でのバラっきです。 i アプリ対応端末は数機種あり ますが , 同じような時期に発売されたにもかかわら 特別記事 ForteforJava と J2ME Wireless SDKfor DoJa による i アプリの作成 1 51
時計を表示する i アプリ ( クラス定義ファイル ) package watch; * Created on 2001 / 04 / 06 , 13 : 21 * watch. java * @version * @author KIT-M import com.nttdocomo.ui.*ー m. start(); DispIay. setcurrent(m); m = new main( p は 0 void a ( ) ( / * * start of new application * / public static main m; public class watch extends IAppIication ( ROM に収録されているファイルから内容 ist 2 のように記述してください。付録 CD- t 1 のように , main クラス定義ファイルを L い。そして watch クラス定義ファイルを Lis ルクリックして , 工デイタを開いてくださ 工クスプローラのクラスファイルをダブ ・ソースを記述 は Fig. 3 のようになりました。 してください。この段階で工クスプローラ ッケージ名を「 watch 」としてそれぞれ作成 空のソースファイルの名前を「 main 」 , パ の名前とパッケージ名を「 watch 」として , } / / resume m. timer—start ( リ / / タイマー再開する public void resume( ) / / resume - 何らかの原因でタイマーが停止した場合の処理 ・ ADF ファイルの設定 割愛させていただきます。 ドの内容についての説明は , 誌面の都合上 をコピーしてもかまいません。 ソースコー ンツ」タグはどれをコンパイル ( パッケージ ) タ」タグは JAM ファイルの設定 , 「コンテ イアログが表示されます。「ディスクリプ く ] を選択してください。 ADF 設定用のダ す。 ADF ファイルを右クリックして , [ 開 ルするために ADF ファイルの設定をしま ソースが記述できたら , 正常にコンパイ 対象にするかの設定になります。 150 C MAGAZINE 2 1 6 それでは Fig. 4 のように「コンテンツ」タ 時計を表示する i アプリ ( main クラス定義ファイル ) package watch; import java. . C 引 en import com.nttdocomo.ui.も / / main クラス public class main extends Canvas / / start - 起動時の初期化作業 } 〃土 n setSoftLabeI (prame. SOFT-KEY—2, ”終了″ main( ) / / main - コンストラクタ private ShortTimer st = nul 嵭 } 〃 start timer-start ( system. out. println("start( ) . public VOid start( ) / / D てー描画処理 ) 〃 paint / / ダミーなので何もしない public void paint(Graphics —g) するためには in にを定義しておく必要がある 〃 paint - 描画処理 - 描画処理は醴で行っているがコンパイル } / / processEvent Draw(); / / 画面描画 IApplication. getCurrentApp( ) . terminate( / / so れ KEY2 が押された - アプリ終了 if (getKeypadState( ) = = 0X00400000 ) / / タイマーイベント if = = DispIay. TIMER-. EXPIRED—EVENT){ public VOid processEvent(int い rpe , int param) / / processEvent ーイベント処理 } / / timer-start . sta ( st = ShortTimer. getShortTimer(this, 0 , 1000 / 25 , true); System. gc( public void timer—start( ) / / timer-start - タイマー開始 sec = c. get(calendar. SECOND); min = c. get(Calendar. MINUTE); れ ou て = 0. get(CaIendar. HOUR—OF—DAY); day = c. get(CaIendar. DAY—OF—MONTH); month = 0. get(calendar. MONTH) 十 year = c. get(CaIendar. YEAR); Graphics —g = this. getGraphics( calendar 0 = calendar. getlnstance( リ yea.t' month' day' hour' sec; int private void Draw( ) —g. unlock(true); ”十 gec, 10 , 32 リ ″十 min 十 —g. drawstring(hour 十新 —g. drawString(year 十”年十 month 十を月″十 day 十新日 % 10 , 20 —g. setcolor(—g. getColorOfRGB(255, 255 , 255 ) / / 時間を表示する —g. fillRect(), 0 , getWidth( ) , getHeight( ) -g. setcolor(—g. getCOIorOfRGB(), 0 , 0 ) / / 背景を塗りっぷす -g.lock(); Canvas
ÄForte fo 「 Java と J2ME Wireless SDK for ロ oJa による i アプリの作成 Fig. 1 SeIectComponents で J2ME Wi 「 eless modu を選択 Fig. 2 工クスプローラ [ ファイルシステム ] の表示 ファイルシステム 中い地ね 4 肥を ロ b ま ロ ex 町事お 3 0 ock 市 0 や 0 ←・ 鬱フィールド 0 0 コンストラクタ 0 m メソッド ←・バターン 3e oomporents ーを the 0 ( ・ pc れ印 ts ) 0 」を 0 耘心いい , clea ′せ 0 肥 n い鹵ー n をを 0 ー nst 引し な nts 朝 5472 K 04 質 (V3Main マモ慂 s &JZMF_ 響ⅱ・司を三川 Dd 引を fc-'t• F ら減 for きき ソースファイル Description J2 響 i 尾“土」他 ard 登 0 : ~ 第 fO 「 FO 杙 6 fO 「 J を一 Space R 隣」ⅳ : 材 936 K S 引 b : 352252 . ADF ファイル ー橋炊物 往ぎに ファイルシスデム まず Forte forJava を起動してください。 よう。できるだけ簡単なもので , スケルト ださい。「 D:Ymy_projectYJavaYi-appli 」のよ 初回起動時は , 「現在のプロジェクトは J2 ン的なものということで , 「時計アプリケ うにマウントしたディレクトリが上部に表 ME コンパイラ操作 ( 事前検証 ) を使用して ーション」なんてどうでしようか ? それ 示されると思います。このディレクトリを おりません , 設定しますか ? 」というメッ を作成してみましよう。 選択した状態で右クリックし , [ ツール ] → セージが表示されますので , [@!Ä] を選択 [ プロジェクトに追加 ] を選択してください。 ・新しくプロジェクトを作成する 次に下側にある [ プロジェクト "i-appli"] してください。 起動すると左側に「エクスプローラ [ フ メニューの [ プロジェクト ] → [ 新規プロ タグを選択します。 [ Root ( - > ) ] というのが ァイルシステム ] 」が表示されます (Fig. 2 ) 。 ジェクト ] を選択してください。「新規プロ 追加されていると思います。この [ Root ( - > ) ] を選択した状態で右クリックし , [ 新規パ ツリー形式で表示されているのは , あらか ジェクトを作成」ダイアログが表示される ので , 下にあるテキストボックスにプロジ ッケージ ] を選択します。「新規パッケージ じめ用意されているサンプルアプリケーシ ェクト名として「 i - 叩 pli 」と入力してくださ ョンの内容です。 を作成」ダイアログでパッケージ名を入力 こではとりあえず 「 tetris 」を開いてみました。表示されている い。すると「新規と既存のどちらのファイ するとアプリケーション用のディレクトリ アイコンをダブルクリックすれば , 工ディ ルシステムを使用するか選択してくださ が作成されます ( ディレクトリ名はパッケ い」というメッセージが表示されます。 ージ名と同じ ) 。 タが開き , ファイルの内容が表示されます。 [ADF ファイル ] というのは , アプリケ こでは「新規」を選択してください ( 「新規」 ・ ADF ファイル , ソースを追加する ーションの設定などを管理しているファイ と「継続」の違いについてはユーザーズガイ ルで , アプリケーション 1 つにつき 1 つ必 ドを参照 ) 。次に「ディレクトリをマウント」 アプリケーション用のディレクトリがで 要になります。この [ADF ファイル ] を選 ダイアログが表示されたらプロジェクトを きたので , ADF ファイルやソースファイ 保存するディレクトリを選択します。これ 択した状態で右クリックすると , [ 開く ] , ルを作成していきましよう。 先ほど作成したアプリケーション用のデ [JAR の更新 ], [ 実行 ] などのメニューが表 でプロジェクトが作成されました。工クス ィレクトリを選択した状態で右クリック 示されます。 [ 開く ] はアプリケーションの プローラには新しく作成したプロジェクト し , [ テンプレートから新規作成 ] → [J2M 実行に必要な JAM ファイルの設定など , が表示されていると思います。 [JAR の更新 ] はアプリケーションの構築 , EWireIess ] を選択してください。すると ・アプリケーション用のディレクトリ [Class] , [DOJA] , [Empty] の 3 つが表示 [ 実行 ] はエミュレータでのプログラムの実 を作成する されます。 [Class] は IApplication クラスを 行になります。 定義しているソースの作成 , [D OJA] は 作成したプロジェクトの中には複数のア ADF ファイルの作成 , [ Emp 呼 ] は空のソー プリケーションを登録することができるの で , 各アプリケーションごとにディレクト スファイルを作成します。 では , ADF ファイルの名前とパッケー それでは簡単なアプリケーションを作成 リを用意します。ェクスプローラの下側に ある [ ファイルシステム ] タグを選択してく ジ名を「 watch 」として , IApplication クラス してみたいと思います。題材は何にしまし 特別記事 Forte fo 「 Java と J2ME WireIess SDK fo 「 DoJa による i アプリの作成 149 アプリケーションの作成 1
ド 0 e f0局a旧と J2ME WireIess SDK f0 ′ 003a による i アプリの作成 ~ KIT-M masa26@naa.att.ne.jp http ://macosx2. ncs. gr. jp / ~ masa/ 一三ロ 本誌 2001 年 5 月号の特集 2 「チャレンジ ! i アプリプログラミング」を読んで , 実際に i アプリを作成した方も多いでしよう。そして 3 月下旬には , NTT ドコモ より「 J2ME WireIess SDK for DoJa 」が公開され , i アプリの作成スタイル がさらに広がりました。本稿ではファイルの入手方法 , インストール , i アプリ の作成方法について解説します。 これにより , i アプリの開発方法は次の はじめに いずれかになりました。 ( 1 ) NTT ドコモが公開している DoJa の開 2001 年 3 月 30 日 ~ 4 月 1 日に幕張にて「東 発環境「 KToo 旧 ar 」を使用する Forte forJava で i アプリを開発するには , 京ゲームショー 2001 春」が開催されました。 (2)Sun Microsystems ( 以下 Sun) の Java Forte for Java の本体以外に「 Java2 SDK Sta みなさんは行かれたでしようか ? 桜が咲 統合環境「 Fo e for Java 」を使用する ndard Edition 」と「 J2ME Wireless SDK for いているのに雪が降るという変な日でし ( 3 ) JDK のコンパイラ , DoJa のエミュレ DoJa 」を入手し , 正しい順番でインストー た。さて , 今回のゲームショーには N"IT ルしなければいけません。それぞれの人手 ータなどを直接コマンドラインから ドコモをはじめ , そのほかいくつかのプー 実行する ( コラム 1 ) 先は次のようになります。一部のファイル スで携帯電話がひっそりと置いてありまし ( 4 ) ゼンテック・テクノロジー は付録 CD - ROM に収録されているので , ンが開発した統合環境「 i - JADE 」を使 た。行かれた方は , ご覧になったでしよう そちらをお使いください。 か ? 以前は電車で携帯電話をピコピコい 用する ・ Java2 SDK Standard Edition(J2SE) じっているのを見ると「メールを見ている このうち ( 1 ) , ( 2 ) は内部で JDK のコンパ 1 .3.0 02 のかな ? 」と思ったものですが , 最近では イラを呼び出してコンパイルを行い , DoJa ゲームをやっている人もいるようです。い でエミュレートを行っています。このため J2SE は現在 Sun の Web サイト , ( 1 ) ~ ( 3 ) で作成されるバイナリは同じと くつかのプースに置いてあった 503i シリー http://Java.sun.com/j2se/1.3 / j 証 いえます。 ( 4 ) の i-JADE は「 VisuaI Cafe 」や ズの携帯電話 , それがゲームもできるとい からダウンロードできます。 J2SE のマニ う今話題の「 i アプリ」対応携帯電話です。 「 Forte for Java 」 , 「 Borland JBuilder 」など ュアルも置いてあるので , 同時に入手して 広末涼子が P503i を持ってスターソルジャ さまざまな開発環境で i アプリが開発可能 おくことをお勧めします。ほとんど日本語 ーを「あっ , あっ」と言いながら遊んでる CM です。この方法については前述の 2001 年 5 で書かれているのでとくに問題はないでし を見たという人も多いでしよう。実はこの 月号の特集をご覧ください。 よう。 これらはドキュメントとともに各プラッ i アプリ , Java によって開発されています。 どの方法を使用するにしても , それぞれ トホーム用のパッケージが付録 CD - ROM 長所・短所があるので , 自分に合った方法 i アプリ公開後も , しばらくはエミュレ を選択するといいでしよう。今回は ( 2 ) の に収録されています。 ータと拡張ライプラリが一般公開されてお らず , ホビープログラマの人たちは「まだ Forte for Java を使用した i アプリ開発手法 ・ J2ME WireIess SDK for DOJa か , まだか・ ・・・」と待ちわびていたかと思 について解説します。 います。その後 , 一部のメーカーや有志の Forte forJava について詳しくは本誌 152 NIT ドコモの Web サイト , ページからの開発環境レポート「 ForteforJ 方により , これらが整備されました。本誌 http://www.nttdocomo.co.jp/i/Java/ 2001 年 5 月号の特集 2 「チャレンジ ! i アプ ava 2.0 Community Edition 」をご覧くださ http://www.nttdocomo. CO. jp/i/Java/ リプログラミング」をご覧になった方も多 tool.html い。 Java の豊富なクラスライプラリと無償の からダウンロードできます。このファイル いかと思います については , 付録 CD - ROM に収録されて 一方 , NTP ドコモは 3 月下旬ごろに「 J2M 開発ツールを使用しての開発は比較的取り いません。この web サイトから入手して E WireIess SDK for DoJa 」を一般公開しま 組みやすく , 一般の方も容易に開発ができ した。ライプラリや開発ツールなどが含ま るだろうと思います。本稿が最良な開発環 ください。 i アプリ用 API のリファレンスや SDK のユ れた純正品ともいえるパッケージです。 境を選択する助けになればと思います。 特別記事 Forte for Java と J2ME WireIess SDK fo 「 DoJa による i アプリの作成 1 / 開発環境のインストール
真紀俊男の ローテク講座 super init] が追加されるのですが , おもしろいこと その実態が謎につつまれていることの多 というのも , やはり自分自身の呼び出し に BeastClass を継承したクラス , つまりこ い Object ⅳ e - C の理解につながれば幸いで なのですが , こちらは親クラスにある init こでは CatCIass にも walk メソッドが追加さ す。 メソッドを呼び出します。もし , こで れたのと同じ結果になります。実際に List [ 注 ] うつかり , 11 のようなプログラムを実行させると追 self init] [ 1 ] 常に YES の戻り値となるため 加された walk メソッドをそのまま実行して とすると , そのまま再帰呼び出しになっ BOOL は Objective-C で論理型として利用 しまいます。これは C + + の継承では考えら てハマり込んでしまいます。 されるキーワードであり , YES ( 真 ) または れない技であることはいうまでもありま NO ( 偽 ) のいずれかの値しかとらないこと せん。 カテゴリ (category) になっています。 bjective-C の参考文献 [ 2 ] 回 ease で解放することになっています Objective-C の柔軟性を特徴づけるクラス 実際の解放は dea Ⅱ oc メソッドで行いま 拡張機能の 1 っとしてカテゴリがあります。 残念なことに , Objective-C に関する本は , すが , 参照カウンタによるメモリ管理を カテゴリも継承と同様にクラスを拡張す あまり見つけられません。特集記事で紹 行うため , release メソッドを使います。 al る仕掛けです。継承と違う点は , すでに 介した Apple が公開している「 ObjC. pdf 」は 10C でオプジェクトを確保した時点で参照 存在するクラスにメソッドを追加できる 194 ページ程度の英文ですが , 現時点では カウンタは 1 にセットされ , 複数のポイン ということです ( ただし , インスタンス変 確実に見つけられる文献でしよう。また タから指示されるたびに参照カウンタを 1 数の追加はできません ) 。 Objective-C の原作者が執筆した , ずっ増やします。ポインタの指示を減ら 『オブジェクト指向のプログラミング たとえば , BeastClass を継承して List 9 すときは , release メソッドを使うことで のような CatClass ができているとしましよ 改訂第 2 版』 , B. J. Cox/A. J. Novobilski, 参照カウンタを 1 ずつ減らし , その時点で つこでは CatClass オプジェクトの cry 参照カウンタが 0 だったら release メソッド トッパン旧 BN4-8101-8046-8 メソッドを呼び出しています。 こでカ にも仕様は記述されていますが , この本 は dealloc メソッドを呼び出してオプジェ テゴリを使って BeastClass に walk メソッド 自体が現在 , ほとんど流通していない状 クトを解放します。 を追加しましよう。 [ 3 ] 仮想関数という考え自体がなく 況です。 既存の「@interface BeastClass 」と「@impl 以上 , ざっと , かけ足で Objective-C の概 本来のオプジェクト指向では仮想関数 ementation BeastClass 」の記述はそのまま 要を説明しました。誌面の都合上 , あま という考えはなく , 実行効率を重視する にしてⅡ・ t10 のような一ドを追加します : り詳細な説明ができないのが申し訳ない ために確信犯的に仮想関数を導入した C + + これによって , BeastClass に walk メソット ところですが , 名前をよく聞くわりには , 独自の考えでしよう。 カテゴリで BeastCIass を拡張する オリジナルの CatClass @interface BeastCIass (WalkCategory) ー (void)walk; @end @implementation BeastCIass (WaIkCategory) (void)walk @interface BeastC ー ass : NSObject ( vo 土 d ) c て @end @interface CatC lass BeastC ー ass (void)cry; @end void f( ) CatClass *theCat = [ [CatClass alloc] 土 n 土し [theCat 0 て y ttheCat release]; @end CatCIass オプジェクトで wa ⅸメソッドが使える CatClass * theCat = [ [CatClass alloc] 土 ni し [theCat walkJ; [theCat releasel; 146 C MAGAZINE 2001 6
真紀俊男の ローテク講座 は実際に実行される関数をポイントしてい る CloneProtocoI というプロトコルがあっ たとします。プロトコルは単にインタフェ るのに対し , セレクタはメッセージそのも のを意味し , 具体的な関数やメソッドをポ イスを表明するだけで , プログラムの実装 はここでは行われません ( List6 ) 。したが self はインスタンス自身を指すポインタ イントしているわけではありません。 って , 「@implementation CloneProtoc01 」に Objective-C ではセレクタを SEL 型として です。 C + + や Java でいうところの this に相 扱います。たとえば , List 5 のようなプロ 相当するような記述はなく , 実装は List7 当するものです。 に示すようにプロトコルを継承したクラス List 7 に示した DogClass の init メソッド内 グラムでは theSelector に入っているセレク タ ( ここでは Tobu) に相当するメソッドが で行います。ちなみに List 7 での Clone メ で , se げ initHisName : " ” ] 呼び出されます。 List 5 で使われている @s ソッドの実装は単に自分と同じ名前のオプ elector はコンパイラのディレクテイプ ( dir ジェクトをもう 1 つ作成しているだけです。 としたのは , すでに initHisName という似 ective, 指示 ) でセレクタを取り出すため この DogClass を使ったプログラム例は , たようなメソッドがあり , これを呼び出す のものです。また , performSelector は Fou List 8 のようになります。プロトコルのポ のに呼び出す相手が自分自身であるため , ndation フレームワークの NSObject プロト インタ変数は , self を使ったわけです。 コルで宣言されているメソッドで , 指定し 土 d くプロトコル名 > ところで , その initHisName メソッド内 たセレクタに相当するメソッドを呼び出す で宣言しています (List 8 の 2 行目 ) 。 にある , ものです。 プロトコルを継承したクラスで実装する 通常 , C 言語などの手続き言語ではコー ルバック関数という形で上位の関数がライ @interface DogC lass : NSObject <C loneprotoco プラリを呼び出すときに , ライプラリ側か char mName[128J; ら呼び返される関数を指定したい場合があ ります。オプジェクト指向言語の場合でも コールバック関数の考え方はありますが その際 , 呼び返すオプジェクトとそのオプ ジェクトに与えるメッセージの指定がほし い場合があります。 Objective-C では , その 場合 , メッセージの指定がセレクタの指定 になるわけです。 プロトコル朝 roto 面 l) Objective-C は , C + + のような多重継承を サポートしていません。すなわち , 1 つの クラスしか継承できない単一継承のプログ ラミング言語なのですが , Java と同様に 1 つの実装継承と複数のインタフェイス継承 を認める仕様になっています。インタフェ イス継承に相当する部分を Objec ⅱ ve-C では プロトコルと呼んでいます。 プロトコルの宣言は , Fig. 3 の形式で行 います。またプロトコルを継承するクラス では " く " と " > " でどのプロトコルを継承した かを明示しておきます。 たとえば , オプジェクトのクローンを作 self と super ー ( id ) init; (id)initHisName: (const char * )inName ・ (const char * )name; - (id)Clone; @imp lementation DogC lass ( id ) 土 n 辻 return [self initHisName: ”” - (id)initHisName: (const char *)inName tsuper initl; strcpy(mName,inName); return se ー f ー (const char *)name return mName ー (id)Clone DogCIass *theCIone = [ [DogCIass allocJ initHisName:mNamel; return theCIone; @end DogClass の使用例 DogCIass *theDog = [ [DogCIass allocl initHisName: ” Snoopy ” 土 d く C 地 neP て 0 セ 0C0 theClone 0 , 、 00 0 、 00000 000 = 、 00 : , 0000000 00000 theClone = ttheDog CIone]; printf("theCIone name = [ (DogCIass* )theClone name] 凵 5 真紀俊男のローテク講座
どの alloc , init は Foundation フレームワー クの場合 , NSObject. h というへッダファイ ル内で , @interface NSObject ... ( 略 ) . (id)init; ロ 十 ( 土 d ) a Ⅱ 0 @end と記述されています。つまり , [ [MyObject a Ⅱ oc] 土 n 土セ theOb j と記述した場合 , a110C というクラスメソッ ドで MyObject オプジェクト ( インスタンス ) を発生させ , 発生したオプジェクトに init というインスタンスメソッドを使って , 初 期化を行っているわけです。 ところで , 先ほどから「 id 」というキーワ ードが出ていますが , これは Objective-C で は「汎用的なオプジェクトボインタ」型とい う扱いをする型です。 人によっては id というのは void ポインタ や Variant 型に似ていると感じるかもしれ ませんが , id はあくまでオプジェクトしか ポイントしないので , ポイントしている先 に数値データや非オプジェクト型データは 存在しません。 C + + と違って Objec ⅱ ve - C にはテンプレー トという概念はなく , C + + ほど強く型に縛 られているわけでもありません。 C + + では 可変長配列を作るときに STL の vector を利 用しますが , このときどの型の vector であ るかを明示しなくてはなりません。同じこ とを Objective-C で行う場合 , どの型の可変 配列かを明示しなくても , id 型の可変配列 で作成すればいいのです。 Foundation フレームワークでは , NSMu tableArray という可変配列が用意されてい ます。たとえば List 4 のようなプログラム があったとすると , theAr ・ ray に対して Bird Class オプジェクトと DogClass オプジェク トが格納され , それぞれのオプジェクトに 対して Naku メッセージが送られます。す ると , それぞれのオプジェクト固有の Nak u メソッドが適切に呼び出されるのです。 C + + の場合は仮想関数を使わなかった場 合 , 適切なメンバ関数が呼ばれない不都合 が起こることがありますが , Objective-C で はそもそも仮想関数という考え自体がなぐ注 3 ] 指定されたメッセージに応じた適切なメソ ッドが確実に呼び出されます。それどころ か , List 4 で , [theObjPtr Naku]; と記述した部分を , [ theOb j ptr Tobu]; に変更してもコンパイルできるほどです。 ただし , これはコンパイルはできたとし ても実行時に DogClass オプジェクトに対 して Tobu メッセージを送るため , Tobu メ ソッドを持っていない DogClass オプジェク トはどのように行動してよいかわかりませ ん。結局 , 実行時ェラーとなり , 例外が投 げられたりプログラムが停止する可能性が あります。 セレクタ (selector) オプジェクトに対して送られるメッセー ジは実行効率を考えて , 文字列ではなくも っと効率のいい情報にコンパイルされます。 この情報は , 変数に格納したり利用するこ とが可能で , セレクタと呼ばれています。 セレクタを , C + + でいうところのメンノヾ 関数ポインタだと勘違いする人がいるかも しれません。しかし , メンバ関数ポインタ IS NSMutab 厄 A 「「 ay による汎用オブジェクト配列 @interface DogC lass NSObject (void)Naku; @end @interface BirdC lass - ( vo 土 d ) で。 b ヂ (void)Naku; @end : NSObject 144 C MAGAZINE 2 1 6 [ theBird re lease [ theDog て引 ease [theArray release]; ItheObjPtr Naku]; id theObjPtr = [theArray 0bjectAtIndex: theIJ; for(thel 咢の thel く [theArray count]; thel 十十 ){ ttheArray addObiect:theDog]; [theArray addObject:theBird]; BirdClass *theBi て d ま [[BirdCIass alloc] 土 n 土し DogCIass *theDog = l[DogClass a 日 0C1 init]; NSMutableArray *theArray = [ [NSMutabIeArray aIIOCJ 土 ni セ 土 n し thel; s し c void Test(void) SEL 型を取り扱う [theBird releasel; [ theBird performSe 厄 c し or : theSeI ector SEL theSelector = @selector(Tobu) デ BirdClass * theBird = [ tBirdClass alloc] init]; @p 「 0t0C6 @end (id)Clone; ② p て OtOC 引 C neP て 0 セ OC 引 @end - ( メソッドの型 ) インスタンスメソッド名 : ( 引数の型 ) 引数 . @p 「 OtOC プロトコル名 Fig. 3 プロトコルの宣言
本的には C 言語と同じです。ただしオプジ ェクトを利用する場合 , " [ " と " ] " で囲んだ 部分に「メッセージ式」を記述します。メッ セージ式の基本的なフォーマットは , [ レシーバセレクタ : 引数… ] となっています。 レシーノヾ ( receiver ) というのはメッセー ジを受け取るオプジェクトのことです。メ ッセージを受け取ったオプジェクト ( つま りレシーバ ) は受け取ったメッセージに応 じたメソッドを起動し , その結果 ( 戻り値 ) がメッセージ式の値となります。 ただし , C 言語と同様 , void 型メソッド の場合 , メッセージ式の値はありません。 先ほどの MyObject オプジェクトで applicat ionShouIdTerminate メソッドを使う例でい えば , List 3 のようなプログラムが記述さ れていた場合 , [theObj applicationShould Terminate:theApp] は , 常に YES の戻り値 tNSApp setDelegate:selfl; [myWindow makeKeyAndOrderFront:seIfl; (void)awakeFromNib Test( NSBeep ( NSLog()" * Action * ″ (void)myAction: (id)sender @implementation MyObject 博 @implementation @end (BOOL)applicationShouIdTerminate: (NSApplication - (void)awakeFromNib; (void)myAction: (id)sender; id myWindow; @interface MyObject : NSObject 、 @interface となるため , 常に EndProc ( ) が実行されま づ - [ 注 1 ] また , メッセージ式は入れ子を認めてい ます。 List 3 で , MyObject * theObj [ [MyObject alloc] 土 n 辻 となっている部分は , MyObject * theObj; [MyObject alloc]; / / 確保 theOb j = [theObj 土 ni セ / / 初期化 theObj = の 3 行を凝縮したものです。 (class method) クラスメソッド でいうところの new , delete に相当するも C + + とは比較にならないほど少なく , C + + Objective-C は , 予約語や言語拡張部分が ライプラリの支援が重要です。というのも Objective-C でプログラミングを行うには , 真紀俊男の ローテク講座 のもライプラリで実現しているのです。 Project Builder で利用する Foundation フ レームワークの場合 , a Ⅱ oc でオプジェクト の確保を行い , init で初期化をし , release で解放することになっています [ 注 2 ] 。この とき問題になるのは , 最初のインスタンス を発生させる時点ではインスタンスメソッ ドが使えないことです ( まだインスタンス が発生していないため ) 。そのため , クラ スそのものをオプジェクトとみなして ( ク ラスオプジェクトとみなして ) , そのオプ ジェクトに対して a Ⅱ oc メッセージを送り , インスタンスを発生することになります。 このときに利用されるメソッドをクラスメ ソッド ( あるいはファクトリメソッド ) と呼 びます。 クラスメソッドは , インスタンスメソッ ドと区別する意味でメソッド名の前に「 - 」 ではなく「 + 」を付けます。ちなみに , 先ほ * )sender; (BOOL)applicationShouIdTerminate: (NSAppIication * )sender NSLog (@"app IicationShoul dTerminaten return YES ー @end メッセージ式の評価 インスタンス変数の宣 @interface クラス名 : 継承元の親クラス名 Fig. 1 Objective-C での「クラスの宣言」 EndProc ( if( [theObj applicationShouldTerminate:theApp] ) { //theObj に applicationShouldTerminate メッセージを送る MyObject *theObj = [ [MyObject allocJ 土 n 土し 〃オブジェクトの確保と初期化をする NSApp *theApp = NSApp; - ( メソッドの型 ) インスタンスメソッド名 : ( 引数の型 ) 引数 . @implementation クラス名 Fig. 2 メソッドの実装 @end - ( メソッドの型 ) インスタンスメソッド名 : ( 引数の型 ) 引数 .. 真紀俊男のローテク講座 @end メソッドの実装 143
真紀俊男の ローテク常座 第 64 回 Objective-C の巻 今回のローテク講座はいつものような内容 とは一変して , 特集 2 「 MacOSX アプリ ケーション開発ガイド」で触れた Objecti ve-C という , あまりなじみのないオブジ ェクト指向言語について , 簡単な説明とプ ログラム例を紹介します。 Objective-C とは 142 c MAGAZINE 2001 6 ではないということです。とはいうものの れらのうちどれか 1 つを標準にできる状況 団体によって実装されており , 現状ではそ うのは , Objec ⅱ ve - C 自体がいろんな会社や Objective-C を紹介するうえで困ってしま があります。 C 言語に Sma Ⅱ talk をまぶしたような雰囲気 言語が有名ですが , Objective-C は見かけ上 , ジェクト指向言語としては Sma Ⅱね lk という れば十分だ」という意見もあります。オプ 習得可能だ」とか「とんでもない , 半日もあ - C を習得するほうが楽で , 「 1 週間もあれば 多くの場合 Java を習得するよりも Objective 実際のところ , C 言語習得者にとっては , も , はるかに簡単に習得できます。 によって難解になってしまった C + + より っておだやかなものです。複雑怪奇な拡張 ただし , Objective-C の拡張方法は C + + と違 グラミング言語を目指しているものです。 をほどこし , 強力なオプジェクト指向プロ と同様 , Objective-C も ANSI C に機能拡張 っとも有名な例が C + + です。そして , C + + いう試みはいくつかあります。その中でも より強力なプログラミング言語にしようと C 言語にさまざまな拡張をほどこして , 具体的なターゲットを決めないことには話 が進まないので , こでは , 本誌特集 2 で 取り上げた Mac OS X で動作する ProjectBui lder での実装を前提として説明します。そ れ以外の環境で動作する Objective-C につい ては , 本稿の内容がそのままあてはまる保 証がないことをあらかじめお断わりしてお きます。 Objective-C のクラズ 典型的なオプジェクト指向言語にはクラ スの宣言や定義があり , もちろんこれらは Objective-C にもあります。クラスはオプジ ェクトの挙動を決定する型紙となるもので す。 Objective-C では「クラスの宣言」として , Fig. 1 のように「@interface—@end 」で囲ん だ記述をします。実際のクラスの記述例は List1 のとおりです。 インスタンス変数 (instance variable) は , クラスから発生するオプジェクト ( インス タンス ) が内部で抱える変数であり , C + + でいうところのメンバ変数に相当します。 インスタンスメソッド (instance method) は , インスタンスに対して仕事を要求するとき に呼び出す関数であり , C + + でいうところ のメンバ関数に相当します。 @inte市ce ~@end で囲まれた部分は「ク ラスの宣言」にすぎず , 通常はヘッダファ イル内でのみ記述され , クラスを利用した いソースが@interface を記述しているヘッ ダファイルをインクルードすることで利用 できるようになります。 実際にクラスのメソッドをどう実装する かは Fig. 2 に示すように , 「@implementatio n ~@end 」で囲まれた部分に記述します。 メソッドの記述例は List 2 のとおりです。 先ほどの@interface で , どういうクラスを 継承するか , どういうインスタンス変数を 使うかを宣言しているため , 「@implemen tation ~@end 」で囲まれた部分はメソッド の実装を記述するだけで済みます。 こまでを簡単にまとめると , ・ @interfaceev@end は , クラスのイン タフェイスの宣言であり , どういう親 クラスを継承しているか , どういうイ ンスタンス変数があるか , どういうメ ソッドを宣言しているかを記述する ・ @implementation—@end は , クラス のメソッドを実装するプログラムを記 ッセージ式 ということです。 述する Objective-C でのプログラムの記述は , 基
Java programmingTips List HTML Conve 「 te 「で変換した HTML ファイル Fig. 3 lnternet Explo 「 e 「 5.5 による アニメーションアプレットの実行 左以レットそ使ったアニメーンヨンアプしット / 右 : タイマーを使ったアニメーションアプレット く html> <head> くし土目 e > スレッドとタイマーを使ったアー ーメーションアプレットく / t 土凵 e > く /head> く b0dY> く center> 左 : スレッドを使ったアニメーションアプレット / 右 : タイマーを使ったアニメー ションアプレットく p > く !—-"CONVERTED—APPLET"——> くトー CONVERTER VERSION 1.3 ー - > く OBJECT c ね ssid = ″ clsid : 8AD9C840 ー 044E ー 11D1 ー B3E9 ー 00805F499D93 ″ WIDTH = 400 HEIGHT = 400 codebase= "http://java.sun.com/products/plugin/l.3/jinstal ト 13 ー w 土 n32. cab # ve て sion = 1 卩 , 0 , 0 ″ > <PARAM NAME = CODE VALUE = "ThreadAnim" > く PARAM NAME="type" VALUE=napplication/x—java—applet;version=1.3″A く PARAM NAME="scriptable" VALUE="false"> <PARAM NAME = "åmagen VALUE ="image. gif"> <COBNENT> <EMBED type=napplication/x-java—applet;version=l. 3 ″ CODE = "ThreadAnimn WIDTH = 400 HEIGHT = 400 image = "image. gif" scriptable=false pluginspage="http://java.sun.com/products/plugin/l.3/plugin-ins tall . html"><NOEMBED> ・く /COMMENT> く / OE 田 ED> く / 田 ED > </OBJECT> イ ! ~ 第市、お知に ) 響ー′、 境をあらかじめインストールしておく必要 があります。 手順 3 : HTML ファイルの選択 変換した HTML ファイルは複雑になるの で , あらかじめほかのフォルダにコピーし て作業をするとよいでしよう。 Fig. 2 の画 面で , 「フォルダ内のすべてのファイル : 」 の亠ボタンを選ぶとファイル選択ダイ アログが出現するので , HTML ファイルを コピーした作業用フォルダを指定して函 を押します。 手順 4 : テンプレートファイルの選択 Fig. 2 の画面で「テンプレートファイル : 」 は「 Windows と Solaris の標準 ()E と Navigato r) のみ」を選択します。 lnternet ExpIorer や Netsc 叩 e Navigator 以外のプラウザにも対 応させたいときには , 「拡張 ( 標準 + すべて のプラウザとプラットホーム ) 」を選択しま す。 手順 5 : HTML ファイルの変換 Fig. 2 の画面でボタンを押すと HT ML ファイルの変換が行われ , 結果がレポ ートされます。 を一般の web プラウザで動かす方法も解説 の最新機能を利用したアプレットが実行で 変換の例 きるようになります (Fig. 3 ) 。 しました。 スレッドを使った方法は一般的で汎用性 List3 の HTML ファイルを変換したものが トおわりに が高く , ゲームへの応用にも向いています。 List 5 です。変換後の HTML ファイルでは , 一方のタイマを使った方法はプログラムが く叩 plet > タグ部分が大幅に書き換えられま 今回はアニメーションアプレットを実現 簡単なので , ちょっとしたアニメーション す。 アプレットや時計アプレットなどを作るの これで , lnternet Explorer や Netscape Na するためのふたつの方法を説明しました。 また , Java の最新機能を用いたアプレット に便利です。 vigator などの一般の Web プラウザでも Java <APPLET CODE = "ThreadAnimn WIDTH = 400 HEIGHT = 400 > <PARAM NAME = "image" VALUE ="image. gif"> く / A I で > <!——"END_CONVERTED—APPLET"- <!-—"CONVERTED—APPLET"——> く ! ーー CONVERTER. VERSION 1.3 ー <OBJECT class 土 d cls 土 d : 8AD9C840 ー 044E -11D1 ー B3E9 ー 00805F499D93 ” WIDTH = 400 HEIGHT = 400 codebase= "http://java.sun.com/products/plugin/l.3/j土nSセaⅡー13ーW土n32.cab#Version=l, 3 , 0 , 0 ” > <PARAM NAME ま CODE VALUE ま "TimerAnimn > く PARAM NAME=ntype" VALUE="application/x-java-applet;version=l. 3 ” > く PARAM NAME="scriptable" VALUE="false"> く PARAM NAME = "image" VALUE ="image. gif"> く CO 正 NT > ・く EMBED type=napplication/x-java—applet;version=l. 3 ″ CODE TimerAnimn WIDTH = 400 HEIGHT = 400 image = "image ・ gif" scriptable=false pluginspage="http://java.sun.com/products/plugin/l.3/plugin—inst all . html"> く NOEMBED> く /COBNENT> く / NO 望 ED > く / EMBED> く /OBJECT> く ! ー く APPLET CODE = "TimerAnim" WIIYTH = 400 HEIGHT = 400A く PARAM N 化 = "image" VALUE ="image. gif"> く /APPLET> く !--"END—CONVERTED—APPLET"- く /center> く / d く /htm l> Java programming Tips 1 41