Javaとは・・・?
プログラミング言語。Javascriptとは別物。
Webアプリケーションやアンドロイドアプリの制作に向いている。
求人数が非常に多い言語。2019年の求人数ランキングでは全体の3割の求人がJavaの求人。
Javaのキーワード
コンパイラ言語
機械にとって認識しやすい言語
対義語はスクリプト言語
スクリプト言語は人間にとってわかりやすい文法でプログラムを構成するが、
コンパイラ言語は機械にとって認識しやすい言語にコンパイルする。
砕いていうのであれば、
スクリプト言語は、開発者(人)目線でのコーディングが可能な為、着手しやすく、スキル取得もしやすい。
しかし、機能には限界があるため、大規模なさまざまな機能を盛り込みたいサービスには不向き。
コンパイラ言語に比べ、拡張性が低い。
しかしながら、コンパイラ言語は、機械視点で作られている。
自由度が高い為、着手の難易度が高く、スキル取得の難易度も高い。
しかしながら、自由度が高いため、拡張性が高い。
スクリプト言語を代表する言語:python,ruby,javascript,phpなど
コンパイラ言語を代表する言語:Java,C#,C言語など
参考:https://www.geekly.co.jp/column/cat-technology/1902_041/
オブジェクト指向言語
オブジェクト:直訳すれば「物」「対象」という意味。プログラミングにおいてはデータと処理の集まりを意味している。
オブジェクトと操作を分けて考える方法。
「クラス」「メソッド」「インスタンス」を用いて、コーディングを簡潔にまとめることができる。
「クラス」「メソッド」「インスタンス」の理解が必須。
クラス・・・データと処理を1つにまとめる機能。
インスタンス・・・クラスの中身の実働部分。インスタンスの中にはメソッドがある。
メソッド・・・関数と言われる場合もある。アクションを起こす命令の内容のようなもの。
クラスの中にインスタンスがあり、インスタンスの中にメソッドがあるようなイメージ。
実際にJavaのコードを見てみよう
実際にJavaの基礎構文をまとめていく
オブジェクトの内容を画面に表示する
System.out.println("ここに文字を入れる");
ちなみに System.out.print("~") でもOK
printとprintlnの違いは改行があるかどうか。
printは改行なし、printlnは改行あり。「ln」はlineの略、恐らく、「行」という意味。
【ポイント】
- 「;」で終わる
- System.out.printlnの後は「=」不要
- カッコは「()」を使う
Javaの構造
class Main{
public static void main(String[]args){
System.out.println("文字を入力");
}
}
これは、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/
public static void main(String[]args){
}
public どこからでも参照可能
static
void 戻り値なし
main メソッド名
String 引数をString型の配列で受け取る
args 引数名 argumentsの略省
参考:https://qiita.com/kahatato/items/1b4921bb58731f0b7fea
System.out.println("文字を入力");
ここには処理の内容が記載される、本例は一例。
数値
System.out.println(1);
System.out.println(2+3);
1
5
System.out.println(2*3);
System.out.println(4/2);
System.out.println(3%2);
6
2
1
System.out.println(1);
System.out.println(2+3);
このように数値を数値として扱う場合には「""」が不要になる。
「+」・・・足し算
「-」・・・引き算
「*」・・・掛け算
「/」・・・割り算
「%」・・・割り算の余り
System.out.println("1");
System.out.println("2+3");
1
2+3
このように数値を文字列として扱う場合には「""」が必要になる。
文字列の連結
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は小文字
変数設定
int number; //・・・int型の「number」という名前の変数を設定
number = 3; //・・・変数「number」に3を代入
System.out.println(number);
String name; //・・・String型の「name」という名前の変数を設定
name = "Tanaka"; //・・・変数「name」にTanakaを代入、文字列なので「""」で囲む
System.out.println(name);
3
Tanaka
int number = 3; // 2行を1行にまとめる感じ
System.out.println(number);
String name = "Tanaka"; // 2行を1行にまとめる感じ
System.out.println(name);
計算結果を変数内に入れる場合
int number = 10/2;
System.out.println(number);
5
【ポイント】
変数代入についても、文字列は「""」数値はカッコなし
変数を使った計算
int number1 = 10;
System.out.println(number1+3);
int number2 = 5;
System.out.println(number1+number2);
13
15
String greeting = "こんにちは";
System.out.println(greeting+"佐藤さん");
String name = "鈴木さん";
System.out.println(greeting+name);
こんにちは佐藤さん
こんにちは鈴木さん
変数の更新
String name="Sato";
System.out.println(name);
name="Suzuki";
System.out.println(name);
Sato
Suzuki
int number=1;
System.out.println(number);
number=2;
System.out.println(number);
1
2
【ポイント】
int number=1;
number=2;
このように変数の更新にはデータ型はつけない
自己代入
変数の更新を用いてするのを自己代入
int x = 3;
System.out.println(x);
x = x + 2;
System.out.println(x);
3
5
このようにxの値をxを使って更新できる。
ただし、実務レベルではこのような書き方はあまり見ない様子。
実務では下記のような省略形を使う。
x+=10; //・・・x=x+10の略 xに10足してxを更新
x-=10; //・・・x=x-10の略 xに10引いてxを更新
x*=10; //・・・x=x*10の略 xに10かけてxを更新
x/=10; //・・・x=x/10の略 xに10で割ってxを更新
x%=10; //・・・x=x%10の略 xに10で割った余りにxを更新
String型で「+=」試してみたら実行できたので
「+=」についてはString型でも使用できるっぽい。
String x = "a";
x += "b";
System.out.println(x);
で「ab」と出力される。
「-=」とかだとエラー発生する。
自己代入の応用
// 1を足す場合
x=x+1;
x+=1;
x++;
// 1を引く場合
x=x-1;
x-=1;
x--;
こういうふうに書くよっていうのを覚えるしかないね。
そもそもなぜ変数って使うの?
・変数名で何のデータかわかりやすい
nameやnumberなどなんのデータかがわかりやすい
・データを繰り返し書ける
何度も同じ数値や文言を書かなくて済む
そもそも省略できる部分は省略するというのがコードの前提(リーダブルコード)
・変更に対応しやすい
変数を設定することで、変数を変更することで、それらを利用している部分全てに反映を行うことができる。
System.out.println("Aさん、Javaをマスターしよう");
System.out.println("Bさん、Javaをマスターしよう");
System.out.println("Cさん、Javaをマスターしよう");
String text = "、Javaをマスターしよう";
System.out.println("Aさん"+text);
System.out.println("Bさん"+text);
System.out.println("Cさん"+text);
繰り返し使う文言や数字は変数化し、変数で管理するのがスマート!!
変数のルール
変数は
- 英単語
- キャメルケース
を使って設定しましょう。
date ・・・英単語を用いる
userName ・・・キャメルケース 2語以上の場合は大文字で区切る
1name ・・・数字開始
first_name ・・・スネークケース
namae ・・・ローマ字
名前 ・・・日本語
変数名はわかりやすいものに!!
String lastname = "Sato";
小数を扱おう!
小数を扱う際にはデータ型はint型ではなくdouble型を使用する。
intで書くとエラーが出る。
double number1 = 5.28;
System.out.println(number1);
double number2 = 4.72;
System.out.println(number1+number2);
5.28
10.0
計算時はデータ型を合わせよう
System.out.println("りんごが"+23+"個あります。"); ・・・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に自動変換される
りんごが23個あります。
3
3.0
3.0
int同士の割り算の計算の場合どうなる???
System.out.println(13/4);
3
3.25と出したい場合はどうする・・・?
System.out.println((double)13/4);
もしくは
int number1=13;
int number2=4;
System.out.println((double)number1/number2);
みたいな書き方もできる
3.25
これは13をdouble型にしているという内容です。
どちらかがdouble型であれば、結果はdouble型になる。
この強制型変換の手法を「キャスト」と呼ぶ
真偽値
boolean型というデータ型
扱う内容は2つだけ「true」「false」の2択。
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(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)
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 n = 1;
switch(n){
case 1 :
System.out.println("1です");
break;
case 2 :
System.out.println("2です");
break;
default:
System.out.println("該当なし");
break;
}
これでnが1、2以外の場合にも表記がされる。
ちなみにこれは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は1
②iが5以下の場合{}内の処理
③System.out.println(i)でiの値を表示
④i++でiに+1をする
⑤②に戻る
【ポイント】
if文もswitch文もwhile文も{}の外には;要らない
無限ループには要注意!!!!!
上記例でi++を指定しなかった場合。
i<=5が終わる時がないので無限ループになる。
int i = 1;
while(i<=5){
System.out.println(i);
}
必ず、{}の処理内にiへの加算の処理を追記しましょう。
繰り返し処理(for)
for文は繰り返しルールを()内にまとめることができる。
どういうこと?下記で例
for(int i=1; i<=5; i++){
System.out.println(i);
}
for(int i=1; i<=5; i++){
System.out.println(i+"回ジャンプしました");
}
【ポイント】
- (int i=1; i<=5; i++)で変数内の宣言,リミットの設定,いくつ差で繰り返すか
- ここでもi++等の差分を設定しないと、無限ループになるから注意!
- ()内での文章の区切りは「;」
強制終了する書き方がある(break)
for(int i=1; i<=10; i++){
if(5<i){
break;
}
System.out.println(i);
}
breakがなければ1〜10まで繰り返すところ
breakで5<iの条件を追加して、6以上になるとbreakが発火するので1~5まで繰り返される。
特定の要素だけスキップするロジック(continue)
例えば1〜10までのループを構築する中で「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"; とかはできない。
(応用編)配列と繰り返し
配列と繰り返しを組み合わせたものをする。
例えばどんなこと?下記で例
String[] names={"John","Kate","Bob"};
for(int i=0; i<3; i++){
System.out.println("Hello"+names[i]);
}
lengthでスマートに
でもこれってi<3ってデータ数に伴ってここも変えないといけないのスマートじゃないよなあ
なんと、lengthを使うことで自動的に代入しているデータ数を試算することができる。
どういうこと??下記例
String names[]={"yamada","tanaka","sato"};
System.out.println(names.length);
3
lengthは長さみたいな意味があるが、Javaでは数をカウントしてくれるような意味がある。
つまり「name.length」でnames変数の中に格納されているデータがわかる。
【ポイント】
- 「変数.length」のように「.」で繋ぐ
つまりどういうことができる・・・・?
下記の感じでスマートにできる
String names[]={"yamada","tanaka","sato"};
for(int i = 0; i<names.length; i++){
System.out.println(names[i]);
}
【ポイント】
- lengthは要素の数!!代入番号は0から始まるが、lengthは1からカウント。つまり「<=」「>=」は使えない。
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の倍数を3や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メソッド → メソッド1 → メソッド2・・・
のように書くメソッドがここの処理をする。
class Main{
public static void main(String[]args){
hello();・・・処理1
}
public static void hello(){
System.out.println("Hello World");・・・処理2
}
}