📝

プログラミング自主学習 DAY63 java.base

2023/07/29に公開

java.base

System

javaは、基本的にOSではなく、JVMより実行されるため、OSのすべての機能にアクセスすることは難しい。しかし、Systemクラスを通して、一部の機能を利用できる。

field: out(Printstream), err(Printstream),in(Inputstream)
3つのみ公開されている。

err

エラーの内容が赤い色で出力される。今は、Eclipseをアレンジしているため、色は異なっている。

in

Scanner sc = new Scanner(System.in) //文字列を一気に読む

input keyCode = System.in.read(); //一つの文字ずつ読む

キーボードから入力する。

public static void main(String[] args) throws Exception{
	int speed = 0;
	int keyCode = 0;
		
	while(true) {
	     //Enter 
	    if(keyCode != 13 && keyCode !=10) {
		if(keyCode == 49) {
			speed++;
		}else if(keyCode == 50) {
			speed--;
		}else if(keyCode == 51) {
			break;
		}
				
		System.out.println("-----------------------");
		System.out.println("1. speedup| 2. speeddown| 3. suspend");
		System.out.println("-----------------------");
		System.out.println("speed(now)=" + speed);
		System.out.print("select: ");
	      }
			
		keyCode = System.in.read();
			
	    }
	   System.out.println("program exit");

	}
}

exit

processを終了してくれる。

System.exit(status)   //status=0は通常終了、status =1|-1は非正常終了

java17からはstatusを活用するSecurityManagerというオブジェクトがDeprecatedになる。

public class ExitExample {

	public static void main(String[] args) {
		for(int i=0; i<10; i++) {
			System.out.println(i);
			if(i==5) {
				System.out.println("プログラミング強制終了");
				System.exit(0);
			}
		}

	}

}

currentTimeMillis(), nanoTime()

プログラムの処理時間をリータンする。
currentTimeMillis()は10の-3乗、nanoTime()は-9乗単位まで測定できる。

public class MeasureRuntimeExample {

	public static void main(String[] args) {
		long time1 = System.currentTimeMillis();
		 int sum = 0;
		 for(int i=0; i<=1000000; i++) {
			 sum += i;
		 }
		 long time2 = System.currentTimeMillis();
		 
		 System.out.println("sum:" + sum);
		 System.out.println("Runtime(ms):" + (time2-time1));
		 System.out.println("Runtime(sc):" + (time2-time1)/1000.0);
	}

}

sum:1784293664
Runtime(ms):12
Runtime(sc):0.012

System property

OSのproperty(韓国語で속성と言えば、分かりやすいかも)を確認できる。

import java.util.Properties;
import java.util.Set;

public class GetPropertyExample {

	public static void main(String[] args) {
		//OS,User Information
		String javaVersion = System.getProperty("java.specification.version"); //yellow letters= key
		String javaHome = System.getProperty("java.home");
		String osName = System.getProperty("os.name");
		String userName = System.getProperty("user.name");
		String userHome = System.getProperty("user.home");
		System.out.println(javaVersion);
		System.out.println(javaHome);
		System.out.println(osName);
		System.out.println(userName);
		System.out.println(userHome);
		
		System.out.println();
		System.out.println();
		
		//All Keys and Keys value
		System.out.println("--------------------------");
		System.out.println("key:  value");
		System.out.println("--------------------------");
		Properties props = System.getProperties();
		Set keys = props.keySet();
		for(Object objKey: keys) {
			String key = (String)objKey;
			String value = System.getProperty(key);
			System.out.printf("%-40s: %s\n", key, value);
		}
	}
}
17
C:\Users\gram\.p2\pool\plugins\org.eclipse.justj.openjdk.hotspot.jre.full.win32.x86_64_17.0.7.v20230425-1502\jre
Windows 10
gram
C:\Users\gram


--------------------------
key:  value
--------------------------
java.specification.version              : 17
sun.cpu.isalist                         : amd64
sun.jnu.encoding                        : MS949
.
.
.
.
.
.
java.class.version                      : 61.0

String, StringBuilder,StringTokenizer

★String.getBytes()★

ネットワークを通して、データーを送る際は、0,1のようにByte単位でデーターを送るため、
Byteに変換する必要がある。すなわち、パソコンの言語にIncodingすることが必要だ。
文字列をエンコーディングする際には、getBytes()メソッドを活用する。

<INCODING>
** String -> Byte[]**

String a= "人々";
byte[] arr1 = a.getBytes("incodingName")
ex> byte[] arr1 = a.getsBytes("UTF-8")
byte[] arr2 = a.getsBytes("EUC-KR")

<DECODING>
** Byte[] -> String**

