新卒エンジニアの奮闘日記

何もスキルのない新卒社員がエンジニアとして活躍するまでの奮闘日記です.

【Java】アクセス修飾子

Main.java

package work.accessope;

public class Main {

	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
		AccessOpe ope = new AccessOpe();
		// public - すべてのクラス
		System.out.println("public : " + ope.money_pub);
		// protected - 自分と同じパッケージに属する or 継承した子クラス
		System.out.println("protected : " + ope.money_pro);
		// package protected - 自分と同じパッケージに属するクラス
		System.out.println("package protected : " + ope.money_pac_pri);
		// private - 自分自身のクラスのみ
		//System.out.println("private : " + ope.money_pri);   error
		
		int money = ope.getMoney();
		System.out.println("getter : " + money);  

		//
	}

}

AccessOpe.java

package work.accessope;

public class AccessOpe {
		public int money_pub = 3000;
		protected int money_pro = 3000;
		int money_pac_pri = 3000; // package private
		private int money_pri = 3000;
		
		public int getMoney() {
			return this.money_pri;
		}
}

出力

f:id:flying_penguin_muchi:20210613161121p:plain

【Java】while 文と do while

(while) 前判定 か (do while) 後ろ判定か

public class WhileDowhile {

	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
		int i = 0;
		while (i < 0) {
			System.out.println("loop(i) " +  (i + 1) + "回目");
			i++;
		}
		int j = 0;
		do {
			System.out.println("loop(j)" +  (j + 1) + "回目");
			j++;
		} while (j < 0);
	}

出力
f:id:flying_penguin_muchi:20210612171925p:plain

【Java】拡張for文

public class ForKakutyo {

	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
		String[] onigirinogu = {"すじこ", "鮭", "うめ", "ツナ"};
		int[] price = {100, 110, 120, 105};
		for (int i = 0; i < onigirinogu.length; i++) {
			// 初期化; 条件式; 反復式(処理の後に実行
			System.out.println("おにぎりの具 = "+ onigirinogu[i]);
			System.out.println("価格 = "+ price[i]);
		} 
		// 拡張for
		for (String i : onigirinogu) {
			// 初期化; 条件式; 反復式(処理の後に実行
			System.out.println("おにぎりの具 = "+ i);
		}
		for (int j : price) {
			// 初期化; 条件式; 反復式(処理の後に実行
			System.out.println("価格 = "+ j);
		}
		
	}

}

出力
f:id:flying_penguin_muchi:20210612170300p:plain

【Java】switch 文とbreak

・switch 文

switch(値) {
case 値:
// 処理
break;
case 値:
// 処理
break;
default:
// 処理
break;
}

break がないと,下記のように
そのケースの後の処理も行ってしまう.

package work;

import java.util.Random;

public class SwitchBreak {

	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
	
		// Random クラスの nextlnt を用いて, 
		// 0 ~ 引数未満の整数の乱数を生成
		
		Random rand = new Random();
		// 1 ~ 5 の整数を得る
	    int a = rand.nextInt(5) + 1;	    
		System.out.println("a = " + a);
		
		switch (a) {
			case 1:
				System.out.println("ケース1 の処理です");
				break;
			case 2:
				System.out.println("ケース2 の処理です");
				// break;
			case 3:
				System.out.println("ケース3 の処理です");
				break;
			default:
				System.out.println("ケース該当なしです");
		}
	}

}

出力
f:id:flying_penguin_muchi:20210612161846p:plain

【Java】論理演算子

インクリメント演算子 ++

デクリメント演算子 --

論理和 | , ||

論理積 &, &&


論理和論理積の |, & は両方の条件式を評価してから処理を行う.

package work;

public class Operater {

public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ
// 論理和
int aa = 1;
int bb = 1;
// 両方の条件式を評価
if (++aa != 1 | ++bb != 1) { // インクリメント演算子の前置処理
System.out.println("aa = " + aa);
System.out.println("bb = " + bb);
}
int cc = 1;
int dd = 1;
// 前の条件式を評価し,true だったので,後ろの条件式は評価しない
if (++cc != 1 || ++dd != 1) { // インクリメント演算子の前置処理
System.out.println("cc = " + cc);
System.out.println("dd = " + dd);
}

// 論理積
int a = 1;
int b = 1;
// 両方の条件式を評価
if (++a == 1 & ++b == 1) { // インクリメント演算子の前置処理
} else {
System.out.println("a = " + a);
System.out.println("b = " + b);
}

int c = 1;
int d = 1;
// 前の条件式を評価し,false だったので,後ろの条件式は評価しない
if (++c == 1 && ++d == 1) { // インクリメント演算子の前置処理
} else {
System.out.println("c = " + c);
System.out.println("d = " + d);
}
}

}

