RAT Java勉強会2004 第02回 型と変数
今回はオブジェクト指向から少し離れて、Javaの言語の機能の基本である変数と型について紹介します。
これらを一貫性のあるルールで理解すると、以降のJavaの機能を簡単に理解できるようになるはずです。
-
Javaを使う上で最低限理解しておいて欲しい「言語の機能」
- 型の概念
- 変数の概念
- 配列の扱い
- インスタンスの扱い
-
今回は抽象的な考え方が少なめです
- Semanticsを覚えるのではなく、イメージを理解して下さい
- プリミティブ型
- void, char, int, long, doubleなど
- オブジェクト型
- Object, String, Pointなど
- その他、自分で定義したクラス
- 配列型
- int[], double[], String[] など
- 配列型の配列型 int[][] なども存在する
型の意味 (1)
Section titled “型の意味 (1)”-
型がなくてもプログラムは作れる
- Perl, Rubyなどのスクリプト言語は型がないものが多い
-
型があることによって、プログラムの安全性が向上する
型の意味 (2)
Section titled “型の意味 (2)”Test.java:3: 精度が落ちている可能性検出値 : double期待値 : int int a = 10.5; ^- コンパイラに怒られるだけマシ
- 怒られなかったらバグを見つけられない可能性がある
プリミティブ型
Section titled “プリミティブ型”-
文字、整数、実数、「無」などを表す型
-
オブジェクト指向に反する型
- 他の”オブジェクト”と同じような扱いができない
- Javaの次のバージョン(v1.5)からは意外とシームレス
-
Javaがそれなりに高速に動くのは、プリミティブ型があるから
オブジェクト型
Section titled “オブジェクト型”-
いわゆるインスタンス
- インスタンスについてはいずれ説明する
-
Javaに標準で存在するクラスや、自分で定義したクラスから作成されたインスタンスはこの型になる
-
オブジェクト指向の真髄である”オブジェクト”はこの型になる
-
同一の型を多数保持するための型
-
配列型もオブジェクト型の一種である
変数のイメージ
Section titled “変数のイメージ”-
変数は決められた種類の紙を1枚だけ入れることのできる箱
-
箱の種類は型の数だけ存在する

定数のイメージ
Section titled “定数のイメージ”- 定数は型の名前と値が書かれた紙

変数への代入
Section titled “変数への代入”- 右辺の結果を紙に書いて、変数という箱に入れる
int a = 10 + 5;
- 箱の中にある紙を新しい紙に書き写し、その紙を使用する
double r = 5.0;double s = r * r * 3.14;
配列のイメージ
Section titled “配列のイメージ”- いくつかの箱が連なっているものをどこかに作る
- 型の名前とその連なっている箱のある場所を書いてある紙

int[] array = new int[10];- “int型”の箱を10個用意して、世界のどこかに置く
- 置いた場所と型(int[])を記録した紙を作成する
- “int[]型”の箱”array”へ作成した紙を入れる

配列の読み出し
Section titled “配列の読み出し”int a = array[3];- 箱”array”から紙を取り出す
- 紙に書いてある場所へ行く
- 3番目の箱から紙を取り出し、新しい紙へコピーする
- コピーした紙を箱”a”に入れる

配列への書き込み
Section titled “配列への書き込み”array[3] = 100;- 箱”array”から紙を取り出す
- 紙に書いてある場所へ行く
- 3番目の箱から紙を取り出し、100と書いてある紙と置き換える

破壊的な行動?
Section titled “破壊的な行動?”- どうなるか考えてみましょう
int[] a = new int[5];int[] b = new int[5];a[0] = 100;b[1] = 200;int[] a = new int[5];int[] b = a;a[0] = 100;b[1] = 200;配列のコピー (余談)
Section titled “配列のコピー (余談)”int[] newarray = new int[array.length];for (int i = 0; i < array.length; i++) { newarray[i] = array[i];}int[] newarray = new int[array.length];System.arraycopy(array, 0, newarray, 0, array.length);多次元配列のイメージ
Section titled “多次元配列のイメージ”int[][] aarray = new int[2][3];- int[]型の箱を2個用意するイメージ

