2008/04/25

Mapの実装クラスについて [ Java ]

昨日のエントリでMapについて書いた訳ですが、JavaのMapは
インターフェースなので使う時は実装クラスを使わないといけません。

これが結構色々種類があって、それを全部説明する僕が面倒です
ので幾つかピックアップして解説してみようと思います。
という訳で選手入場です!


1.HashMap
はい、トップバッターは一番使われてるのでは? と僕が思っている
ハッシュマップから。これはほんとごくごく普通の連想配列です。
あえて突っ込むとしたらば、同期化はされてない事とnullが許容
されているって事ぐらいでしょうか。あ、後このクラスはMapの
順序が保証されません。
順番とかどうでも良い、本当にハッシュテーブルが欲しい時は
これで事足りますね。

2.LinkedHashMap
さぁ二番手に行ってみましょう。今度のMapは1番のHashMapと
ほぼ同じです。相違点は挿入した順序を保持する事。
つい最近仕事で使ったので記憶に新しい……

3.TreeMap
今日はこれで最後、TreeMapです。これはMapがソートされた
状態で保持されます。何でソートされるかというと勿論Key値です。
ハッシュでソートされるという事ですね。で、これってどういう風に
ソートされるの? 昇順? 降順? という疑問が沸くと思うのですが
デフォルトは昇順です。正確に言うとComparableインターフェースの
compareToメソッドによってソートされます。
その為、TreeMapを使って自分の思うようにMapをソートしたい場合は
Comparatorオブジェクトを生成し、それをTreeMapのコンストラクタへ
セットすれば出来るはずです。

なんではず、なのかって? 試してないからです。

今度はここらへんを実際のコードを混ぜて書きたいですねー。

2008/04/24

Mapって知ってますか? [ Java ]

タイトルを見てこう思った人がいるかもしれない。

はい! 地図の事です!







お前は俺か。


はい、という訳で今日はまずJavaのMapという物の概念から
考えていきましょー。まぁJavaに限らずほとんどの言語に
ある話なんで多分みなさん知ってると思うんですが。

さて、Mapというのはキーとそれに対応する値がセットになった
エントリの集合体のような物です。
はい、何を言っているか分かりませんね。
例えば、学校のクラスの出席番号を考えてみましょう。

 No 名前
 1  山田
 2  畠中
 3  川畑
 4  立神

こんな出席番号のクラスがあったとしましょう。
さてここで質問です。出席番号2番の生徒の名前は?

答えは当然"畠中"君ですね。(畠中さん、かもしれないですが)
このように、キー値(出席番号)と、それに対応する値(名前)が
セットになったエントリ(No:名前)が複数ある物がMapです。

さて、ここでさっきのデータにエントリを増やしてみます。

 No 名前
 1  山田
 2  畠中
 3  川畑
 4  立神
 2  計羅

上記データはMapとして……いや、出席番号として正しく機能するでしょうか?
勿論、答えはNo!!! です。何故ならこのクラス、出席番号2番の人! と先生が
点呼をすると

畠中「はい!」
計羅「ういす!!」

二人返事しちゃいますね。これじゃ出席番号としては機能してません。
これと同じように、Mapにおいてはキー値は重複しないという約束が
あります。特に難しい事は無いですね。

じゃ、これを実際にJavaのコードにしてみたものを以下に。

Map classMap = new HashMap();

classMap.put(1, "山田");
classMap.put(2, "畠中");
classMap.put(3, "川畑");
classMap.put(4, "立神");


こんな感じでしょうか?(コンパイル通してないからあってるか不安……)
上記コードのclassMapというマップが上の方で作ったデータと
全く同じ事を示している状態になります。

ここでは例としてMapの実装クラスはHashMapを使いましたが、他の
物を使った時との違いを今度書きたいと思います。

2008/04/23

Javaで配列のソートがしたい時どうする? [ Java ]

仕事がちょっと忙しくて昨日、一昨日と二日間サボってました。

さて、今日はタイトルの通りJavaで配列のソートをする時
どうする? というお話です。

昨日は仕事で画面上の表示するデータをとある項目の数値で
ソートしたかったのですが、普段だったらSQLにORDER BY句を
付け足して終了! とする所がhibernateを使ってDBアクセスを
行っている為にそれが出来なかったのです。

