振り返りとして纏めてみる。
@Contents
Javaプログラムの作成
public class Test {
public static void main(String[] args) {
System.out.println("Good morning");
System.out.println("Hello");
System.out.println("Good night");
}
}
- Javaのプログラムの1単位 -> クラス
- このプログラムのクラスは
Test
- このプログラムのクラスは
main
は処理をまとめたもの -> メソッド- この場合はメインメソッド
public static void main(String[] args)
- この場合はメインメソッド
System.out.println
は処理=命令文。- 実行時は上から下に向かって、書かれた処理が順番に実行される(逐次ともいう)
{}
:ブロック- インデントをして見やすく
- Eclipse ->
⌘⇧F
- IntelliJ ->
⌘⌥L
- Eclipse ->
- コメント:
//
(単一行)、/* */
(複数行)- 動作させたくないコードにも有効
起こり得るエラー
- コンパイルエラー:プログラマの書き間違いで実行できないコード
- 半角英数で記述
""
やコメントで囲った箇所は全角でもOK
- 全角スペースはダメ
- ファイルにつけた名前とクラス名は一致させる
- メインメソッド(
main
)は必ず記述 - 行末のセミコロン(
;
)を記述 - クォーテーションや括弧の閉じを忘れない
- 半角英数で記述
- 例外:処理するデータに問題があって発生するもの
Javaにおける変数の取り扱い
変数の宣言と代入
- 変数
int
:数値型String
:文字列型
- 変数に名前をつけることを宣言という
- 小文字で命名
- 宣言した変数にデータを入れることを代入という
public class Variable {
public static void main(String[] args) {
int number1;
String str1;
number1 = 1;
str1 = "abc";
System.out.println(number1);
System.out.println(str1);
}
}
1
abc
int number1;
(メインメソッドの1行目)とString str1;
(〃の2行目)で変数を宣言int
とString
は型
number1 = 1;
(〃の3行目)str1 = "abc";
(〃の4行目)で代入- 代入の処理には
=
を使用
- 代入の処理には
- 変数の宣言と代入は1行にまとめられる
- 例:
int number1 = 1;
- 例:
変数を使う上での注意点
- 変数名は自由につけることができる
- 「分かりやすい」変数名をつけることが重要(可読性)
- プログラミングでは英語読みがデファクトスタンダード(事実上の標準ルール)
- 計算過程を書いておくような定義の方がわかりやすい
- 例:
24 * 60 * 60
(1日の秒数)
- 例:
- コメントを添えておくと良い
- スネークケースとキャメルケース
- スネークケースの例:
seconds_per_day
- キャメルケースの例:
secondsPerDay
- スネークケースの例:
- 代入されているデータは上書き可能
- 意味もなく同じ変数名を使い回すと、プログラムが意図しない動作をする危険がある
- 明確な意図があるときのみ使用
- 意味もなく同じ変数名を使い回すと、プログラムが意図しない動作をする危険がある
int
からString
には上書きできない
- 変数名にできないもの
- 数字から始まる変数名
- 例:
1abc
。a1bc
は可
- 例:
- ハイフン
- 単語をつなげる場合は
_
を(アンダーバー)使用
- 単語をつなげる場合は
- 予約語(
if
など)
- 数字から始まる変数名
変数のデータ型
- 基本データ型(プリミティブ型)
byte
short
int
long
float
double
char
boolean
- 数値型
- 整数
- 浮動小数点数(実数)
- ※整数と小数に違いがある
- ※小数を明示しない限り使えない
整数型
int
- 32ビット(4バイト)
- デフォルト値:
0
- 整数 -2147483648~2147483647(約21億)の値を扱える
- Java8以降で符号なしの値にした場合は0〜4,294,967,295
long
- 64ビット(8バイト)
- デフォルト値:
0
- 整数 -9223372036854775808~9223372036854775807(約100京)の値を扱える
- Java8以降で符号なしの値にした場合は0〜18,446,744,073,709,551,615
- 数字の値の後に「
i
」もしくは「I
」 - 小文字の「
i
」は数字の「1
」と間違えやすいため一般的には大文字の「L
」を使う - 例:
long num = 17232185782435249L;
- (
byte short
)- 性能の低い環境(昔のコンピュータ)でのみ利用を検討する価値がある
- 現在では
int
を普段使い
long
は便利であるが全ての整数にlong
を使えばメモリに負担がかかってしまう。なので必要なときに限ってlong
を使い、普段はint
を使うようにする。
小数型(浮動小数点数)
float
- 32ビット(4バイト)
- デフォルト値:
0.0
- 数字の値の後に「
f
」もしくは「F
」
double
- 64ビット(8バイト)
- デフォルト値:
0.0
- 小数を扱うときは
double
がほとんど - 数字の値の後に「
d
」もしくは「D
」 - 省略した場合はdouble型とみなされる
真偽値型
boolean
(ブーリアン)- 1ビット
- デフォルト値:
false
true
、もしくはfalse
を表す真偽値T
やF
と略されることもある
文字型
char
(キャラ、チャー)- 16ビット(2バイト)
- デフォルト値:
¥u0000
(空文字) - Unicodeが持つ1文字
- 「
’
」(シングルクォーテーション)で1文字を囲むことでchar値を指定可
参照型
String
(文字を扱う)は基本データ型ではなく、参照型と呼ばれるもの。基本データ型以外の型はすべて参照型。参照とは、データが置かれているメモリ上の場所のことを指す。
null
:指し示す場所が何もないということ。NullPointerException
=エラー。2ちゃんの「ぬるぽ」はこれが語源。
1 :仕様書無しさん:02/06/20 15:09
∧_∧
( ´∀`)< ぬるぽ
2 :仕様書無しさん:02/06/20 15:11
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/ ←>>1
(_フ彡 /
参照元:NullPointerExceptionを「ぬるぽ」と呼ぶスレ
基本データ型のラッパークラス
基本データ型を参照型として扱うこともできる=ラッパークラス。
基本データ型 | ラッパークラス |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
int
とchar
以外は先頭の文字を大文字に変えるだけint
がInteger
、char
がCharacter
- 変換は自動的に行われる
- 明示的に変換の命令を記述する必要はない(可能ではある)
- 参照型の初期値は
null
四則計算+α
計算には算術演算子を使用する。
算術演算子 | 説明 |
---|---|
+ | 足す |
– | 引く |
* | 掛ける |
/ | 割る |
% | 割った余りを求める |
++ | 1増加させる |
-- | 1減少させる |
public class Arithmetic {
public static void main(String[] args) {
int num1 = 131;
int num2 = 19;
int result = num1 + num2;
System.out.println("num1 + num2 = " + result);
result = num1 - num2;
System.out.println("num1 - num2 = " + result);
result = num1 * num2;
System.out.println("num1 * num2 = " + result);
result = num1 / num2;
System.out.println("num1 / num2 = " + result);
result = num1 % num2;
System.out.println("num1 % num2 = " + result);
}
}
num1 + num2 = 150
num1 - num2 = 112
num1 * num2 = 2489
num1 / num2 = 6
num1 % num2 = 17
- 5つの変数を使う方法もあるが、それだと5倍のメモリを必要とする。よって、1つの変数
result
に置き換える - 文字列同士、もしくは文字列と数値のデータに
+
を使うと、文字列の連結が可能 - 整数と整数の割り算の商は、整数値(小数点以下が切り捨て)
3 / 2
を計算した結果は1
- 小数値が必要な場合はキャストを行う(下記のコード)
public class Cast {
public static void main(String[] args) {
int a = 3;
int b = 2;
System.out.println(a / b);
System.out.println((double) a / b);
System.out.println((double) (a / b));
}
}
1
1.5
1.0
- キャストとはある変数の型を処理の途中で一時的に別の型に変換した上で処理を行う仕組みのこと
- 割り算全体を
double
にキャストするのはダメ- 計算式ではなくデータ(変数)へ
- 割り算全体を
Javaの例外処理
public class Exception {
public static void main(String[] args) {
System.out.println("処理開始");
try {
System.out.println("割り算開始");
int a = 10 / 0;
System.out.println(a);
} catch (ArithmeticException e) {
e.printStackTrace();
} finally {
System.out.println("割り算終了");
}
System.out.println("処理終了");
}
}
処理開始
割り算開始
割り算終了
処理終了
java.lang.ArithmeticException: / by zero
at Exception.main(Exception.java:8)
- 通常であれば
0
の割り算はエラーが表示されるArithmeticException
(算術エラー)Exception
=実行時に起こるエラー(例外とも呼ぶ)- 参考:クラスArithmeticException
- 例外処理を入れることでエラーが発生しても最後まで処理される
try
:例外が発生しそうな箇所を囲むcatch
:終了することなくcatch
ブロック内の処理を実行printStackTrace
:発生した例外の内容をログへ残す際に使われる命令- 例外発生時の処理が不要であれば空でも良い
finally
:特定の終了処理を必ず行ってほしい際に使用try
内で例外が発生しようが正常に処理が完了したとしても- 必ずしも必要ではない
- 利用するJava標準の命令によっては、例外処理(
try
とcatch
)を必ずつけなければならないものがあるので注意
Javaのメソッド
public static void sumMethod1(int num1, int num2) {
int result = num1 + num2;
System.out.println(result + "method");
}
- メソッド:自分がしたいこと=機能をひとまとめにしたブロック
- 独自に作ることが可能
- メソッド名:
sumMethod1
- 処理内容:
{}
で囲われている箇所 - メソッドを使うことで再利用できるような仕組み化が可能
- 引数(ひきすう):メソッド内部で処理をするために必要な値を、受け渡しをするための仕組み
- 例:メソッド名の後の
()
内にあるint num1
とint num2
- 外部から数値や文字などの入力がない場合は無くてもよい
- 例:メソッド名の後の
- 外部からデータをもらう必要があるときに引数は必要
戻り値の活用
public static int sumMethod2(int num1, int num2) {
int result = num1 + num2;
return result;
}
return
:戻り値。計算結果を呼び出し元に戻すことが可能- 1行目の3単語目が戻り値の指定(
int
)- 戻り値が不要:
void
- 文字列に戻したいとき:
String
- 戻り値が不要:
- 1行目の3単語目が戻り値の指定(
- メソッドの戻り値と実際の戻り値の型は一致している必要がある
- 例:
int
と書いてあれば、String
には戻せない
- 例:
- 戻り値があることで、その結果を利用して、さらに次の処理ができる(下記例)
public class ReturnValue {
public static void main(String[] args) {
int num1 = 100;
int num2 = 10;
int result;
result = sumMethod2(num1, num2);
System.out.println(result + "method2");
}
public static int sumMethod2(int num1, int num2) {
int result = num1 + num2;
return result;
}
}
110method2
int num1 = 100;
で100
を宣言int num2 = 10;
で10
を宣言- 変数
result
を宣言 result = sumMethod2(num1, num2);
の右辺でsumMethod2
を実行- さきほど宣言した
100
と10
を引数として持って、sumMethod2
本体へ処理が移行 - 引数の
100
と10
がsumMethod2
内部のnum1
とnum2
に引き渡される int result = num1 + num2;
で足し算される- その結果は左辺の
result
に格納 - 最後の
return
でresult
(計算結果)を元のメインメソッドに戻す result = sumMethod2(num1, num2);
の左辺のresult
に、計算結果の110が代入される
public class ReturnValue2.java {
public static void main(String[] args) {
int num1 = 100;
int num2 = 10;
sumMethod1(num1, num2);
int result;
result = sumMethod2(num1, num2);
System.out.println(result + "method2");
}
public static void sumMethod1(int num1, int num2) {
int result = num1 + num2;
System.out.println(result + "method1");
}
public static int sumMethod2(int num1, int num2) {
int result = num1 + num2;
return result;
}
}
110method1
110method2
sumMethod1
sumMethod2
:メソッド名(int num1, int num2)
のカッコ内のnum1
とnum2
:引数- 引数は何個でもよい(ゼロでも)
sumMethod1
:void
- 戻り値なし
sumMethod2
:int
- 戻り値あり
- 型を指定(
int
やString
)
- 型を指定(
- 戻り値あり
return
:メソッドの外に処理を戻す- 定義されていないメソッドを実行するとエラーになる
- 例:
メソッド sumMethod3(int, int) は型 Sample02 で未定義です
- 例:
「1ヶ月内の経過秒数計算機」を作成
public class Clock {
public static void main(String[] args) {
int seconds = getSecond(13, 14, 38, 32);
System.out.println(seconds);
}
public static int getSecond(int d, int h, int m, int s) {
int result = 86400 * d + 3600 * h + 60 * m + s;
return result;
}
}
1175912
このコードを書いたときの時間は13日14時38分32秒(よって1,175,912秒)。
「税込価格を求めるプログラム」を作成。
public class Tax {
public static void main(String[] args) {
int tax = 10; //税率
int nonTaxed = 1500; //税抜価格
double result;
result = tax(tax, nonTaxed);
double taxIncluded = result + nonTaxed; //税込価格
System.out.println(nonTaxed + "円の商品の税込価格は" + (int) taxIncluded + "円(消費税は" + (int)taxMethod(tax, nonTaxed) + "円)です。");
}
public static double tax(int tax, int nonTaxed) {
double result = nonTaxed * (tax * 0.01); //消費税
return result;
}
}
1500円の商品の税込価格は1650円(消費税は150円)です。
コンピュータとJavaプログラム
- CPUは
0
と1
しか解釈できない(2進数) - なので機械語への翻訳が必要
- コンパイラ型(事前にまとめて翻訳)
- インタプリタ型(逐次一行ずつ翻訳)
- コンパイラ型について
- メリット:処理速度が速い
- デメリット:プログラムコードを一文字でも変更すれば、コンパイルしなおす必要がある
- インタプリタ型について
- メリット:都度プログラムコードを変更しても即時実行できる(コンパイラ不要)
- デメリット:処理速度が遅い
- Javaは両方の特性を持った言語である
- Javaコンパイラ(javac)で中間言語(バイトコード -> どのハードウェアやOSにも依存しない機械語)に変換
- バイトコードを、実行するハードウェアやOSに合わせたJavaVMが読み込んで機械語に変換し実行
- さまざまなハードウェアやOS上で実行可能
- 実行するまでは中間言語
- 分類的にはインタプリタ型
- 変数と宣言は、メモリ上にデータを展開するため必要
- 参照型はメモリを指し示すのでポインタとも呼ぶ