多次元配列の作成
Section titled “多次元配列の作成”int[][] aarray = new int[2][3];- “int[]型”の箱を2個作って世界のどこかに配置する (A)
- (A)の位置を紙に書いて、“int[][]“型の箱”aarray”に入れる
- “int型”の箱を3個作って世界のどこかに配置する (B)
- (B)の位置を紙に書いて、(A)の0番目の箱に入れる
- “int型”の箱を3個作って世界のどこかに配置する (C)
- (C)の位置を紙に書いて、(A)の1番目の箱に入れる
多次元配列へのアクセス
Section titled “多次元配列へのアクセス”aarray[1][2] = 100;- “int[][]型”の箱”aarray”から紙を取り出す
- 紙に書いてある場所へ行く
- 1番目の箱から紙を取り出す
- 紙に書いてある場所へ行く
- 2番目の箱から紙を取り出し、100と書いてある紙と置き換える
多次元配列の考え方 (作成-1)
Section titled “多次元配列の考え方 (作成-1)”- int型の2個の箱を持つ配列を作る
int[] array = new int[2];- int[]型の2個の箱を持つ配列を作る
int[][] aarray = new int[2][];- 少々直感から外れる (new int[][2]の方が直感的)?
多次元配列の考え方 (作成-2)
Section titled “多次元配列の考え方 (作成-2)”int[][] aarray = new int[2][];aarray[0] = new int[3];aarray[1] = new int[3];- 上記の作業は、以下と同じ
int[][] aarray = new int[2][3];- 実際に絵を描くと分かりやすい
多次元配列の考え方 (アクセス)
Section titled “多次元配列の考え方 (アクセス)”int[][] aarray = new int[2][3];int[] fibre = aarray[1];fibre[2] = 100;- 上記の作業は、以下と同じ
int[][] aarray = new int[2][3];aarray[1][2] = 100;- 実際に絵を描くと分かりやすい
インスタンス
Section titled “インスタンス”インスタンスのイメージ
Section titled “インスタンスのイメージ”- クラス(設計図)を元にインスタンス(製品)を世界のどこかに作る
- 型の名前と製品が置いてある場所を書いてある紙

インスタンス変数
Section titled “インスタンス変数”String s = "Hello";- この世のどこかに文字列”Hello”を表す製品がある
- 文字列”Hello”はその製品が置いてある位置を示した紙
- その紙を”String型”の箱”s”へ入れる

インスタンスの作成
Section titled “インスタンスの作成”Point p = new Point(100, 200);- 設計図”Point”を工場に送って作ってもらう
- ただし、送る際に”100”と”200”と書いてある紙を同封する
- 作ってもらった製品を世界のどこかに置く
- 置いた場所と型(Point)を記録した紙を作成する
- “Point型”の箱”p”へ作成した紙を入れる

フィールドへのアクセス
Section titled “フィールドへのアクセス”int x = p.x;- 箱”p”から紙を取り出す
- 取り出した紙に書いてある場所へ行く
- その場所で他の変数同様に動けばよい

メソッドの呼び出し
Section titled “メソッドの呼び出し”double x = p.getX();- 箱”p”から紙を取り出す
- 空の封筒を用意し、取り出した紙の内容をコピーして入れる
- 呼び出し時に他の引数があれば、それらの紙も同封する
- 箱”p”から取り出した住所へ、題名に”getX”とだけ書いて、ポストに投函
- 送り主を今いる位置にする
- 返事が来るまで待つ
- 返事は紙が一枚送られてくる
- 返事を”double型”の箱”x”へ入れる
メソッドの呼び出しで重要なこと
Section titled “メソッドの呼び出しで重要なこと”double x = p.getX();-
封筒を送るだけなので、“p.getX()“が何をしてくれるか分からない
-
pの情報も同時に送る
-
現状では重要ではないが、後々にオブジェクト指向の本質となる
呼び出されたメソッド
Section titled “呼び出されたメソッド”class Point { ... public double getX() [ return this.x; }}- 前準備を行う
++ 送られてきた封筒を受け取る
++ 1枚目の紙を箱 “this” に入れる
++ 2枚以上紙が同封されていた(引数がある)場合、順番に箱に入れていく - … this.x
++ 箱”this”に書いてある住所へ行く (普通は現在位置)
++ そこにある箱”x”を探し、中に入っている紙をコピーする - return …
++ コピーした紙を送り主に届ける
不思議な呼び出し方 (余談)
Section titled “不思議な呼び出し方 (余談)”String s = "Hello";char c = s.charAt(0);char c = "Hello".charAt(0);課題1 - 多次元配列
Section titled “課題1 - 多次元配列”int[][] aarray = new int[2][];aarray[0] = new int[5];// *insert*aarray[0][0] = 100;System.out.println(aarray[0][0]);aarray[1][0] = 200;System.out.println(aarray[0][0]);”// insert”の行にプログラムを追加し、結果が以下のように表示されるプログラムを完成させよ
100200課題2 - インスタンス
Section titled “課題2 - インスタンス”- 第1回で使用したサンプルプログラムのMainクラスについて説明しなさい
class Main { public static void main(String[] args) { // 世界に存在する物体を創造 Tanaka tanaka = new Tanaka(); CafeShop cafeShop = new CafeShop();
// 喫茶店でコーヒーを注文し、… Coffee coffee = cafeShop.getCoffee();
// …Tanakaはコーヒーを飲む tanaka.drink(coffee); }}-
次の点を説明しなさい
- “喫茶店でコーヒーを注文し、…”の挙動
- ”…Tanakaはコーヒーを飲む”の挙動
-
本講義で説明したほど詳しくなくて構わない