Javaプログラミング入門【第3
回】
前回の復習







変数と型
if文
swich文
for文
while文
String型
変数とは



何かを入れておく箱のようなもの
変数という箱に対してできること






変数を作る(変数宣言)
値を入れる(代入)
値を見る(参照)

変数名は数字で始めることは出来ない
変数の初期化
• 初期化
▫ 変数宣言と同時に値を定める
 int x = 3;
 3という値で初期化されたint型変数x

 int x;
 未定義の変数
代入演算子
• 代入演算子
▫ x = 3;
 x←3; という意味

• 値が等しいかどうかを調べる(等価)
▫ x == y
Java言語の型
• 基本型(primitive type/プリミティブタイプ)
▫ 論理値及び数値を表す型

• 参照型(reference type/リファレンスタイプ)
▫ クラス、インターフェース、配列やenum型を表
す型
if文
• 日本語の『もしも…ならば』
if (条件式) {
条件が成り立つ時の処理

}

• 条件式は必ずboolean値(true/false)の値になる
比較演算子
Java

数学

意味

p == 50

p = 50

pが50に等しいならtrue、それ以外はfalse

p != 50

p ≠ 50

pが50に等しくないならtrue、それ以外はfalse

p >= 50

p ≧ 50

pが50以上であればtrue、それ以外はfalse

p <= 50

p ≦ 50

pが50以下であればtrue、それ以外はfalse

p > 50

p > 50

pが50より大きいならtrue、それ以外はfalse

p < 50

p < 50

pが50より小さいならtrue、それ以外false
if ~else文
• 日本語の『もしも…ならば、それ以外は』
If (条件式) {
条件式に当てはまった時の処理
} else {
条件式に当てはまらなかった時の処理
}
if文の連鎖
• if文は連鎖で書ける
if (条件式1) {
条件式1を満たす時の処理

} else if (条件式2) {
条件式2を満たす時の処理

} else {
条件式1、2共に当てはまらない時の処理

}
論理演算子『||(または)』
• 2つの条件を結びつけ、その2つのうちどちらか
一方でも(両方でも可)成り立っていればよい
• 論理和、OR条件という
論理演算子『&&(かつ)』
• 2つの条件式を結びつけ、その2つのどちらも成
り立つ
• 論理積、And条件と言う
switch文
• 多くの選択肢から1つを選んで実行する場合、
switch文を使用するとプログラムが見やすくなる
switch (式) {

case 定数式1:

case1の時の処理
break;

case 定数式2:

case2の時の処理
break;

default:

}

case1、2共に当てはまらない時の処理
break;
switch文
• Switch文を実行する時、()でくくられた式が計
算される。
▫ これを『式の評価』という

• break
▫ 処理の中断を表す

• 文字(char)による式の評価も出来る
定数式
• 『コンパイルした時点で値が決まる』のが定数
式
▫ 定数式:1+2+3

• x+2+3は定数式ではない
▫ xの値が評価する時点で式の値が変化するため
for文
• 条件を満たす間繰り返す
for (初期化; 条件式; 次の一歩) {
繰り返す処理

}
for文で0から3までを表示する
public class Count3 {
public static void main(String[] args) {
for (int i = 0; i < 4; i++) {
System.out.println(i);

}
System.out.println(“end”);

}

}
while文
• 条件文が条件を満たす限り、ある処理を繰り返
して行う
while(条件式) {
繰り返す処理

}

• 条件式はboolean型の式(true/false)
0から3までを表示する
Public class While1 {
public static void main(String[] args) {
int i = 0;
while (i < 4) {
System.out.println(i);
i++;
}
System.out.println(“end”);
}
}
Stringクラスにあるメソッドの一部
メソッド

動作

String replace(char oldChar, char
newChar)

文字列のoldCharをすべてnewCharに置換
した新しい文字列を返却する

String substring(int beginIndex)

文字列のbeginIndex番目の文字以降からな
る新しい文字列を返却する

