Java基礎まとめ(基礎構文)

# Javaとは・・・？
プログラミング言語。Javascriptとは別物。
Webアプリケーションやアンドロイドアプリの制作に向いている。
求人数が非常に多い言語。2019年の求人数ランキングでは全体の３割の求人がJavaの求人。

# Javaのキーワード
#### コンパイラ言語
機械にとって認識しやすい言語

対義語はスクリプト言語
スクリプト言語は人間にとってわかりやすい文法でプログラムを構成するが、
コンパイラ言語は機械にとって認識しやすい言語にコンパイルする。

砕いていうのであれば、
スクリプト言語は、開発者（人）目線でのコーディングが可能な為、着手しやすく、スキル取得もしやすい。
しかし、機能には限界があるため、大規模なさまざまな機能を盛り込みたいサービスには不向き。
コンパイラ言語に比べ、拡張性が低い。

しかしながら、コンパイラ言語は、機械視点で作られている。
自由度が高い為、着手の難易度が高く、スキル取得の難易度も高い。
しかしながら、自由度が高いため、拡張性が高い。

スクリプト言語を代表する言語：python,ruby,javascript,phpなど
コンパイラ言語を代表する言語：Java,C#,C言語など

参考：https://www.geekly.co.jp/column/cat-technology/1902_041/


#### オブジェクト指向言語

オブジェクト：直訳すれば「物」「対象」という意味。プログラミングにおいてはデータと処理の集まりを意味している。

オブジェクトと操作を分けて考える方法。
「クラス」「メソッド」「インスタンス」を用いて、コーディングを簡潔にまとめることができる。
「クラス」「メソッド」「インスタンス」の理解が必須。

クラス・・・データと処理を１つにまとめる機能。
インスタンス・・・クラスの中身の実働部分。インスタンスの中にはメソッドがある。
メソッド・・・関数と言われる場合もある。アクションを起こす命令の内容のようなもの。

クラスの中にインスタンスがあり、インスタンスの中にメソッドがあるようなイメージ。



# 実際にJavaのコードを見てみよう
実際にJavaの基礎構文をまとめていく


# オブジェクトの内容を画面に表示する

```java:オブジェクトの内容を画面に表示する
System.out.println("ここに文字を入れる");
```

ちなみに System.out.print("~") でもOK
printとprintlnの違いは改行があるかどうか。
printは改行なし、printlnは改行あり。「ln」はlineの略、恐らく、「行」という意味。

【ポイント】
- 「;」で終わる
- System.out.printlnの後は「=」不要
- カッコは「()」を使う


# Javaの構造

```java:例
class Main{
    public static void main(String[]args){
        System.out.println("文字を入力");
    }
}
```

これは、Javaのコードの一例。
下記に分解できる。


```java:クラス部分
class Main{
}
```

ここでは今からする内容の箱を作成
「class Main」の「Main」がそれにあたります。
ここはどんな名前でも良くて「Practice」とか「Text」とかclass内の内容を指す言葉を入れる。

ちなみに「public class Main」と記述する場合もあり。
「public」はどこからでもアクセスができるという意味。
「public」を付ける場合、「Main」部分はファイル名と同名でなければならないというルールがある。
つまり「public class Main」の場合、「Main.java」のファイルである必要がある。
参考：https://tech.pjin.jp/blog/2020/10/24/java_02_01_how_to_run_java_column_2/


```java:メソッド部分
public static void main(String[]args){
}
```

public どこからでも参照可能
static　
void　戻り値なし
main　メソッド名
String　引数をString型の配列で受け取る
args　引数名　argumentsの略省
参考：https://qiita.com/kahatato/items/1b4921bb58731f0b7fea


```java:処理部分
System.out.println("文字を入力");
```

ここには処理の内容が記載される、本例は一例。

# 数値

```java:数値
System.out.println(1);
System.out.println(2+3);
```

```:出力結果(数値)
1
5
```

```java:いろんな計算もできる
System.out.println(2*3);
System.out.println(4/2);
System.out.println(3%2);
```

```:出力結果(いろんな計算もできる)
6
2
1
```

```java:数値
System.out.println(1);
System.out.println(2+3);
```

このように数値を数値として扱う場合には「""」が不要になる。
「+」・・・足し算
「-」・・・引き算
「*」・・・掛け算
「/」・・・割り算
「%」・・・割り算の余り


```java:文字列として扱う場合
System.out.println("1");
System.out.println("2+3");
```
```:出力結果
1
2+3
```
このように数値を文字列として扱う場合には「""」が必要になる。

# 文字列の連結

