[小西ホームページ]   [目次・索引]   [前の授業]   [次の授業]

コンピュータIIB(Javaプログラミング入門)第12回

目次
12.1 メソッドの応用
12.1.1 変数のスコープ
12.2 データ型
12.2.1 データ型とは
12.2.2 整数と浮動小数点数
12.2.3 真理値とブール式
12.2.4 文字
12.3 試験について
12.4 演習12
12.5 レポート課題
12.6 参考文献
索引
ASCII   Unicode   基本データ型   クラス変数   参照データ型   真理値   スコープ   データ型   バイト   ビット   ブール式   浮動小数点数   文字符号   論理型  

12.1 メソッドの応用

12.1.1 変数のスコープ

変数は、宣言すれば使えます。 しかし、どこでも使えるわけではありません。 変数が使えるのは、ある一定の範囲内です。 変数の使える範囲を、変数の スコープscope )と呼びます。

前回、メソッド定義の中で変数を宣言しました。 メソッド定義の中で宣言した変数は、そのメソッド定義の中でしか使えません。 呼び出し側は、 main というメソッドの定義と見なせます。 したがって、呼び出し側の中で宣言した変数も、呼び出し側の中でしか使えません。

次の例では、メソッド main で変数 x , メソッド test で変数 y を宣言しています。 メソッド main では、 mainx は使えますが、 testy は使えません。 メソッド test では、 testy は使えますが、 mainx は使えません。

/*  1*/ class VariableScope1 { // 変数のスコープ1
/*  2*/     public static void main (String[] args) {
/*  3*/         int x = 100; // xを宣言
/*  4*/         test();
/*  5*/         System.out.println("main x = " + x);
/*  6*/         // testのyは使えない
/*  7*/     }
/*  8*/     static void test () {
/*  9*/         int y = 200; // yを宣言
/* 10*/         System.out.println("test y = " + y);
/* 11*/         // mainのxは使えない
/* 12*/     }
/* 13*/ }
asiaa1:~/comp2b b08a001$ java VariableScope1
test y = 200
main x = 100
asiaa1:~/comp2b b08a001$

では、呼び出し側とメソッド定義の間でデータを交換するには、どうしたらよいでしょう。 正解は、引数と返り値を使う、です。 呼び出し側からメソッド定義にデータを伝えるには、引数を使います。 メソッド定義から呼び出し側にデータを伝えるには、返り値を使います。

次の例では、メソッド mainx の値をメソッド test に伝えるために、引数を使って、その値を x2 に格納しています。 また、メソッド testy の値をメソッド main に伝えるために、返り値を使って、その値を y2 に格納しています。

/*  1*/ class VariableScope2 { // 変数のスコープ2
/*  2*/     public static void main (String[] args) {
/*  3*/         int x = 100, y2;
/*  4*/         y2 = test(x); // testのyをy2に格納
/*  5*/         System.out.println("test y = " + y2);
/*  6*/     }
/*  7*/     static int test (int x2) { // mainのxをx2に格納
/*  8*/         int y = 200;
/*  9*/         System.out.println("main x = " + x2);
/* 10*/         return y;
/* 11*/     }
/* 12*/ }
asiaa1:~/comp2b b08a001$ java VariableScope2
main x = 100
test y = 200
asiaa1:~/comp2b b08a001$

さて、呼び出し側とメソッド定義で同じ名前の変数を宣言しても、それらは別の変数と見なされます。

次の例では、メソッド main とメソッド test の両方で、変数 x を宣言しています。 メソッド mainx に100を格納し、メソッド testx の値を200に変更しているように見えます。 しかし、 mainx の値は100のままです。 メソッド test では、 mainx でなく、 testx に200を格納したのです。

/*  1*/ class VariableScope3 { // 変数のスコープ3
/*  2*/     public static void main (String[] args) {
/*  3*/         int x = 100;
/*  4*/         test(); // xは変わらない
/*  5*/         System.out.println("main x = " + x);
/*  6*/     }
/*  7*/     static void test () {
/*  8*/         int x = 200; // testのxに格納したから
/*  9*/         System.out.println("test x = " + x);
/* 10*/     }
/* 11*/ }
asiaa1:~/comp2b b08a001$ java VariableScope3
test x = 200
main x = 100
asiaa1:~/comp2b b08a001$