String substring(int beginIndex, int
endIndex)

文字列のbegineIndex番目~endIndex-1番
目の文字からなる新しい文字列を返却する

String toLowerCase()

文字列中の大文字を全て小文字に変換した
新しい文字列を返却する

String toString()

文字列自体を返却する

String toUpperCase()

文字列中の小文字を全て大文字に変換した
新しい文字列を返却する

String trim()

文字列の両端からホワイトスペースを取り
除いた新しい文字列を返却する
オブジェクトを『参照』する
• String型などのオブジェクトの型は参照型と言
われる
• 参照型の変数にはオブジェクトが直接代入され
ているわけではなく、メモリのどこかに存在す
るオブジェクトを指し示す値(メモリのアドレス、
ポインタ、インデックス、インジケータなどと
も呼ばれれる)が代入されている
オブジェクトを『参照』する
• String word = “Hello!”;
変数word

Hello!
オブジェクトを『参照』する
• word = “こんにちは”;
変数word

文字列Helloは書き変わらない

Hello!
→ガーベッジ(ごみ)になった
変数wordの値は
変わる

こんにちは
オブジェクトを『参照』する
• String newWord = word;
変数word

変数wordとnewWordが
同じ文字列を指す
変数newWord

こんにちは
オブジェクトを『参照』する
• word = null;
変数word

変数wordは何も参照していない

こんにちは
変数newWord
多重定義(オーバーロード)
• 複数のメソッドが同じ名前を使うことをメソッ
ドの多重定義(オーバーロード)と呼ぶ
• メリット:プログラマが覚えなければならない
メソッドの名前の数を減らすことが出来る
• コンパイラは引数の型と個数によって、実際に
使われているメソッドを認識する
• 引数の型と個数のことをメソッドのシグニチャ
と呼ぶ
前回の続き
• String型
• break文、continue文
• do-while文
文字列の一致はequalsを使う
• 変数xとyが等しいかどうかを調べる時
• 変数xとyが基本型の場合
▫ x == y

• 変数xとyが参照型の場合
▫ x.equals(y)
演習12
• 以下のプログラムをwhile文で書き換えなさい
public class DrawGraph {
public static void main(String[] args) {
for (int i =0; i < 10; i++) {
System.out.println(i + “:”);
for (int j = 0; j < i; j++) {
System.out.print (“*”);
}
System.out.println(“”);
}
}
}
do-while文
• 繰り返す処理を1回必ず実行する
→処理を行ってから、条件式を判定する
Do {
繰り返す処理

} while (条件式);
break文
• forやwhileの繰り返しを中断する仕組みにbreak
文がある
while (…) {
…
if (条件式) {
break;
}
…
}

←while文を抜ける
二重ループとbreak文
• forやwhileが二重になっている場合、breakで中断
するのは内側のループのみ
while (…) {
while (…) {
if (条件式) {
break;
}
…
}
…
}

内側のwhile文のみ中断
continue文
• ループをスキップするのがcontinue文
while (…) {
…
if (条件式) {
continue;
}
…
}

whileの残りの処理をスキップし、
次のループに入る
演習13
• 次のスライドのプログラムContinueTest.javaは
何をするプログラムか?また、
ContinueTest.javaをcontinueを使わない形式に
書き換えなさい
ContinueTest.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class ContinueTest {
public static void main(String[] args) {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
try {
String line;
while ((line = reader.readLine()) != null) {
if (!line.endsWith("{") && !line.endsWith("}")) {
continue;
}
System.out.println(line);
}
} catch (IOException e) {
System.out.println(e);
}
}
}
if文とwhile文
• if文
if(条件式){
処理

}

• while文
while(条件式) {
処理

}