```java:文字列の連結
System.out.println("Ninja"+"Wanko");
System.out.println("1"+"1");
System.out.println(1+1);
```

```:出力結果
NinjaWanko
11
2
```

「""」で文字列認識をさせることで、文字列の連結もできる。
「""」をつけないと数値認識されるので足し算の計算がされる。

# データ型の種類

String型(Sは大文字)
int型(iは小文字)・・・整数の数字
double型・・・小数の数字
など

【ポイント】
String型のSは大文字
int型のiは小文字

# 変数設定

```java:変数の設定・値の代入
int number;      //・・・int型の「number」という名前の変数を設定
number = 3;       //・・・変数「number」に３を代入
System.out.println(number);

String name;      //・・・String型の「name」という名前の変数を設定
name = "Tanaka";  //・・・変数「name」にTanakaを代入、文字列なので「""」で囲む
System.out.println(name);
```

```:実行結果
3
Tanaka
```
```java:こんな書き方もできるよ！
int number = 3;  // 2行を１行にまとめる感じ
System.out.println(number);

String name = "Tanaka";  // 2行を１行にまとめる感じ
System.out.println(name);
```
計算結果を変数内に入れる場合
```
int number = 10/2;
System.out.println(number);
```
```:結果
5
```


【ポイント】
変数代入についても、文字列は「""」数値はカッコなし

# 変数を使った計算

```java:変数を絡めた計算
int number1 = 10;
System.out.println(number1+3);

int number2 = 5;
System.out.println(number1+number2);
```

```:実行結果
13
15
```

```java:変数を絡めた計算
String greeting = "こんにちは";
System.out.println(greeting+"佐藤さん");

String name = "鈴木さん";
System.out.println(greeting+name);
```

```:実行結果
こんにちは佐藤さん
こんにちは鈴木さん
```

# 変数の更新

```java:変数の更新(文字列)
String name="Sato";
System.out.println(name);

name="Suzuki";
System.out.println(name);
```
```:実行結果
Sato
Suzuki
```

```java:変数の更新(数値)
int number=1;
System.out.println(number);

number=2;
System.out.println(number);
```
```:実行結果
1
2
```
【ポイント】
```java
int number=1;
number=2;
```
このように変数の更新にはデータ型はつけない

# 自己代入

変数の更新を用いてするのを自己代入

```java:自己代入
int x = 3;
System.out.println(x);
x = x + 2;
System.out.println(x);
```
```:実行結果
3
5
```

このようにxの値をxを使って更新できる。
ただし、実務レベルではこのような書き方はあまり見ない様子。
実務では下記のような省略形を使う。

```java:自己代入の簡単な書き方(数値限定)
x+=10;   //・・・x=x+10の略 xに１０足してxを更新
x-=10;   //・・・x=x-10の略 xに１０引いてxを更新
x*=10;   //・・・x=x*10の略 xに１０かけてxを更新
x/=10;   //・・・x=x/10の略 xに１０で割ってxを更新
x%=10;   //・・・x=x%10の略 xに１０で割った余りにxを更新
```

String型で「+=」試してみたら実行できたので
「+=」についてはString型でも使用できるっぽい。

```java:String型例
String x = "a";
x += "b";
System.out.println(x);
```
で「ab」と出力される。
「-=」とかだとエラー発生する。

# 自己代入の応用

```java:1を代入する場合のみ使える表記
// 1を足す場合
x=x+1;
x+=1;
x++;

// 1を引く場合
x=x-1;
x-=1;
x--;
```

こういうふうに書くよっていうのを覚えるしかないね。

# そもそもなぜ変数って使うの？

・変数名で何のデータかわかりやすい
　nameやnumberなどなんのデータかがわかりやすい

・データを繰り返し書ける
　何度も同じ数値や文言を書かなくて済む
　そもそも省略できる部分は省略するというのがコードの前提(リーダブルコード)

・変更に対応しやすい
　変数を設定することで、変数を変更することで、それらを利用している部分全てに反映を行うことができる。

```java:煩雑な例
System.out.println("Aさん、Javaをマスターしよう");
System.out.println("Bさん、Javaをマスターしよう");
System.out.println("Cさん、Javaをマスターしよう");
```

```java:変数を使って綺麗に書く
String text = "、Javaをマスターしよう";
System.out.println("Aさん"+text);
System.out.println("Bさん"+text);
System.out.println("Cさん"+text);
```

繰り返し使う文言や数字は変数化し、変数で管理するのがスマート！！

# 変数のルール

変数は

* 英単語
* キャメルケース

を使って設定しましょう。

```:変数としてOKな例
date　・・・英単語を用いる
userName　・・・キャメルケース　２語以上の場合は大文字で区切る
```