その為既に取得したデータ郡をJavaでソートしよう! という
事になった訳ですが……意外に簡単でした。やり方はこう。

ex)配列のsort
String[] orgStringArray = {
"3", "4", "2", "1", "9", "8"
}

Arrays.sort(orgStringArray);

これだけ。これでorgStringArrayというStringの配列が昇順で
ソートされます。(Arraysクラスはjava.utilパッケージにあります)


ここまで読んだ人は、『じゃ降順はどうするんだ?』とか
『実際にはこんな単純なオブジェクトじゃない事が多いんだけど』とか
『配列じゃなくてコレクションのsortをしたいんだけど!』とか ←僕です
色々思う所があると思いますが、それはまた後日。

2008/04/18

オブジェクトのクラス、そして全てのメンバへ…… [ Java ]

今日は原点に帰ってJavaについて。

とあるオブジェクトがあったとして、そのクラスを
取得したい場合。例えば

String foo = "foo";

ここでfooからクラス情報を取得したい場合は

foo.getClass();

これでclass情報を取得できます。
さて、ここまでは誰でも知ってるような事だと思いますが、
今日はクラス情報からそのクラスが持つメンバ一覧を
どのように取得するかを紹介したいと思います。
……といっても

foo.getClass().getDeclaredFields()

これだけ。ちなみに返される値はFieldオブジェクトの配列です。
なので実際には上記コードは

Field[] fields = foo.getClass().getDeclaredFields();

こんな感じになりますね。
ここからリフレクション等を使うと色々便利な事ができそうな予感……!!

2008/04/17

たまには振り返ろうか [ マネジメント ]