• if文とwhile文は同じ形をしていて、条件式を満
たさない限り、処理は実行されない
if文とwhile文
• if文は繰り返さないwhile文であり、while文はif文の繰り
返しである
• 「処理」が実行され始める時は、必ず「条件」は満たさ
れた状態になっている
▫ 「もしも条件が満たされたら処理を行う」→「今、この
処理を行うのなら、先ほどの条件は必ず満たされている
ことが前提となっている」
(例)
while ( i < 100) {
if (i < 100) {
処理

}

}
この場合のif文は無駄
今回の内容
• メソッド(クラスメソッド)
• 配列
• オブジェクト指向に向けて
メソッドとは
• n = Integer.parseInt("100");
メソッド
引数
• メソッドから戻ってくる整数100を戻り値と言
う
• Integer.parseIntに仕事をしてもらうことをメ
ソッド呼び出しと言う
半額セールの金額計算
• 半額セールで元値が10,000円の商品を買った
ら、金額はいくら?
• 上記を数式で表してみると
▫ p(金額) ÷2
Java言語で書いてみる
• 半額の計算をするプログラムDiscount1.javaを作
成してください。
• pの値は10000とします。
まとまった仕事をメソッドで表現する
• 「半額計算をする」という仕事を、halveメソッ
ドで表現してみる
メソッドを分解する
•
•
•
•
•
•
•
•

public
static
int
halve
(
int n
)
return
public
• アクセス制御を表す
• ここでは、だれでも呼べるメソッド
• 詳細は後日
static
• クラスメソッド
• staticなメソッドからは、staticなメソッドしか
呼び出せない
• 詳細はクラスについて学んでから
int halve(int n)
• int メソッドの戻り値の型を宣言
• halve 「半分にする」という意味。メソッド名
▫ 変数の名前は名詞、メソッドの名前は動詞にする
ことが多い
▫ 名前は自由だが、名前の途中にアンダースコアつ
けるのはJavaのお作法としてはNG

• (int n) メソッドの引数(メソッドの入力)
▫ ここではint型のnという変数を意味する
return
• メソッドの戻り値を記述する
• returnの後ろには式も記述出来る
• メソッドからの出力とも言う
戻り値がないメソッド例
public class Graph1 {
public static void main(String[] args) {
printGraph(10);

}
public static void printGraph(int x) {
for (int i = 0; i< x; i++) {
System.out.print("*");

}
System.out.println("");

}

}
戻り値のないメソッド
• 戻り値にvoidと記述があると、戻り値がないメ
ソッドを表す
• 「空の」「無効の」という意味
ローカル変数(局所変数)
• printGraphの中に登場する変数iは、このメソッ
ド内でのみ有効な変数
▫ このような変数をローカル変数(局所変数)と言う
引数の数を変える
public class Power1 {
public static void main(String[] args) {
System.out.println(getPower(8, 2));

}
public static int getPower(int x, int n) {
int y = 1;
for (int i =0; i < n; i++) {
y = x * x;

}

}

}
引数の数を変える
• 注意点
▫ メソッドの引数はいくつあってもOK
▫ メソッドの引数は、型を一つ一つ記述しなければ
ならない
Systemクラスはどこにいる?
• System クラス名
• out フィールド(変数)名
• println outが持ってるメソッドの名前

• Systemのようによく使用されるものはクラスラ
イブラリとして提供されている
演習1
• printGraphを使用して、以下のような放物線を描くプログラムを記述してくだ
さい。
***************************************
***************************
***************
********
****
*
*
****
********
***************
***************************
***************************************
配列
• 変数に番号を付けて並べたものを配列という
• 配列はクラスと同じく「参照型」
変数の復習
• 国語・数学・英語の平均点を計算するプログラム
public class Heikin1{
public static void main(String[] args) {
int kokugo, suugaku, eigo;
double heikin;

kokugo = 63;
suugaku = 90;
eigo = 75;
heikin = (kokugo + suugaku + eigo) / 3.0;

}

}

