takahiro_itazuriの公倍数的ブログ

本やWebを通して学習したことをまとめるブログです。最大公約数(つまり、共通部分)的なという表現と対比して、「なるべく包括的にカバーしつつ、更に+αの要素も加えられたらいいな」という意味で公倍数的ブログと名付けました。

ざっくりとJava

対象者

本記事は、他の言語をすでに学習したことがあり、Javaを触ってみようかなという人を主な対象にしています。

環境構築

まず「Java Standard Edition (SE) Development Kit」を「Java SE | Oracle Technology Network | Oracle」からインストールします。

統合開発環境としてはEclipseが有名ですが、こちらは無くても本記事は進めることができます。
統合開発環境で開発したい人は、以下のサイトからどうぞ。

www.eclipse.org

僕の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;

代入 (Assignment)

代入演算子を用いて代入ができます。

String foo;
foo = "Hello world";

演算子 (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のようなメモリサイズが大きい方から小さい方へのキャストは明示的に行う必要があります。

doubleの恒等演算子

double型に対しては、恒等演算子を使用してはいけません。

double a = Math.cos(Math.PI / 2);
double b = 0.0;

a == b; // false

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);
}

continue

for文やwhile文の現在イテレーションから次のイテレーションにスキップすることができる。

for (int i = 0; i < 100; i++) {
  if (i == 50) continue;
  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);