ざっくりとJava
はじめに
今回はMITの講義である"Introduction to Programming in Java"を参考にしながらざっくりとまとめていきます。
Lecture Noteなどは下記のリンクから手に入ります。
対象者
本記事は、他の言語をすでに学習したことがあり、Javaを触ってみようかなという人を主な対象にしています。
環境構築
まず「Java Standard Edition (SE) Development Kit」を「Java SE | Oracle Technology Network | Oracle」からインストールします。
統合開発環境としてはEclipseが有名ですが、こちらは無くても本記事は進めることができます。
統合開発環境で開発したい人は、以下のサイトからどうぞ。
僕のPCはWindowsなので、Visual Studio Codeをエディタとして使い、コンパイルはコマンドプロンプトで行っています。
コンパイルと実行
書いたソースコードは以下の手順でコンパイルし、実行します。
1. ソースコード(拡張子がjavaのファイル)を書く
2. 次にコマンドプロンプト上で以下のコマンドを実行する
javac sample.java
3. classファイルが出来上がる
4. 最後に以下のコマンドでmain文を実行する
java sample
Hello Worldを実行してみよう
以下のようなコードを書いてください。
class HelloWorld { public static void main(String[] args) { System.out.println("Hello world."); } }
Javaでは一つのファイルにつき一つのクラスを定義していくのが基本形です。
以下がテンプレートとなります。
class CLASSNAME { public static void main(String[] args) { STATEMENTS } }
注意点をいくつか書いておきます。
- またクラス名とファイル名は同じ名前を使用するようにしてください。
- mainメソッドは"public static void"で定義してください。
それでは、先程の「コンパイルと実行」を行うと以下のように出力されます。
> javac HelloWorld.java > java HelloWorld Hello world.
こちらのように、「System.out.printlnメソッド」を使用することでコンソール出力ができます。
型・変数・演算子 (Types, Variables, Operators)
** 型
よく使用する方として以下が挙げられます。
型 | 説明 |
---|---|
boolean | true もしくは false |
int | 整数 |
double | 実数 |
String | 文字列 |
変数の宣言 (Declaration)
テンプレート
TYPE NAME
例
int foo; double bar; String baz;
演算子 (Operators)
代入 (Assignment)
=
加算 (Addition)
+
減算 (Subtraction)
-
乗算 (Multiplication)
*
除算 (Division)
/
演算子の順序
演算子の順序は基本的な計算ルールに則っています。
1. 括弧
2. 乗算、除算
3. 加算、減算
例
class DoMath { public static void main(String[] args) { double score = 1.0 + 2.0 * 3.0; System.out.println(score); score = score / 2.0; System.out.println(score); } }
実行結果
> javac DoMath.java > java DoMath 7.0 3.5
注意点
除算における注意点
int型の除算とdouble型の除算は結果が異なります。
double a = 5.0 / 2.0; // a = 2.5 int b = 4 /2; // b = 2 int c = 5 / 2; // c = 2 double d = 5 / 2; // d = 2.0
上記の例のdでは、代入演算子の右側でint型で除算したのちに、dへの代入が行われるため、2.0という結果になっています。
型の相違
String five = 5; // ERROR!
キャスト
int a = 2; // a = 2 double a = 2; // a = 2.0 (暗黙的キャスト) int a = 18.7; // ERROR int a = (int)18.7; // a = 18 double a = 2 / 3; // a = 0.0; double a = (double)2/3; // a = 0.6666...
doubleからintのようなメモリサイズが大きい方から小さい方へのキャストは明示的に行う必要があります。
Stringとintの変換
// int to String String five = 5; // ERROR String five = Integer.toString(5); String five = "" + 5; // String to int int foo = "18"; int foo = Integer.parseInt("18");
メソッド (Method)
メソッド宣言
public static void NAME() { STATEMENTS }
メソッド呼び出し
NAME();
例
class NewLine { public static void newLine() { System.out.println(""); } public static void threeLines() { newLine();newLine();newLine(); } public static void main(String[] args) { System.out.println("Line1"); threeLines(); System.out.println("Line2"); } }
出力結果
> javac NewLine.java > java NewLine Line1 Line2
引数 (Parameters)
テンプレート
// 宣言 public static TYPE NAME(TYPE NAME) { STATEMENTS return EXPRESSION; } // 呼び出し NAME(ARG);
例
class Square { public static void printSquare(int x) { System.out.println(x * x); } public static void main(String[] args) { int value = 2; printSquare(value); printSquare(3); printSquare(value * 2); } }
実行結果
> javac Square.java > java Square 4 9 16
複数引数
テンプレート
// 宣言 public static TYPE NAME(TYPE NAME, TYPE NAME) { STATEMENTS } // 呼び出し NAME(AGR1, ARG2);
変数のスコープ
ブロックスコープがあります。
またメソッド引数は新しく定義されます。
例1
class SquareChange { public static void printSquare(int x) { System.out.println("printSquare x = " + x); x = x * x; System.out.println("printSquare x = " + x); } public static void main(String[] args) { int x = 5; System.out.println("main x = " + x); printSquare(x); System.out.println("main x = " + x); } }
出力結果
> javac SquareChange.java > java SquareChange main x = 5 printSquare x = 5 printSquare x = 25 main x = 5
例2
class Scope { public static void main(String[] args) { int x = 5; if (x == 5) { int x = 6; int y = 72; System.out.println("x = " + x + " y = " + y); } System.out.println("x = " + x + " y = " + y); } }
出力結果
> javac Scope.java Scope.java:5: エラー: 変数 xはすでにメソッド main(String[])で定義されています int x = 6; ^ Scope.java:9: エラー: シンボルを見つけられません System.out.println("x = " + x + " y = " + y); ^ シンボル: 変数 y 場所: クラス Scope エラー2個
条件分岐 (Conditional branch)
if文
テンプレート
if (CONDITION) {
STATEMENTS
}
比較演算子
// x is greater than y x > y // x is less than y x < y // x is greater than or equal to y x >= y // x is less than or equal to y x <= y // x equals y x == y
論理演算子
// AND && // OR ||
if... else...
テンプレート
if (CONDITION) { STATEMENTS } else { STATEMENTS }
if... else if... else...
テンプレート
if (CONDITION) { STATEMENTS } else if (CONDITION) { STATEMENTS } else if (CONDITION) { STATEMENTS } else { STATEMENTS } *** 例 >|java| class Condition { public static void condition(int x) { if (x > 5) { System.out.println(x + " is > 5"); } else if (x == 5) { System.out.println(x + " equals 5"); } else { System.out.println(x + " is < 5"); } } public static void main(String[] args) { condition(6); condition(5); condition(4); } }
出力結果
> javac Condition.java > java Condition 6 is > 5 5 equals 5 4 is < 5
ループ・配列 (Loops, Arrays)
while
テンプレート
while (CONDITION) {
STATEMENTS
}
例
int i = 0; while (i < 3) { System.out.println("Rule #" + i); i = i + 1; }
for
テンプレート
for (INITIALIZATION; CONDITION; UPDATE) {
STATEMENTS
}
例
for (int i = 0; i < 3; i++) { System.out.println("Rule #" + i); }
break
for文やwhile文を強制終了することができる。
例
for (int i = 0; i < 100; i++) { if (i == 50) break; System.out.println("Rule #" + i); }
配列 (Arrays)
配列は複数のリストであり、インデックスで管理されます。
インデックスは0から始まるため、長さNの配列のインデックスは0~N-1までです。
初期化 (Initialization)
テンプレート
TYPE[] NAME;
TYPE[] NAME = new TYPE[SIZE];
アクセス (Access)
int[] values = {12, 24, -23, 47}; values[3] = 18; // {12, 24, -23, 18} int x = values[1] + 3; // 27
lengthプロパティ
配列にはlengthプロパティが存在し、配列の長さを返します。プロパティを呼ぶにはドットを利用します。
例1
int[] values = new int[12]; int size = values.length; // 12
例2
int[] values = new int[5]; for (int i = 0; i < values.length; i++) { values[i] = i; int y = values[i] * values[i]; System.out.println(y); }
クラス (Class)
クラスは複数の変数やメソッドを一つのパッケージにして、新しい型として使用することが可能です。
宣言
テンプレート
public class CLASSNAME { TYPE VARIABLE; TYPE METHOD(ARG) { STATEMENTS } }
例
public class Baby { String name; boolean isMale; double weight; double decibels; int numPoops = 0; void poop() { numPoops += 1; System.out.println("Poop!"); }
インスタンス (Instance)
クラスの実体(インスタンス)を生成します。普通の型と同じようにして実体を生成することができます。
テンプレート
CLASSNAME NAME = new CLASSNAME();
コンストラクタ (Constructor)
テンプレート
public class CLASSNAME { CLASSNAME() { } CLASSNAME([ARGUMENTS]) { } } CLASSNAME obj1 = new CLASSNAME(); CLASSNAME obj2 = new CLASSNAME([ARGUMENTS]);
コーディングスタイル (Good Programming Style)
コードは自分だけでなく他人が見ても理解が可能(Readable)である必要があります。
変数名
変数名には意味を持たせましょう
// BAD Example String a1; int a2; double b; // GOOD Example String firstName; String lastName; int temprature;
適切なインデント
ブロックがわかりやすいようにインデントをつけましょう
public static void main(String[] args) { int x = 5; x = x * x; if (x > 20) { System.out.println(x + " is greater than 20."); } double y = 3.4; }
適切なスペース
// BAD double cel=fahr*42.0/(13.0-7.0); // GOOD double cel = fahr * 42.0 / (13.0 / 7.0);