System.out.println("国語は" + kokugo + "点");
System.out.println("数学は" + kokugo + "点");
System.out.println("英語は" + eigo + "点");
System.out.println("平均点は" + heikin + "点");
配列を使ったプログラム
public class Heikin2 {

public static void main(String[] args) {
int[] ten;
double heikin;

ten = new int[3];
ten[0] = 63;
ten[1] = 90;
ten[2] = 75;
heikin = (ten[0] + ten[1] + ten[2]) / 3.0;

}

}

System.out.println("国語は" + ten[0]+ "点");
System.out.println("数学は" + ten[1] + "点");
System.out.println("英語は" + ten[2] + "点");
System.out.println("平均点は" + heikin + "点");
配列用の変数を宣言する
• int[] ten;
▫ 「 intの配列」という型宣言
▫ tenは変数名
配列を確保する
• ten = new int[3];
▫ int型の変数3つ分の領域がメモリ上に確保される
▫ 3は、配列の要素の個数
▫ newは新しくメモリを確保するときに使うJavaの
予約語
▫ 配列の要素の個数のことを配列の長さ(length)と
言う
配列の要素に代入する
• Javaの配列要素は必ず0番目から始まる
ten[0] = 63; 1個目
ten[1] = 90; 2個目
ten[2] = 75; 3個目

▫ 要素の数は3つ!

• []の間にある数字を添字と言う
配列の要素と普通の変数の比較
int[]型の変数

int型の変数

宣言

int[] ten;

int kokugo, suugaku, eigo;

確保

ten = new int[3];

(不要)

代入

ten[0] = 63;
ten[1] = 90;
ten[2] = 75;

kokugo = 63;
suugaku = 90;
eigo = 75;

参照

System.out.println("国語は" +
ten[0]+ "点");
System.out.println("数学は" +
ten[1] + "点");
System.out.println("英語は" +
ten[2] + "点");