```:変数としてNGな例
1name　・・・数字開始
first_name　・・・スネークケース
namae　・・・ローマ字
名前　・・・日本語
```

変数名はわかりやすいものに！！
```java:例
String lastname = "Sato";
```

# 小数を扱おう！

小数を扱う際にはデータ型はint型ではなくdouble型を使用する。
intで書くとエラーが出る。

```java:例
double number1 = 5.28;
System.out.println(number1);

double number2 = 4.72;
System.out.println(number1+number2);

```
```:例-出力結果
5.28
10.0
```

# 計算時はデータ型を合わせよう

```java:データ型は自動統一されるよ
System.out.println("りんごが"+23+"個あります。");　・・・２３はStringに変換されている
String型で自動統一される。

System.out.println(6/2); ・・・int同士

System.out.println(6.0/2.0);　・・・double同士

System.out.println(6.0/2); ・・・「2」がdoubleに自動変換される
intとdoubleの計算ではdoubleに自動変換される
```

```:実行結果
りんごが２３個あります。
3
3.0
3.0
```

int同士の割り算の計算の場合どうなる？？？
```java:例
System.out.println(13/4);
```
```:3.25とはならない
3
```

3.25と出したい場合はどうする・・・？

```java:(double)でデータ型を無理やり指定できる
System.out.println((double)13/4);
```
もしくは
```java
int number1=13;
int number2=4;
System.out.println((double)number1/number2);
```
みたいな書き方もできる
```:結果
3.25
```

これは１３をdouble型にしているという内容です。
どちらかがdouble型であれば、結果はdouble型になる。

この強制型変換の手法を「キャスト」と呼ぶ


# 真偽値

boolean型というデータ型
扱う内容は２つだけ「true」「false」の２択。

```:boolという変数にtrueを代入の例
boolean bool = true;
```

# 比較演算子

比較演算子とは計算式のようなもの。

「==」・・・「=」と同じ意味
「!=」・・・「≠」と同じ意味

じゃあどうやって使うの？？
下記で簡単な例を。。。。

```:
6+2==5 ・・・計算式が正しくないのでfalse
6+2!=5 ・・・計算は正しくないが「≠」なのでtrue
6/3==2 ・・・計算式が正しいのでtrue
6/3!=2 ・・・計算は正しいが「≠」なのでfalse
```

# 真偽値を出力しよう

```:真偽値出力
System.out.println(true);
System.out.println(false);
System.out.println(6+2==5);
System.out.println(6+2!=5);
```

```:結果
true
false
false
true
```

比較演算子やtrue,falseはこのように出力できる。

# 大小比較

大小比較も「==」のように出力は真偽のどちらかで出る。

「<」・・・「<」と同じ意味
「>」・・・「>」と同じ意味
「<=」・・・「≦」と同じ意味　なので「=」もOK
「>=」・・・「≧」と同じ意味　なので「=」もOK

```
4+2>6・・・false
4+2>=6・・・true
8/4<2・・・false
8/4<=2・・・true
```

# 理論演算子(&&-かつ)

```:&&の使い方
false && true　・・・false
true && true　・・・true
true && false　・・・false
```

trueとtrueの場合のみtrue
片方でもfalseならfalse

# 理論演算子(||-または)

```:||の使い方
false || true　・・・true
true || true　・・・true
true || false　・・・true
false || false ・・・false
```

どちらか一方でもtrueならtrue
どちらもfalseの場合のみfalse

# 理論演算子(!-でない)

```:!の使い方
int x = 20;
x>=30;   ・・・false
!(x>=30);   ・・・true　()内はfalseだが!()で囲むことで「〜でない」になる。
```
「!()」で囲むことで「〜でない」という意味になる。


# 条件分岐(if)

if文を使うことで
値の中身の真偽値によって処理の分岐を行うことができる。

```:if文
if(true){
System.out.println("検証結果：");
System.out.println("正です");
}
```

【ポイント】
if文の{}の外には「;」は要らない。
if文の条件は()で囲う必要がある。
{}内の処理には「;」が必要。

# 条件分岐(if else elseif)

```:分岐が２つの場合
if(false){
System.out.println("if文がtrueの場合の表示")
}else{
System.out.println("if文がfalseの場合の表示")
}
```

```:分岐が３つ以上の場合
if(false){

System.out.println("if文がtrueの場合の表示")

}else if(false){

System.out.println("else if文がtrueの場合の表示")

}else if(false){

System.out.println("else if文がtrueの場合の表示")

}else{

System.out.println("else if文がfalseの場合の表示")

}
```

