Skip to content

RAT Java勉強会2004 第02回 型と変数

This content is not available in your language yet.

今回はオブジェクト指向から少し離れて、Javaの言語の機能の基本である変数と型について紹介します。
これらを一貫性のあるルールで理解すると、以降のJavaの機能を簡単に理解できるようになるはずです。

  • Javaを使う上で最低限理解しておいて欲しい「言語の機能」

    • 型の概念
    • 変数の概念
    • 配列の扱い
    • インスタンスの扱い
  • 今回は抽象的な考え方が少なめです

    • Semanticsを覚えるのではなく、イメージを理解して下さい
  • プリミティブ型
    • void, char, int, long, doubleなど
  • オブジェクト型
    • Object, String, Pointなど
    • その他、自分で定義したクラス
  • 配列型
    • int[], double[], String[] など
    • 配列型の配列型 int[][] なども存在する
  • 型がなくてもプログラムは作れる

    • Perl, Rubyなどのスクリプト言語は型がないものが多い
  • 型があることによって、プログラムの安全性が向上する

Test.java:3: 精度が落ちている可能性
検出値 : double
期待値 : int
int a = 10.5;
^
  • コンパイラに怒られるだけマシ
    • 怒られなかったらバグを見つけられない可能性がある
  • 文字、整数、実数、「無」などを表す型

  • オブジェクト指向に反する型

    • 他の”オブジェクト”と同じような扱いができない
    • Javaの次のバージョン(v1.5)からは意外とシームレス
  • Javaがそれなりに高速に動くのは、プリミティブ型があるから

  • いわゆるインスタンス

    • インスタンスについてはいずれ説明する
  • Javaに標準で存在するクラスや、自分で定義したクラスから作成されたインスタンスはこの型になる

  • オブジェクト指向の真髄である”オブジェクト”はこの型になる

  • 同一の型を多数保持するための型

  • 配列型もオブジェクト型の一種である

  • 変数は決められた種類の紙を1枚だけ入れることのできる箱

  • 箱の種類は型の数だけ存在する

02p09.png

  • 定数は型の名前と値が書かれた紙

02p10.png

  • 右辺の結果を紙に書いて、変数という箱に入れる
int a = 10 + 5;

02p11.png

  • 箱の中にある紙を新しい紙に書き写し、その紙を使用する
double r = 5.0;
double s = r * r * 3.14;

02p12.png

  • いくつかの箱が連なっているものをどこかに作る
  • 型の名前とその連なっている箱のある場所を書いてある紙

02p13.png

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

02p14.png

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

02p15.png

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

02p16.png

  • どうなるか考えてみましょう
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;
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);
int[][] aarray = new int[2][3];
  • int[]型の箱を2個用意するイメージ

02p19.png

int[][] aarray = new int[2][3];
  • “int[]型”の箱を2個作って世界のどこかに配置する (A)
  • (A)の位置を紙に書いて、“int[][]“型の箱”aarray”に入れる
  • “int型”の箱を3個作って世界のどこかに配置する (B)
  • (B)の位置を紙に書いて、(A)の0番目の箱に入れる
  • “int型”の箱を3個作って世界のどこかに配置する (C)
  • (C)の位置を紙に書いて、(A)の1番目の箱に入れる
aarray[1][2] = 100;
  • “int[][]型”の箱”aarray”から紙を取り出す
  • 紙に書いてある場所へ行く
  • 1番目の箱から紙を取り出す
  • 紙に書いてある場所へ行く
  • 2番目の箱から紙を取り出し、100と書いてある紙と置き換える
  • int型の2個の箱を持つ配列を作る
int[] array = new int[2];
  • int[]型の2個の箱を持つ配列を作る
int[][] aarray = new int[2][];
  • 少々直感から外れる (new int[][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;
  • 実際に絵を描くと分かりやすい
  • クラス(設計図)を元にインスタンス(製品)を世界のどこかに作る
  • 型の名前と製品が置いてある場所を書いてある紙

02p25.png

String s = "Hello";
  • この世のどこかに文字列”Hello”を表す製品がある
  • 文字列”Hello”はその製品が置いてある位置を示した紙
  • その紙を”String型”の箱”s”へ入れる

02p26.png

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

02p27.png

int x = p.x;
  • 箱”p”から紙を取り出す
  • 取り出した紙に書いてある場所へ行く
  • その場所で他の変数同様に動けばよい

02p28.png

double x = p.getX();
  • 箱”p”から紙を取り出す
  • 空の封筒を用意し、取り出した紙の内容をコピーして入れる
  • 呼び出し時に他の引数があれば、それらの紙も同封する
  • 箱”p”から取り出した住所へ、題名に”getX”とだけ書いて、ポストに投函
    • 送り主を今いる位置にする
  • 返事が来るまで待つ
    • 返事は紙が一枚送られてくる
  • 返事を”double型”の箱”x”へ入れる

メソッドの呼び出しで重要なこと

Section titled “メソッドの呼び出しで重要なこと”
double x = p.getX();
  • 封筒を送るだけなので、“p.getX()“が何をしてくれるか分からない

  • pの情報も同時に送る

  • 現状では重要ではないが、後々にオブジェクト指向の本質となる

class Point {
...
public double getX() [
return this.x;
}
}
  • 前準備を行う
    ++ 送られてきた封筒を受け取る
    ++ 1枚目の紙を箱 “this” に入れる
    ++ 2枚以上紙が同封されていた(引数がある)場合、順番に箱に入れていく
  • … this.x
    ++ 箱”this”に書いてある住所へ行く (普通は現在位置)
    ++ そこにある箱”x”を探し、中に入っている紙をコピーする
  • return …
    ++ コピーした紙を送り主に届ける
String s = "Hello";
char c = s.charAt(0);
char c = "Hello".charAt(0);
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”の行にプログラムを追加し、結果が以下のように表示されるプログラムを完成させよ

100
200
  • 第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はコーヒーを飲む”の挙動
  • 本講義で説明したほど詳しくなくて構わない