どうしても、呼び出し側とメソッド定義で同じ変数を使いたい場合は、 クラス変数class variable )というものを使います。 これは、 class の直下で宣言する変数で、

static int 変数;

などと書きます。 クラス変数は、呼び出し側でもメソッド定義でも同じ変数と見なされます。

次の例では、クラス変数 x を宣言しています。 メソッド mainx に100を格納し、メソッド testx の値を200に変更します。 今度は、 main でも test でも、 x の値は200になります。

/*  1*/ class VariableScope4 { // 変数のスコープ4
/*  2*/     static int x; // mainでもtestでも使える
/*  3*/     public static void main (String[] args) {
/*  4*/         x = 100;
/*  5*/         test(); // xは変わる
/*  6*/         System.out.println("main x = " + x);
/*  7*/     }
/*  8*/     static void test () {
/*  9*/         x = 200; // クラス変数xに格納したから
/* 10*/         System.out.println("test x = " + x);
/* 11*/     }
/* 12*/ }
asiaa1:~/comp2b b08a001$ java VariableScope4
test x = 200
main x = 200
asiaa1:~/comp2b b08a001$

12.2 データ型

12.2.1 データ型とは

データ型data type ) とは、データの種類のことです。 これまでに、整数と実数の2種類のデータを扱ってきました。 また、配列というデータも利用しました。 Javaには、この他のデータ型も用意されています。

Javaのデータ型は、まず、基本データ型と参照データ型の2つに大きく分類されます。 基本データ型primitive data type ) には、整数型、浮動小数点数型、論理型、および文字型があります。 参照データ型reference data type ) には、クラス型と配列型があります。 (クラス型については次回説明します。)

以下は、基本データ型の詳細です。

表 12.1  Javaの基本データ型
種類 型名 ビット 説明
整数型 byte 8 -27(-128)〜27- 1(127)
整数型 short 16 -215(-32768)〜215- 1(32767)
整数型 int 32 -231〜231- 1(9桁程度)
整数型 long 64 -263〜263- 1(18桁程度)
浮動小数点数型 float 32 指数+38〜-45, 有効桁数7桁程度
浮動小数点数型 double 64 指数+308〜-324, 有効桁数14桁程度
論理型 boolean - trueまたはfalse
文字型 char 16 \u0000(0)〜\uFFFF(65535)

コンピュータのデータは、究極的には0と1です。 この0と1を、 ビットbit ) と呼びます。 8桁のビットを バイトbyte ) と呼びます。 現在のコンピュータは、バイトを基本単位としています。 基本データ型が8ビット単位であるのは、ここに理由があります。

12.2.2 整数と浮動小数点数

整数を扱う場合、普通は int 型を用います。 ただし、 int 型は9桁程度が限界であり、これを超えると意味のない計算をしてしまいます。 int 型の範囲を超えるような大きい数を扱うときに、 long 型を用います。

今まで、実数と呼んできたものは、正確に言うと浮動小数点数です。 浮動小数点数floating point number ) とは、小数点をずらすことによって、非常に大きな数や非常に小さな数も表現できるようにした実数のことです。 浮動小数点数を扱う場合、普通は double 型を用います。 限られたビット数で表現する以上、小数点をずらす桁数には限度がありますし、小数の精度にも限界があります。

12.2.3 真理値とブール式

Javaには、物事の真偽を表すデータもあります。 正しいことや条件が成り立つことが真で、記号 true で表されます。 間違っていることや条件が成り立たないことが偽で、記号 false で表されます。 この true と false を 真理値truth value ) と呼びます。

論理型logical type ) とは、真理値を表すデータ型です。 Javaでは、 boolean 型が論理型です。 値が論理型である式を、 ブール式Boolean expression ) と呼びます。 これまで「条件が成り立つ」とか「条件が成り立たない」と言ってきたことは、正確には、ブール式の値が true や false になることです。