System.out.println("国語は" + kokugo +
"点");
System.out.println("数学は" + kokugo +
"点");
System.out.println("英語は" + eigo + "
点");
添字を変数にする
public class Heikin3 {
public static void main(String[] args) {
int[] ten;
int sum;
double heikin;
ten = new int[3];
ten[0] = 63;
ten[1] = 90;
ten[2] = 75;
sum = 0;
for (int i =0; i < 3; i++) {
sum = sum + ten[i];
}
heikin = sum / 3.0;
System.out.println("国語は" + ten[0]+ "点");
System.out.println("数学は" + ten[1] + "点");
System.out.println("英語は" + ten[2] + "点");
System.out.println("平均点は" + heikin + "点");

}
}
配列の長さを表すlength
public class Heikin4 {
public static void main(String[] args) {

int[] ten;
int sum;
double heikin;
ten = new int[5];
ten[0] = 63;
ten[1] = 90;
ten[2] = 75;
ten[3] = 45;
ten[4] = 81;
sum = 0;
for (int i =0; i < ten.length; i++) {
sum = sum + ten[i];
}
heikin = (double) sum / ten.length;
System.out.println("国語は" + ten[0]+ "点");
System.out.println("数学は" + ten[1] + "点");

System.out.println("英語は" + ten[2] + "点");
System.out.println("理科は" + ten[3] + "点");
System.out.println("社会は" + ten[4] + "点");
System.out.println("平均点は" + heikin + "点");
}
}
lengthを使う利点
• ten.lengthと記述すれば、「配列の長さ」という
意味がより強くプログラムで表現できる
▫ 人間に読みやすいプログラム

• 将来プログラムを変更して、7科目になっても、
ten.lengthの部分は変更しなくて良い
キャスト演算子
• (double) sum / ten.length
▫ 型変換を強制的に行うための演算子
▫ =キャスト演算子
▫ ten.lengthはint型なので、キャストしないと小数
点以下が切り捨てになることに注意
配列の初期化
• 配列はまとめて初期化が出来る
▫ 配列の型[] 配列 = {要素, 要素, 要素, 要素,...};
▫ 配列 = new 配列の型[] {要素, 要素, 要素, 要素,...};
初期化の例
public class Heikin5 {
public static void main(String[] args) {
int[] ten = {63, 90, 75, 45, 81};
int sum;
double heikin;
sum = 0;
for (int i =0; i < ten.length; i++) {
sum += ten[i];
}
heikin = (double) sum / ten.length;
System.out.println("国語は" + ten[0]+ "点");
System.out.println("数学は" + ten[1] + "点");
System.out.println("英語は" + ten[2] + "点");
System.out.println("理科は" + ten[3] + "点");
System.out.println("社会は" + ten[4] + "点");
System.out.println("平均点は" + heikin + "点");
}
}
2次元配列
• 配列の配列を作ることが出来る
▫ これを2次元配列と呼ぶ

• 宣言
int[] [] tens;
int[][] tens = {
{63, 90, 75, 45, 81},
{85, 100, 95, 80, 90},
{100, 100, 100, 95, 100}

};

• 2次元配列の要素数は一定でなくてもよい
表計算
public class Heikin5 {

public static void main(String[] args) {
int[][] tens = {
{63, 90, 75, 45, 81},
{85, 100, 95, 80, 90},
{100, 100, 100, 95, 100}
};

}

}

for (int i = 0; i < tens.length; i++) {
int sum = 0;
for (int j = 0; j < tens[i].length; j++) {
System.out.print("t" + tens[i][j]);
sum += tens[i][j];
}
System.out.println("t| " + (double)sum / tens[i].length);
}
int[] tenとint ten[]
• 配列の型表記には2つの方法がある
• どちらもまったく同じ意味を持つ
配列の要素を巡る拡張for文
• Java5より使用出来る拡張for文を使用すると配
列の要素を簡単に回すことが出来る
• 拡張for文の形
for (int n: ten) {
System.out.print(ten);

}
for(要素の型 変数名: 配列) {
変数を使った処理

}
演習2
• 最大値を求めるプログラムを完成させなさい(???の
部分を埋めなさい)
public class ShowMaxData {
public static void main(String[] args) {
int[] data = {31, 41, 59, 26, 53, 58, 97, 93, 23, 84};
int maxData = data[0];
for (int i = 0; i < ???; i++) {
???

}
System.out.println("最大値は" + maxData + "です");

}

}
演習3
• 配列dataの要素を小さい順に並べ替えるプログ
ラム(ソートプログラム) SortDataを完成させな
さい

• 表示結果
並べ替える前
31 41 59 26 53 58 97 93 23 84
並べ替えた後
23 26 31 41 53 58 59 84 93 97
SortData
public class SortData {
public static void main(String[] args) {
int[] data = {31, 41, 59, 26, 53, 58, 97, 93, 23, 84};
System.out.println("並べ替える前");
for (int i =0; i < data.length; i++) {
System.out.print(data[i] + " ");
}
System.out.println("");
for (int i = 0; i < ???; i++) {
for (int j = i + 1; j < ???; j++) {
if (data[i] > data[j]) {
// 交換
???
}
}
}
System.out.println("並べ替えた後");
for (int i = 0; i < data.length; i++) {
System.out.print(data[i] + " ");
}
System.out.println("");
}
}
演習4
• int型の2次元配列の内容を表示するメソッド
printArrayを完成させなさい
• 実行結果
{
{ 3, 1, 4, 1, },
{5, 9, 2, },
{6, 5, },
{3, }

}
PrintArray.java
public class PrintArray {
public static void main(String[] args) {
int[][] arr = {
{3, 1, 4, 1, },
{5, 9, 2, },
{6, 5, },
{3, }
};
printArray(arr);
}
public static void printArray(???) {
System.out.println("{");
for (int i =0; ???; i++) {
System.out.print(???);
for (int j =0; ??? ; j++) {
System.out.print(???);
}
System.out.println(???);
}
System.out.println("}");
}
}
参考文献
• Java言語

プログラミングレッスン[第3版]上

▫ 結城浩[著]

Javaプログラミング入門【第3回】