出力
f:id:flying_penguin_muchi:20210612161038p:plain

【Java】暗黙の型変換/明示的な型変換

暗黙の型変換

保持できる値の範囲が狭いデータ 型-> 広いデータ型

明示的な型変換

保持できる値の範囲が広いデータ 型-> 狭いデータ型
ビット落ちが発生する可能があるので,キャスト演算子()を使って
明示的に変換する必要がある.

package work;

public class Katahenkan {

	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
		byte b1 = 8;
		short s1 = b1; // 暗黙の型宣言
		System.out.println("b1 = " + b1);
		System.out.println("s1 = " + s1);

		short s2 = 264;
		byte b2 = (byte)s2; // 明示的な型宣言 キャスト演算子()を使用
		int i = (int)5.7; // 明示的な型変換
		System.out.println("s2 = " + s2);  // 264 (0000000100001000)が出力 short は16bit
		System.out.println("b2 = " + b2);  // 8                       (00001000)が出力 byte は 8bit なので,
		                                         //                           9bit より上位のビットが切り捨て
		System.out.println("i = " + i );     // 小数点は切り捨てられる
	}

}
出力

f:id:flying_penguin_muchi:20210606230722p:plain

【Java】値渡しと参照渡し, 参照の値渡し

【Java】 変数の型2 - 新卒エンジニアの奮闘日記
で変数の型について学んだ.

今度はプリミティブ(値)型と参照型で何が違うのかについて学んでいく.
参考にしたページは
Javaの値渡しと参照渡しの使用方法について現役エンジニアが解説【初心者向け】 | TechAcademyマガジン


プリミティブ型ではメモリ領域にその変数の型で決められた分の
領域を確保し,値を保持している.

参照型ではその変数の値が格納されているメモリ上のアドレスを
保持している.

この前提を頭に入れておく

値渡し

public static void main(String[] args) {
  int num = 10;
  test(num);
  System.out.println(num);
}

public static void test(int num) {
  num += 10;
  System.out.println(num);
}
出力

f:id:flying_penguin_muchi:20210606215700p:plain

  1. プリミティブ型の int でnum という変数を宣言,20 を代入
  2. test メソッドを呼び出し,値渡しで num を渡す
  3. test メソッド内で,num に10 を加え,20 になった num を表示
  4. main メソッド内の10 の num を出力

イメージとしては,test メソッドに num の値を見せるだけ.
テストメソッドの num に num の値をコピーする感じ
main メソッド内の num とは値のコピーなので違うもの

参照渡し

package work;

public class Value2 {

	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
			  String[] array = {"おはようございます", "こんにちは", "こんばんは"};
			  test(array);
			  System.out.println(array[0]);
			}

			public static void test(String[] array) {
			  array[0] = "Hello";
			  System.out.println(array[0]);
			}
}
出力

f:id:flying_penguin_muchi:20210606220744p:plain

  1. 参照型のString[] で配列を宣言
  2. test メソッド を呼び出し,変数 array を参照渡しで渡す
  3. 参照渡しなので,メモリ上にある array の要素を直接変更出来るため,array[0] が Hello となる.

学生のときにさわっていたFortra とかは参照渡しだったので
自分としてはこっちの方がしっくりくる.

参照の値渡し

package work;

public class Value3 {
	public static void main(String[] args) {
		  String[] array = {"おはようございます", "こんにちは", "こんばんは"};
		  test(array);
		  System.out.println(array[0]);
		}

		public static void test(String[] array) {
		  array = new String[3];
		  array[0] = "Hello";
		  System.out.println(array[0]);
		}
}
出力

f:id:flying_penguin_muchi:20210606221931p:plain

先程の参照渡しとは異なり,main メソッド内で,array[0] が変更されていない.
これは,test メソッドの中で引数に対して,配列を新たに宣言したことにより,
test メソッド内の array はこの新たに宣言されたarray のアドレスを指すため,
main メソッド内では変更されず,出力されたといこと.