trueだとその直下処理がされる
falseだと次の処理になる。
(if→if else×複数→else)

# 条件分岐(switch)

```:switch文例
int n = 1;
switch(n){

case 1 :
System.out.println("1です");
break;

case 2 :
System.out.println("2です");
break;

}
```

```:結果
1です
```

【ポイント】
* switch()の「()」で分岐が変わる。
* 分岐の内容は、case~break;で挟むのがルール　break;忘れずにね！
* 分岐内の処理にも「;」を忘れずに！！
* switch文の{}には「;」が不要
* ちなみにnはint型じゃなくともString型とかでもいける

ただこれだとnに該当する内容がなかったら何も表示されない！！！
該当する内容がない場合に表記を増やすやり方については下記の通り
(if文のelseのイメージ)

```:int型
int n = 1;
switch(n){

　　　case 1 :
　　　　　　System.out.println("1です");
　　　　　　break;

　　　case 2 :
　　　　　　System.out.println("2です");
　　　　　　break;

　　　default:
　　　　　　System.out.println("該当なし");
　　　　　　break;
}
```

これでnが１、２以外の場合にも表記がされる。
ちなみにこれはString型でもできる。

```:String型
String n = "小吉";
switch(n){

　　　case "大吉" :
　　　　　　System.out.println("超ラッキーです");
　　　　　　break;

　　　case "小吉" :
　　　　　　System.out.println("ラッキーです");
　　　　　　break;

　　　default:
　　　　　　System.out.println("該当なし");
　　　　　　break;
}
```


# 繰り返し処理(while)

決まったルールに沿って、繰り返し処理をする方法がある。
これには作法があるので、覚えてしまったほうがいいかも。

```
while(条件){
繰り返す処理;
}
```

というけど、例えばこんな感じ

```:例
int i = 1;
while(i<=5){
System.out.println(i);
i++;
}
```
処理の内容としては
①iは１
②iが５以下の場合{}内の処理
③System.out.println(i)でiの値を表示
④i++でiに＋1をする
⑤②に戻る

【ポイント】
if文もswitch文もwhile文も{}の外には;要らない


#### 無限ループには要注意！！！！！

上記例でi++を指定しなかった場合。
i<=5が終わる時がないので無限ループになる。

```:無限ループ　NG例
int i = 1;
while(i<=5){
System.out.println(i);
}
```

必ず、{}の処理内にiへの加算の処理を追記しましょう。


# 繰り返し処理(for)

for文は繰り返しルールを（）内にまとめることができる。
どういうこと？下記で例
```:for文例
for(int i=1; i<=5; i++){
System.out.println(i);
}
```

```:String出力に絡める
for(int i=1; i<=5; i++){
System.out.println(i+"回ジャンプしました");
}
```

【ポイント】
* (int i=1; i<=5; i++)で変数内の宣言,リミットの設定,いくつ差で繰り返すか
* ここでもi++等の差分を設定しないと、無限ループになるから注意！
* ()内での文章の区切りは「;」


#### 強制終了する書き方がある(break)

```:for文　breakで強制終了
for(int i=1; i<=10; i++){

if(5<i){
break;
}

System.out.println(i);
}
```

breakがなければ１〜１０まで繰り返すところ
breakで5<iの条件を追加して、6以上になるとbreakが発火するので1~5まで繰り返される。

#### 特定の要素だけスキップするロジック(continue)

例えば１〜１０までのループを構築する中で「3の倍数だけ除去する」みたいなこともできる。

```
for(int i =1; i<=10; i++){

if(i%3==0){
continue;
}

System.out.println(i);
}
```
continueは後の処理をスキップして、新しいループに入ることができる。
つまりSystem.out.println()の前にcontinueの処理があるので
System.out,println()はスキップされる

#### breakもcontinueもfor文でもwhile文でも使える

breakもcontinueもfor文でもwhile文でも使える
```
if(i<5){
continue;
}

if(i<5){
break;
}
```
continueとかbreakの後「;」忘れずに

# 配列

変数の内部に複数の情報を代入できる方法
データ型の後ろに「[]」をつける。

どうするの？下記具体例

```:例
int[] numbers={5,13,29};
String[] names={"john","Kate","Bob"};

System.out.println(numbers[0]);
System.out.println(names[0]);
```

```:結果
5
john
```

【ポイント】
* 変数と{}の間には「=」がいる
* 代入の設定は{}で行う
* 代入同士は「,」で分ける
* 「;」忘れず
* 代入の指定数字は「0」から始まる
* 別に変数は複数形じゃなくても機能するが、複数形の方がわかりやすい

#### 配列の上書きができる