String str = new String(char[] arr, "decodingName");
ex> String str1 = new String(arr1,"UTF-8")
String str2 = new String(arr2,"EUC-KR")
`

import java.io.UnsupportedEncodingException;
import java.util.Arrays;

public class StringToBytesExample {

	public static void main(String[] args)   {

		String data = "a자바";
		
		
		try {
			//encoding	
			byte[] arr1 = data.getBytes("UTF-8");
			System.out.println(arr1.length);
		    System.out.println(Arrays.toString(arr1));
		    
		    //decoding
		    String data2 = new String(arr1,"UTF-8");
		    System.out.println(data2);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
	   	    
	}  

}	
	
7
[97, -20, -98, -112, -21, -80, -108]
a자바	

StringBuilder➡メソッド連鎖

String result = new StringBuilder()
	        .append("DEF")
	        .insert(0,"ABC")
	        .delete(3,4)
	        .toString();

このように、StringBuilderの変数に都度都度.演算子でアクセスしてメソッドを呼び出すことではなく、メソッド連鎖パータン(Method Chaining) を通して、簡単に作成することもできる。;は最後のコードのみ付けば、終わりだ。

StringTokenizer

Stringのsplitのメソッドのように、java.util.StringTokenizerクラスを通して、文字列を分離することができる。

import java.util.StringTokenizer;

public class StringTokenizerExample {

	public static void main(String[] args) {
		String data1 = "홍길동&이수홍,박연수";
		String[] arr = data1.split("[&|,]");
		for(String token: arr) {
			System.out.println(token);
		}
			

		System.out.println();
		
		String data2 = "홍길동/이수홍/박연수";
		StringTokenizer st = new StringTokenizer(data2, "/");
		while(st.hasMoreTokens()) {
			String token = st.nextToken();
			System.out.println(token);
		}
		
		
	}

}
홍길동
이수홍
박연수

홍길동
이수홍
박연수	

Wrapper Class(ラッパークラス)

基本データタイプの値を持っているオブジェクト。
Byte,Short,Character,Integer,Long,Float,Double,Booleanがある。

本来であれば、クラスの変数にはアドレスしか入れないが、自動的に「100」という値が入る。
内部的に「100」という値を持っているオブジェクトを生成し、保存されるため、オートという表現を使う。
同様アンボクシングも、基本型データータイプの変数には、objが参照しているオブジェクトのフィールドは入れないが、100というデーターが自動的にaに入る。

public class BoxingUnBoxingExample {
	public static void main(String[] args) {
    //Boxing
	Integer obj = 100;
	System.out.println("value:" + obj.intValue());
		
	//Unboxing
	int value = obj;
	System.out.println("value:" + value);
	
	int result = obj + 100;
	System.out.println("result:" + result);
	}

}
	
value:100
value:100
result:200
public class ValueCompareExample {

	public static void main(String[] args) {
		Integer obj1 = 300;
		Integer obj2 = 300;

		System.out.println(obj1 == obj2);
		System.out.println(obj1.equals(obj2));
	}

}
false
true	

Math

Math.round

double a = 12.3456789;
System.out.println(a*100);
1234.56789
	
System.out.println((double)Math.round(a*100));
1235.0		

System.out.println((double)Math.round(a*100)/100);
12.35	

四捨五入のメソッドだが、整数にリータンするため、doubleタイプでキャストし、また分けなければならないため、相当不便なメソッドだ。String.formatというメソッドがより使いやすい。
しかし、性能的にはMath.roundの方が圧倒的に早い。

Random

Math.Random()はダブルのみリータンするが、Randomクラスは、int,double,booleanなど様々なデータータイプの乱数をリターンするクラスだ。

nextBoolean() : booleanタイプの乱数をリターン
nextDouble() : doubleタイプの乱数をリターン [0 <=~ <1]
netxInt() : intタイプの乱数をリターン [-2^32<=~<=2^32-1]
nextInt(int n) : intタイプの乱数をリターン [0<=~ <n]

また、Randomのパラメータコンストラクタ、Random(long seed)は、seedという値を入力する。
seedにより、Randomアルゴリズムのパターンが変わり、同じseedであれば、ずっと同じ結果が出る。

import java.util.Arrays;
import java.util.Random;


public class RandomExample {   //Lotto

	public static void main(String[] args) {
	//선택 번호
	int[] selectNumber = new int[6];
	Random random = new Random(3);  //seed : 3
	System.out.println("선택번호: ");
	for(int i=0; i<6; i++) {
		selectNumber[i] = random.nextInt(45)+1;
		System.out.print(selectNumber[i] +" ");
	}
	System.out.println();
	
	//당첨 번호
	int[] winningNumber = new int[6];
	random = new Random(8);   //seed : 5
	System.out.println("당첨번호: ");
	for(int i=0; i<6; i++) {
		winningNumber[i] = random.nextInt(45)+1;
		System.out.print(winningNumber[i] +" ");
	}
	System.out.println();
	
	//당첨 여부
	Arrays.sort(selectNumber);
	Arrays.sort(winningNumber);
	boolean result = Arrays.equals(selectNumber, winningNumber);
	System.out.print("당첨여부: ");
	if(result) {
		System.out.println("1등에 당첨되었습니다!");  //win
	}else {
		System.out.println("당첨되지 않았습니다.");  //lose
	}
	

	}

}

Discussion