12.2.4 文字

Javaにとっては、文字も立派なデータです。 しかも、アルファベットだけでなく、漢字などもデータとして扱えます。

もし、文字を1バイトで表現すると、256種類が限界となります。 2バイトなら、65536種類の文字が表現可能です。 Javaは、文字( char 型)を1バイトではなく2バイトで表現します。

なお、ちょうど1バイトで表現されるデータ型として、バイト( byte )が用意されています。

文字は、コンピュータの中では整数として処理されます。 この、文字から整数への対応を 文字符号character code ) と呼びます。

Javaが採用している文字符号はUnicodeです。 このUnicodeを理解するには、その前にASCIIを理解する必要があります。 ASCII は、アメリカで制定された文字符号です。 ASCIIでは、数字、アルファベット、記号などに符号が割り当てられています。 そして、 Unicode は、ASCIIを元にして、世界中の文字を追加した文字符号です。 Unicodeでは、漢字などにも符号が割り当てられています。

主な文字のASCII符号は次の通りです。

表 12.2  主な文字のASCII符号
文字 符号
文字 符号
文字 符号
文字 符号
文字 符号
文字 符号


0 48 @ 64 P 80 ` 96 p 112
! 33 1 49 A 65 Q 81 a 97 q 113
" 34 2 50 B 66 R 82 b 98 r 114
# 35 3 51 C 67 S 83 c 99 s 115
$ 36 4 52 D 68 T 84 d 100 t 116
% 37 5 53 E 69 U 85 e 101 u 117
& 38 6 54 F 70 V 86 f 102 v 118
' 39 7 55 G 71 W 87 g 103 w 119
( 40 8 56 H 72 X 88 h 104 x 120
) 41 9 57 I 73 Y 89 i 105 y 121
* 42 : 58 J 74 Z 90 j 106 z 122
+ 43 ; 59 K 75 [ 91 k 107 { 123
, 44 < 60 L 76 \ 92 l 108 | 124
- 45 = 61 M 77 ] 93 m 109 } 125
. 46 > 62 N 78 ^ 94 n 110 ~ 126
/ 47 ? 63 O 79 _ 95 o 111


12.3 試験について

シラバスに書いた通り、来週の授業中に試験を行います。 来週は欠席しないようにしてください。

来週の試験は、授業の教室で、授業の後半の30分間で実施します。 試験の方法は筆記試験で、資料の持ち込みやパソコンの利用は不可とします。


12.4 演習12

問1. Javaで掛け算はどの記号で表されるか、以下の中から最も適切なものを一つ選びなさい。

A. .
B. *
C. #
D. x

問2. Javaで式 10 + 20 / 5 の値は何か、以下の中から最も適切なものを一つ選びなさい。

A. 150
B. 110
C. 6
D. 14

問3. Javaで整数型( int 型)の変数 xy を宣言するにはどう書くか、以下の中から最も適切なものを一つ選びなさい。

A. int xy;
B. int x y;
C. int x, y;
D. int x; y;

問4. Javaで変数 x に変数 y の値を代入するにはどう書くか、以下の中から最も適切なものを一つ選びなさい。

A. y = x;
B. y == x;
C. x = y;
D. x == y;

問5. Javaで変数 x の値を1減少するにはどう書くか、以下の中から最も適切なものを一つ選びなさい。

A. x--;
B. x-;
C. x----;
D. x---;

問6. Javaで実数(浮動小数点数) 1.0E8 は何を意味するか、以下の中から最も適切なものを一つ選びなさい。

A. 100000000.0
B. 10000000.0
C. 1000000.0
D. 100000.0

問7. Javaで文 if (x < 0) { System.out.println("負の数"); } はどう動くか、以下の中から最も適切なものを一つ選びなさい。

A. x の値が0より小さくない間、「負の数」と出力を繰り返す。
B. x の値が0より小さい間、「負の数」と出力を繰り返す。
C. もし x の値が0より小さくないならば、「負の数」と出力する。
D. もし x の値が0より小さいならば、「負の数」と出力する。

問8. Javaで変数 xy が等しいという条件はどう書くか、以下の中から最も適切なものを一つ選びなさい。

A. x = y
B. x == y
C. x === y
D. x ==== y

問9. Javaで変数 x は10以上かつ20以下という条件はどう書くか、以下の中から最も適切なものを一つ選びなさい。

A. 10 <= x && x <= 20
B. 10 <= x || x <= 20
C. 10 <= x ** x <= 20
D. 10 <= x ++ x <= 20

問10. Javaの if 文で、条件が成り立たない場合を意味するキーワードは何か、以下の中から最も適切なものを一つ選びなさい。

A. and
B. or
C. default
D. else

問11. Javaの switch 文で、どれでもない場合を意味するキーワードは何か、以下の中から最も適切なものを一つ選びなさい。

A. else
B. default
C. and
D. or

問12. Javaで変数 i の値が0のとき、文 while (i < 0) { System.out.println(i); } はどう動くか、以下の中から最も適切なものを一つ選びなさい。

A. 0が1回出力される。
B. 0が2回出力される。
C. 何も出力されない。
D. 0が限りなく出力される。

問13. Javaで文 for (i = 0; i < 10; i++) { System.out.println(i); } はどう動くか、以下の中から最も適切なものを一つ選びなさい。

A. 0から9までの10個の数が出力される。
B. 0から10までの11個の数が出力される。
C. 1から9までの9個の数が出力される。
D. 1から10までの10個の数が出力される。

問14. Javaで繰返し文の中の break 文を実行するとどうなるか、以下の中から最も適切なものを一つ選びなさい。

A. プログラムを終了する。
B. プログラムの最初に戻る。
C. 繰返しを終了する。
D. 繰返しの最初に戻る。

問15. Javaで要素数が10である整数型( int 型)の配列 a を宣言・生成するにはどう書くか、以下の中から最も適切なものを一つ選びなさい。

A. int[] a = new int[12];
B. int[] a = new int[11];
C. int[] a = new int[10];
D. int[] a = new int[9];

問16. Javaで配列を int[] a = {10, 20, 30, 40}; と初期化すると、式 a[1] の値は何か、以下の中から最も適切なものを一つ選びなさい。

A. 40
B. 30
C. 20
D. 10

問17. Javaで配列 a に対して式 a.length は何を意味するか、以下の中から最も適切なものを一つ選びなさい。

A. 配列の要素の最大値
B. 配列の要素の最小値
C. 配列の要素の合計
D. 配列の要素数

問18. Javaで改行を出力するメソッド newline を定義するにはどう書くか、以下の中から最も適切なものを一つ選びなさい。

A. static void newline () { System.out.println(); }
B. static void newline { System.out.println(); }
C. static int newline () { System.out.println(); }
D. static int newline { System.out.println(); }

問19. Javaで2つの引数の和を返すメソッド add を定義するにはどう書くか、以下の中から最も適切なものを一つ選びなさい。

A. static int add (int x, y) { return x + y; }
B. static int add (int x, y) { x + y; }
C. static int add (int x, int y) { return x + y; }
D. static int add (int x, int y) { x + y; }

問20. Javaで2つの引数の和を返すメソッド add を呼び出して、10と20の和を求めるにはどう書くか、以下の中から最も適切なものを一つ選びなさい。

A. add(10, 20)
B. add(int 10, int 20)
C. add(int 10, 20)
D. add(10, int 20)

12.5 レポート課題

今日の演習12の答案をメールで提出してください。 差出人は学内のメール・アドレス(b08a001@cis.twcu.ac.jpなど)とし、宛先はkonishi@cis.twcu.ac.jpとします。 メールの本文には、学生番号、氏名、科目名、授業日(7月15日)を明記してください。


12.6 参考文献


[小西ホームページ]   [目次・索引]   [前の授業]   [次の授業]

2011年7月15日更新
小西 善二郎 <konishi@cis.twcu.ac.jp>
Copyright (C) 2011 Zenjiro Konishi. All rights reserved.