```:配列の上書き
String[] names={"john","Kate","Bob"};
System.out.println(names[0]);
names[0]="Yamada";
System.out.println(names[0]);
```
```:結果
john
Yamada
```

存在しない、要素には値の代入はできないので注意！
上記の例では names[3]="Tanaka"; とかはできない。


# (応用編)配列と繰り返し

配列と繰り返しを組み合わせたものをする。

例えばどんなこと？下記で例

```:配列の数字をfor文で管理
String[] names={"John","Kate","Bob"};
for(int i=0; i<3; i++){
System.out.println("Hello"+names[i]);
}
```

#### lengthでスマートに

でもこれってi<3ってデータ数に伴ってここも変えないといけないのスマートじゃないよなあ
なんと、lengthを使うことで自動的に代入しているデータ数を試算することができる。

どういうこと？？下記例
```:lengthでnames内のデータ数がわかる
String names[]={"yamada","tanaka","sato"};
System.out.println(names.length);
```
```:結果
3
```

lengthは長さみたいな意味があるが、Javaでは数をカウントしてくれるような意味がある。
つまり「name.length」でnames変数の中に格納されているデータがわかる。

【ポイント】
* 「変数.length」のように「.」で繋ぐ

つまりどういうことができる・・・・？
下記の感じでスマートにできる

```:lengthでnames内のデータ数を指定
String names[]={"yamada","tanaka","sato"};

for(int i = 0; i<names.length; i++){
System.out.println(names[i]);
}
```
【ポイント】
* lengthは要素の数！！代入番号は0から始まるが、lengthは１からカウント。つまり「<=」「>=」は使えない。


# for文のもう一つの使い方

これまでは
```
for(int i = 0; i<names.length; i++){
System.out.println(names[i]);
}
```
こういう使い方をしていたfor文

配列と絡める場合、もう少しスマートにコーディングできる。
これはこういうものだと覚えよう！！！

```
String[] names={"John","Kate","Bob"};
for(String name: names){
 System.out.println(name);
}
```
どういうことをしている？？？
①for(String name: names)・・・for文内で「name」を設定、そこにnamesを代入している
②System.out.println(name)でfor文で設定したnameを書き出す。これはnamesの数分だけ実行される。


# 総集編応用

```
class Main {
  public static void main(String[] args) {
    int[] numbers={1, 4, 6, 9, 13, 16};
    
    int oddSum = 0;
    int evenSum = 0;
    
    for(int number: numbers){
    
    if(number % 2 ==0){
     evenSum += number;  
    }else{
     oddSum += number;
    }
    }
    
    System.out.println("奇数の和は" + oddSum + "です");
    System.out.println("偶数の和は" + evenSum + "です");
  }
}









    // ---- 拡張for文を用いない場合 ----
    // for (int i = 0; i < numbers.length; i++) {
    //   if (numbers[i] % 2 == 0) {
    //     evenSum += numbers[i];
    //   } else {
    //     oddSum += numbers[i];
    //   }
    // }

```

# FizzBuzz

エンジニアの始めの課題というFizzBuzz
本例では3の倍数でFizz 5の倍数でBuzz 15の倍数でFizzBuzzというものを作る。

【ポイント】
・FizzやBuzzの値は仕様変更で変わる可能性がある為、変数で宣言する。
・発火は15の倍数からする。15の倍数を３や5の倍数より後に記述すると
　　FizzBuzz(15)の発火の前にFizz(3)やBuzz(5)が発火してしまうため。
・FizzとBuzzの順番は前後どちらでもOK

```
public class Main{
    public static void main(String[] args){
       
        //変数宣言
        int i = 0;
        int loopCount = 100;
        int numFizz = 3;
        int numBuzz = 5;
        String strFizz = "Fizz";
        String strBuzz = "Buzz";
       
        //for文で繰り返し
    for(i = 1; i <= loopCount; i++){
        //if文でFizzBuzz/Fizz/Buzzで分岐
        if(i % (numFizz*numBuzz) == 0){
            System.out.println(strFizz + strBuzz);
        }else if(i % numFizz == 0){
            System.out.println(strFizz);
        }else if(i % numBuzz == 0){
            System.out.println(strBuzz);
        }else{
            System.out.println(i);
        }
    }
   
    }
}
```


# メソッドのイメージ
かなり大枠の話
javaのフォルダを実行したときの実行順について。

例えば・・・
Main.javaを実行する
mainメソッド　→　メソッド１　→　メソッド２・・・
のように書くメソッドがここの処理をする。

```
class Main{
public static void main(String[]args){
    hello();・・・処理１
}

public static void hello(){
    System.out.println("Hello World");・・・処理２
}

}
```