プログラミング自主学習 DAY63 java.base
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