今日は普段とは違った趣向のエントリを書こうと思います。
決してネタ切れな訳ではありません。
や、書きたい事はあるけど時間かかりそうでめんどくさ(略


さて、このBlogは一応技術Blogなんで今までコンピュータと
関係がある技術的な事を書きつづけてきました。

しかし、一歩そこから離れて物を見てみると技術ばかりが
大切なのかというと勿論そんな事は無い訳で。
(一応、突っ込んでおくと技術者たる者、優秀な技術
 を持っていないとダメなのは勿論ですよ??)

という訳で今日はプロジェクトにおけるふりかえり手法の一つ、
KPTという物について触れようと思います。

これはアジャイル開発の振り返りで多用されているよう(なの?)
ですが、別に一人でも使えますし何もプロジェクトに限らずに
様々な場面で使える手法の一つだと思います。

やり方は単純。まず大きな紙、またはホワイトボードを用意しそれを
三つの領域に分けます。







Keep





Try








Problem






こんな感じ。そして各項目に、振り返るべき事柄(プロジェクト等)に
関する事を以下のように分類して記入していきます。

Keep:やって良かった事。今後も続ける事。
Problem:現在抱えている問題点。まずかったアプローチ等。
Try:今後やって行こうと思う事。

これだけです。多分、初めにこれをやるとKは殆ど出ずに逆に
Pが大量に出てくる事になると思います。でもこのKPTは
本来振り返りを行う為にやっているのでPがいっぱい出てくるのは
最初は問題ありません。
逆に最初っからPが殆ど出ない場合、実際には問題が少ない訳では
なく危機感が足りない場合やしっかりと考えられていない場合が
多いです。

さて、Pを出し終えたら後はTry……対策、やってみたい事等を出して
いきましょう。スペース的にもここはKやPの倍あるのでここは一杯
出していきたい所です。

2008/04/16

安全(safe)と冪等(idempotent)なメソッド [ http, REST ]

さて、今日は安全と冪等という概念について書こうと思います。

安全、safe、セーフ。
冪等、idempotent、なんて読むんだよコレ。


……まぁ、いいや。

さて、早速各メソッドの意味について。

安全:サーバに影響を与えない。
冪等:何度実行しても同じ値が帰ってくる。


これに関してこちらで分かりやすい例がありました。


算数でかくと、以下のとおり。

操作初期値1回目2回目3回目
x1  4  4  4  4 安全
x0  4  0  0  0 冪等
+1  4  5  6  7 安全でも冪等でもない

安全であれば必ず冪等であるが、冪等であるからといって安全だということではない。


ちなみに、httpにおける各メソッドは安全であるべき、冪等であるべきなどちゃんと
定義されています。
例えば、GETは安全かつ冪等です。(安全な時点で冪等である訳ですけどね。)

2008/04/15

GETメソッドの素晴らしさ [ http, REST ]

昨日は研修に借り出されていて書けなかった……

さて、前のトピックでリソースに対してメソッド(GETやPOSTとか)を
適用する事を体感してみた所でRESTの話に戻ろうかと思います。

皆さんがもしネット上で何か面白い記事を見つけたとします。
これをいち早く友達に教えたい! こんな時あなたはどうするでしょうか。

多分、アドレスをコピーして友達に送りつけますよね。
中には奇特な人がいて、その記事を表示している画面のスクリーンショットを
ファイルで送りつけたり記事の内容をメモ帳に落として送ったりとかそういう
人がいるかもしれません。……きっとそういう人たちは脳が弱いhttpに
おけるGETメソッドの素晴らしさを知らないのでしょう。そういう事にします。

さて、GETメソッドの素晴らしさとは何か……実は既に上述してしまっているのですが
同じアドレス(URI)に対してGETを適用する事によって、必ず同じリソースを取得できる
事です。これが約束されていない場合、ブックマークなんて使い物になりません。

正確には必ず同じリソース、という表現には語弊があります。実際にはGETメソッドを
適用した時点でのリソースの状態が返されます。これは前に書いたトピックを見れば
理解しやすいと思いますが、リソースの実体は変化しても意味は不変という事です。

既にインターネットに慣れ親しんだ人からすると、はぁ?何当たり前の事言ってんだコイツ?
と思うかもしれませんが、これって結構冷静に考えると凄い事じゃありません?
ウェブ上に星の数程ある様々なリソースに対して、特定のURIに対してGETを適用すると
必ず同じ物が返ってくる訳です。(逆にこれがないとWEBサーフィンできないなぁ)

……ちょっとPCに詳しい人なら

『ちょっと待った!GET使っても毎回表示結果が変わるようなページもありえる!』

って思う人がいるかもしれません。
……が、ちょっとそれは置いといてとりあえず今日はこの辺で終了。


今日のまとめ:
・GETは偉大

2008/04/10

httpを体感してみる [ http ]

最近はhttp周りの話が多いんですが、意外にWEB上に存在している
リソースを閲覧する時、一体どうやってリソースにアクセスしてどのように
データを取得しているかを知らない人って多いと思います。

例えば、Yahooを見たいと思った!その時どうする!
恐らくみなさん、こうするでしょう。






ぽちっとな。

アドレス欄にYahooのアドレスを入力して、華麗にエンターキーを叩く!
(実際にはブックマークを使う事が多いとは思いますが、同じ事ですね)


そうすると見事ブラウザにはYahooのトップページが表示される訳ですが……
果たして、この時裏で何が行われているのでしょう??

……というあたりを、今日はWindows付属のコマンドプロンプトを使って
試してみようと思います。

※:以下のような検証は自分が管理するサーバ以外には行わないで下さい。
後で何か起きても当Blogは責任を取れません。

さて、まずはコマンドプロンプトを起動します。
スタート→ファイル名を指定して実行 から"cmd"と入力すればいけますね。

ここでコマンドプロンプトに"telnet"と入力してEnterを押します。
(※:本来確かリモートの為に使われてたプロトコルだったはず。
   暗号化とかしてないから今は使ってない気がするんだけど……)
するとコマンドラインが Microsoft Telnet> のように変化します。
これでTelnetを使う準備は完了です。

さて、ここでTelnetのコンソールは一度置いておいて、ブラウザに戻ります。
そして
http://gp400.no-ip.info/~D400/test/http_test.html
上記アドレスにアクセスしてみましょう。









こんな感じでごくごく簡単なhtmlが表示されたと思います。
さ、ここでさきほどのTelnetのコンソールに戻って、今htmlを
表示した事を再現してみたいと思います。まずは

set localecho
と入力してエンター。(Windows2000だとlocal_echoかも)
これで入力している文字が見えるようになります。
さて、ここからが本番、まずはアクセス先のサイトへの接続を確保します。

open gp400.no-ip.info 80

上記のように入力してエンター。これで gp400.no-ip.info というドメインを
オープンしてくれ! という命令を出している事になります。
エラーも出なかったら、続けて以下のように入力します。

GET /~D400/test/http_test.html HTTP/1.1
Host: gp400.no-ip.info

↑ここのミソは、Hostを入力し終わった後にもう一度Enterを押す所です。
すると、このような画面が返ってきます。


















ここで返ってきた文字列は、まさにさっきブラウザで開いたhtmlのソースと
同じ物です。これがリソースに対してGETメソッドを実行した事になる訳です。


はい、という訳で今日はサーバに対してhttpヘッダをブラウザの代わりに
自分で作成して(正確にはブラウザは今回書いた以上の情報を自動で
補完してhttpヘッダに付加しますが)リソースに対してGETメソッドを
実行してみました。

今までなんとなくリクエストリクエスト言ってたような人は少しブラウザが
何をやっているか体感できたんじゃないでしょか?同じようにパラメータを
POSTするのもこういった感じで逐一検証する事が可能です。
昨日のエントリと合わせて色々試してみたいところですね~~。

2008/04/09

httpのヘッダ情報が見たいです [ FireFox, http, PlugIn ]

今日はFireFoxのプラグインの紹介だよ!
といってもまだ自分のFireFoxにインストールすらしてないけどね!

……さて、みなさんWEBアプリを作ってるとリクエストやレスポンスの
httpヘッダとか、POSTされている値とかを確認したくなる時って
ありません??
プログラムが上手く動かない!パラメータがどう飛んでるか分からんよ!
ってなって髪をかきむしる事幾数度……(あぁ禿が近づく)

http://livehttpheaders.mozdev.org/

↑こんなFireFox用のPlulgIn見つけました。その名も
"LiveHttpHeaders"
……なんてそのままな名前なんだ……

このプラグインを使うとどうやらhttpのヘッダ情報とかが見れるらしい。
見るだけじゃなく、保存したヘッダ情報を加工してリクエスト送信とか
そういう事もできるらしい。

な、なんだかオラワクワクしてきたぞ……!

という訳で早速明日は会社のPCを人柱にこれをインストールして
使ってみようかね!(というか会社の方がこれ使いたいしな)

2008/04/08

リソースとは何ぞや [ REST ]

ここの所REST周り続きの毎日。
他にネタが無いんだからしょうがない。

さて、題名通り今日はRESTにおいて大事な概念のリソースについて。

ここでリソースというのは情報の事を指します。
例えば……

・今まさに公開しているこのBlog
・オライリージャパンのRESTfulWebサービス本の紹介
・いつも巡回しているエロサイト
・WikipediaのREST解説
・今月のオリコンランキングTOP10

etc,etc…… 例をあげはじめたらキリが無いですね。
さて、ここで問題になるのは、例えば上にあげた例のうちの
「公開しているこのBlog」は、昨日表示した時と来週した時では
画面に表示されるトピックは違う物になっているでしょう。(更新してれば)
「今月のオリコンランキングTOP10」は、4月に表示するか5月に表示するかで
全く内容が変わっている事でしょう。

しかし、どちらも「公開しているこのBlog」、「今月のオリコンランキングTOP10」で
ある事に変わりはありません。リソースを考える上で大事なのは、
「そのリソースの意味」が大事になります。

例えば今公開しているこのBlogであれば

http://gp400fb.blogspot.com/

このアドレスにアクセスする事で、直近N件の佐藤さんが書いたトピックが
表示されるリソースになる訳です。同じくオリコンランキングであれば、

『その月の月別ランキングTOP10』

という意味になりますね。リソースの実体はその時々変化するかもしれませんが、
リソースの意味は不変の物である、という事らしいです。

例えば、GoogleのTOPを開いたら、今までは簡単な検索用テキストボックス
だったのに最近は下に"お勧め"等が表示されるようになりました。
表示される実体は変わりましたがこれは"Googleのトップページ"という情報に変わりはありません。
しかし、これがある日GoogleのトップページにアクセスしたらYahooのページになっていた。
そんな事はありえない……そういう事ですね、きっと。


さて、上記のように"リソース"という概念を踏まえた上で、先ほどの例を見てみます。


・今まさに公開しているこのBlog
・オライリージャパンのRESTfulWebサービス本の紹介
・いつも巡回しているエロサイト
・WikipediaのREST解説
・今月のオリコンランキングTOP10

これらは全てWEB上に存在するものです。上から順に

http://gp400fb.blogspot.com/
http://www.oreilly.co.jp/books/9784873113531/
プライバシー保護の為お見せできません
http://ja.wikipedia.org/wiki/REST
http://www.oricon.co.jp/rank/js/m/

上記のURIで各リソースを参照する事が出来ます。一文字でも違えば当然
これらのリソースにアクセスする事はかないません。

このように、WEB上のリソースはURIという識別子を持つ事は皆さん
ご存知だと思います。
さて、ここで重ねてリソースという概念の復習になりますが同じURIにアクセスしても
必ず同じデータが返ってくる保証はありません。
さっきも言ったように、http://gp400fb.blogspot.com/というURIにアクセスするのが
今日か、それとも一年後かで表示されるデータは全く別のものになっているでしょう。
しかし両者とも僕の書いているBlogという定義は変わりません
このように、一つの識別子では別の内容が返ってくる事があります。
(勿論、毎度毎度同じ内容が返ってくる事もあります)
しかしその識別子の持つ意味は不変なのです。



という事で今日のリソースという概念のまとめ。

・RESTにおける情報は全てリソース
・リソースの内容は変わる事があるが、その意味(定義)は不変
・リソースはURIという識別子を持つ



このリソースという概念がRESTでは非常に重要らしいです。
何故らしい、なのかというとまだ先を調べてないからです!
という訳でまた纏まりの無いまま終わる。

2008/04/07

まず、アーキテクチャって何だろう? [ アーキテクチャ ]

さて、今日のお題はアーキテクチャ。
良くアーキテクチャって言いますけどアーキテクチャって何でしょう?
結構何となくこの単語使ってる人が多いんじゃないかと思います。

というか僕が何となく使ってる人ですので。

まず、ここで言うアーキテクチャっていうのは勿論
ソフトウェアアーキテクチャの事です。
そこで早速今度もWikipedia大先生に聞いてみた所

ソフトウェアアーキテクチャとは、抽象化と問題の分割によって
複雑性を減らすことを主に念頭に置いたものである。

との事。まぁこの後に続けて書いてあるんですが、万人が納得いくような
ちゃんとした定義がある訳でもないようです。単語として意味が広すぎるのかな。

さて、ここで更に突っ込んでアーキテクチャアーキテクチャスタイルの違いについて。
(単語の解釈の話ばっかりでツマランのだが)こういう単語の意味でちゃんと解釈
しておかないと後でどんどん大きな勘違いとかに繋がっていきそうなのが怖いんで
色々調べてみたいと思います。

さて、アーキテクチャとアーキテクチャスタイルは当たり前ですが別の意味ですよね?

アーキテクチャというのは実際に自分達が作るシステムが持っている物。
アーキテクチャスタイルというのはシステムにおけるアーキテクチャを設計する時に
参考にするもの。

こんな違いのようです。簡単な例だとMVCモデルとかが挙げられると思います。

例えばあなたがStruts等のMVCモデルのフレームワークを使ってシステムを
構築したとしましょう。

この場合、これはMVCモデルというアーキテクチャスタイルの
Strutsというアーキテクチャでシステムを構築した…… という感じです。

……以上が自分なりのアーキテクチャ等の解釈になります……
という訳でようやくRESTというアーキテクチャスタイルについて次から
調べていこうかな……うーん纏まらずに終わる。

2008/04/04

RESTって何? 休むの? つーか会社休みてーよ。 [ http, REST ]

今日、職場での一コマ。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
俺『~~~♪』 ← 今日も元気に仕事をサボってウェブサーフィン中。

チームリーダー(以下R)『あ~、佐藤君。ちょっといい?』

俺『(びくっ!)あ、は、はい! なんでしょうか!』←あわててブラウザ閉じる。

R『突然ですが……ウェブをサービスしてみませんか?』

俺『What???』
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

要約するとよく分からないですが職場でのWebサービス担当大臣を
(今後精進して)やらない? って話です。つーてもこの現場って確か7月末
までしかいないから4月中ぐらいにはマスターしないと使い道がないよな。
まぁそん時はJSONやらAjaxやら色々と出てきたのですが、リーダーがその時
持ってた本がコレでした。

という訳で今日は(というか今後もになると思うが)RESTful……つーかRESTって何?
というトピックを書いていこうと思います。
また、色々WEBで調べてみた所RESTといっても厳密な定義がある訳でもなく、色々な
意味を持っていたりもするようです。という訳でじっくりと自分なりのRESTの解釈を
ここでウダウダと語っていくと思うのでお付き合い下さい。
また、間違ってる所や意見などがありましたら御教授、ご鞭撻頂ければ幸いです。

つーか絶対間違ってる事書きそうで怖いんだよな。

さて……とりあえずググってみた所RESTって

Representational State Transfer

の略なようです。これをスペースアルク様で和訳してみましょう。

Representational:再現、具象、描写
State:状態
Transfer:転送

……えー、具象状態の転送?

和訳作戦……失敗!!
なんだよこれ意味わかんねーよ。ばーかばーかつーか英語苦手なんだよ!

という訳で諦めてWikipediaでも見よう。そうしよう。文明って素晴らしい。
Wikipedia大先生によりますと、RESTっていうのは……

ウェブのような分散ハイパーメディアシステムのための
ソフトウェアアーキテクチャのスタイルのひとつである。


はい!先生!困った事にこの ソフトウェアアーキテクチャ ってのが既に
何を言っているか分かりません。
アホな上に知識の乏しい僕のような下民はこういう時は人に頼るか、わからない事を
ひたすら追って調べていくしかない訳ですが……
折角の技術Blogなんでここは自力で追っていってみたいと思います。

でも今日は疲れたんでこのトピックは終了。

……結局、RESTについては何の略か以外は分からず終わってしまった……
先は長いようです。(仕事は待ってくれないようです・゚・(ノД`)・゚・)

2008/04/03

変数について~初期値って……~ [ Java ]

三日連続変数について。こりゃ書く方も読む方も
飽きるの必至だわー……といっても特に書く事も無いので昨日の続き。

さて、Javaにおいて変数が宣言された時ってその変数はどうなるんでしょうか?
まず、クラス型変数の場合

Integer height = new Integer(168);

こんな風にコンストラクタを使って初期値を設定したりします。
この場合は当たり前ですが、heightというInteger型のインスタンスが
中にint型の168という値を持ったメンバ変数を持つ……となりますね。(あってるよね?)
さて、こっからが問題なのですが

Integer height;

このように宣言のみを行った場合、この"height"という変数はどうなるのでしょうか?
昨日の日記へのコメントでmaitoさんから エラーになる! というコメントを頂きましたが
実際にはコンパイルエラー等にはなりません。

正解はnull値を持つ、です。

何度も何度も言っていますが、クラス型変数というのはオブジェクトな為インスタンス化を
行わなければいけません。その為、変数を宣言しただけではそこに値は存在しない……
つまりnullになります。

じゃあここで逆に、プリミティブ型の変数はどうなるのでしょう?
プリミティブ型の変数はオブジェクトではない為、宣言と同時に既に値は存在するはずです。
実際、下記のようなコードを書いてみれば検証はたやすいでしょう。

int height;
System.out.println(height);

上記コードを実行すると、結果は0になります。
プリミティブ型の変数は宣言と同時に初期化が行われるのです。
参考までに、プリミティブ型変数の初期値を以下に列挙しておきます。

  • byte→0
  • short→0
  • int→0
  • long→0
  • float→0
  • double→0
  • char→"\u0000"(つまり空文字、"")
  • boolean→false
こんな感じです。ほとんどゼロが入ってますね。



さて、これにてひとまずJavaにおける変数の話は終了ですかねー。
ただ自分で書いておきながらなんなんだけど、オブジェクト指向における
クラス、オブジェクト、インスタンスという概念とJavaにおける同単語の扱いが
だんだんと分からなくなってきた……
オブジェクト==インスタンス だと思っていたけどもそうでもないようで。
ここらへんは正直な所まだまだ未踏の世界なのでいずれしっかり理解
できたらここに書いていこうと思います。 何年後。

2008/04/02

変数について~クラス型変数とな?~ [ Java ]

昨日の続き、今度はJavaにおけるクラス型変数って奴について。
まぁ実は書いてる僕がそろそろ意味不明になってきてるんですが
気にせずスタートするとします。

さてではクラス型変数とは何かというと、クラス型変数はプリミティブ型
とは違い、オブジェクトです
その為、昨日の例のように使用する前にインスタンス化をしなければいけません。

プリミティブ型の場合は int i = 1; のように直接値を書き込める所、クラス型の
場合はオブジェクトを生成した後に値をセットしないといけません。
また、クラス型の場合は当然といえば当然ですがメソッドを持ちます。
例えば、

long l = integer.longValue();

こんな感じ。上記の例だと変数integer(クラス型変数)が中にint型(プリミティブ型)の
変数をlongValue()というメソッドでlong型にキャストして値を返しています。


こんな感じです。つまりクラス型変数って、事前にJavaで用意されているクラスを
使ってるだけなのかなぁ?勿論無いと不便なんですけど・・・・・・
とりあえずここで一旦クラス型変数のまとめ。

・クラス型変数はオブジェクトである
・クラス型変数はオブジェクトなので、インスタンス化の後に値をセットする必要がある
 (↑大体コンストラクタでセットするのかな)


さて、ここで話は終了……と思ってたのですが、↑の文章を良く読むとクラス型変数の
場合オブジェクトを宣言はしてもインスタンス化しない、つまり

Integer height;

こんな所で終了するとこれってどうなるんでしょう?
これまた飽きてきたのでまた別トピックで書くとします。

2008/04/01

変数について~プリミティブ型って何さ~ [ Java ]

みなさんこんばんわ。
今日をもって私も遂に社会人三年目と相成りました。
あんま実感無いなー。3年目っつーと……

自分がN社に入社した時のI田さんと同じっつー事?
確かあの時点でK崎先輩が4年目で……

とまぁあっという間に先輩たちと同じ年次になっていく今日この頃。
いつまでも昔と同じレベルで居る訳にはいかないですよね!
先輩社員の面子を保つ為にも!(未だ下に後輩社員がついた事ないが)



という訳で今日はプログラムを少し触った事がある人ならもう問題無く
使っているであろう"変数"って奴の、Javaでの扱いについて。

Javaは型付けが厳しい言語なので変数宣言時には型も宣言しないと
いけません。その為良くこんな感じのコードを見る事があると思います。

int height = 165;

整数型の"height"って変数を宣言して、初期値として165を代入してますね。
この int と同じように、Javaでは下記のような8つの型が定義されています。
  • byte
  • short
  • int
  • long
  • float
  • double
  • char
  • boolean

この8つの型をプリミティブ型と言います。
このプリミティブ型って奴は値としてしか扱うことが出来ません。
値としてしか扱う事が出来ない、というのはどういう事かというと
オブジェクトとして扱う事ができないという事です。

オブジェクトではない為、プリミティブ型の変数は直接値を代入する事が出来ます。
先の例のように、int height = 165;  こんな感じに直接値を代入できます。

これがプリミティブ型じゃない場合はどうでしょう?
例として、同じように整数型を扱うIntegerクラスを使って同じ事をしてみると……

Integer height = new Integer(165);

こうなりますよね。上のIntegerの場合が何をやっているかというと、一旦
Integerクラスのheightという名前のインスタンスを生成し、そこにコンストラクタで
165っていう値を設定してます。このようにプリミティブ型じゃない変数は必ず
クラス型のオブジェクトを生成した後、オブジェクトに対して値をセットしなければいけません。


……あれ?今自分で口に出した、"プリミティブ型じゃない変数"って何なんでしょう?
これに関しては長くなるので別トピックで書こうと思います。
とりあえずプリミティブ型変数のまとめ。

・Javaで定義された8種類の型の事
・プリミティブ型変数はオブジェクトではない
・プリミティブ型変数はオブジェクトではない為、直接値を代入できる。

さぁ、次はクラス型変数についてだ!