デフォルトAPIクラス02


オブジェクト消滅者の特定()


参照しない配列またはオブジェクトは、ゴミ収集器によって自動的にスタック領域から消去されます.このゴミ収集器は、オブジェクトが消滅する前に、最後にオブジェクトの消滅者(finalize()を実行する.
->実際の実行結果に基づいて、順番に破棄するのではなく、ランダムに破棄することができます.すべて破棄するのではなく、メモリのステータスを確認し、一部を破棄します.
->finalize()メソッドを呼び出す時点が不明で、可能であれば消滅者は使用しないでください.

Objectsクラス


Object名と似ていますが、違います.オブジェクトのユーティリティクラスは,オブジェクト比較を実行し,ハッシュコードを生成し,空であるかどうか,オブジェクト文字列を返すかどうかなどの演算を行う静的メソッドからなる.
いくつかのObjects静的方法を簡単に使用してみましょう
  • dee_dquals, hash, hashCode, inNull..
  • public class Example {
    	public static void main(String[] args) {
    		
    		boolean result = Objects.equals(10,  10);
    		boolean result1 = Objects.equals(10,  30);
    		System.out.println(result + ", "+ result1);
    		
    		// 객체가 들어갈 수도 있다.
    		Car car1 = new Car(1000);
    		Car car2 = new Car(1000);
    		boolean result2 = Objects.equals(car1.price, car2.price);
    		System.out.println(result2);
    		
    		System.out.println("-------------------------------------------------");
    		
    		// Deep_equals
    		/*
    	    public static boolean deepEquals(Object a, Object b) {
    	        if (a == b)
    	            return true;
    	        else if (a == null || b == null)
    	            return false;
    	        else
    	            return Arrays.deepEquals0(a, b);
    	    }
    	    */
    		int[] intArr1 = {10, 20, 30};
    		int[] intArr2 = {40, 50, 60};
    		boolean result3 = Objects.deepEquals(intArr1, intArr2);
    		System.out.println(result3);
    		
    		int[] intArr3 = {10, 20};
    		int[] intArr4 = {10, 20};
    		boolean result4 = Objects.deepEquals(intArr3, intArr4);
    		System.out.println(result4);
    		
    		System.out.println("-------------------------------------------------");
    		
    		/*
    		public static int hash(Object... values) {
    			return Arrays.hashCode(values);
    		}
    			
    	    public static int hashCode(Object o) {
    	    	return o != null ? o.hashCode() : 0;
        	}
    		*/
    		int hasResult = Objects.hash("김자바", "이자바");
    		System.out.println(hasResult);
    		
    		int hasCodeResult = Objects.hashCode("김자바");
    		System.out.println(hasCodeResult);
    		
    		System.out.println("-------------------------------------------------");
    		
    		/*
    	    public static boolean isNull(Object obj) {
    	        return obj == null;
    	    }
    	    */
    	    // null 인지 조사하기
    		String name = null;
    		if (Objects.isNull(name)) {
    			System.out.println("이름이 없습니다");
    		} else {
    			System.out.println("이름 : " + name);
    		}
    		
    		System.out.println("-------------------------------------------------");
    		
    
    	}
    }
    
    class Car{
    	int price;
    	public Car(int price) {
    		this.price = price;
    	}
    }
    運転状態
  • requireNonNull, toString...
  • public class Example2 {
    	public static void main(String[] args) {
    		/*
    		public static <T> T requireNonNull(T obj) {
            	if (obj == null)
                	throw new NullPointerException();
            	return obj;
        	}
    		 */
    		// 객체가 null인 경우 예외 발생
    		// 들어가는 타입에 따라 나오는 타입도 동일하게 결정된다
    		
    		int num1 = 9;
    		int iRetrun = Objects.requireNonNull(num1);
    		System.out.println(iRetrun);
    		
    		String name1 = "홍길동";
    		String tRetrun = Objects.requireNonNull(name1);
    		System.out.println(tRetrun);
    
    		// null 일때 예외 발생하니 try-catch로 잡아주기
    		String name2 = null;
    		try {
    			String tReturn2 = Objects.requireNonNull(name2);
    			System.out.println(tReturn2);
    		} catch (NullPointerException e) {
    			System.out.println("이름이 없습니다");
    			System.out.println("에러 메시지 : " + e.getMessage());
    		}
    		
    		System.out.println("-------------------------------------------------");
    		
    		/*
    	    public static String toString(Object o) {
    	        return String.valueOf(o);
    	    }
    	    */
    	    int num2 = 1234;
    		String toStringResult = Objects.toString(num2);
    		System.out.println(toStringResult);
    		
    		Car2 c2 = new Car2(10000);
    		String toStringResult2 = Objects.toString(c2.price);
    		System.out.println(toStringResult2);
    		
    		// 공백이 들어가면 "빈 자료" 가 대신 들어가는 출력
    		String str = null;
    		String toStringResult3 = Objects.toString(str, "빈 자료");
    		System.out.println(toStringResult3);
    	}
    }
    
    class Car2{
    	int price;
    	public Car2(int price) {
    		this.price = price;
    	}
    }
    運転状態

    オブジェクトの比較


    :Objects.compare(T a, T b, Domparator<T>c)メソッドは、2つのオブジェクトを比較することによってint値を返します.
    :aがbより小さい場合は、実装クラスを作成して負の値を返し、0に等しい場合は正の値を返します.
  • Comparatorの原型はComparator<타입>である.次の例ではタイプが指定されていないため、再定義と同時に降格と使用を行います.
    :次の例では、Integerのためか、比較数が127を超えると、比較数が予想通りに出力されない場合があります.
  • public class CompareEx {
    	public static void main(String[] args) {
    
    		Comparator c = new Comparator() {
    			@Override
    			public int compare(Object o1, Object o2) {
    				// 값이 들어가는지 확인하기
    				// System.out.println(o1);
    				// System.out.println(o2);
    				// 다운 캐스팅 하기
    				Integer io1 = (Integer) o1;
    				Integer io2 = (Integer) o2;
    				int r = 0;
    				if (io1 < io2) {
    					r = -1;
    				} else if (io1 == io2) {
    					r = 0;
    				} else {
    					r = 1;
    				}
    				return r;
    			}
    		};
    
    		// 호출해 사용
    		// (a, b, c) 에서 비교할 수를 a와 b에 넣고
    		// Comparator을 객체 생성한 c를 넣어 사용
    		int result1 = Objects.compare(120, 127, c);
    		System.out.println(result1);
    		if (result1 == 0) {
    			System.out.println("입력 수 두 개는 같습니다");
    		} else if (result1 > 0) {
    			System.out.println("먼저 입력한 수가 더 크네요");
    		} else {
    			System.out.println("두번째 입력 수가 더 크네요");
    		}
    
    	}
    }
    実行結果
    -1
    두번째 입력 수가 더 크네요
  • Double比較Comparator <사용할 자료 타입이 쓰이는 곳><>に使用するタイプがリストされている場合は、
  • をダウングレードする必要はありません.
    public class compareEx1 {
    	public static void main(String[] args) {
    		// 다운캐스팅을 재정의 내부에서 해주지 않아도 된다.
    		Comparator<Double> c = new Comparator<Double>() {
    			@Override
    			public int compare(Double o1, Double o2) {
    
    				if(o1 < o2) { return -1; }
    				if(o1 > o2) { return 1; }
    				return 0;
    			}
    		};
    		
    		Double a = new Double(10.45);
    		Double b = new Double(5.24);
    		int result = Objects.compare(a, b, c);
    		
    		System.out.println(result);
    	}
    }
    実行結果
    1
  • Character比較
  • public class compareEx2 {
    	public static void main(String[] args) {
    		Character a = new Character('C');
    		Character b = new Character('B');
    
    		Comparator<Character> c = new Comparator<Character>() {
    			@Override
    			public int compare(Character o1, Character o2) {
    				if (o1 < o2) {
    					return -1;
    				}
    				if (o1 > o2) {
    					return 1;
    				}
    				return 0;
    			}
    		};
    		int result = Objects.compare(a, b, c);
    		if (result < 0) {
    			System.out.println(a + "가 " + b
                				+ " 보다 사전상 앞에 있겠네요");
    		} else if (result > 0) {
    			System.out.println(a + "가 " + b
                				+ " 보다 사전상 뒤에 있겠네요");
    		} else {
    			System.out.println(a + "와 " + b
                					+ " 는같은 문자네요");
    		}
    	}
    }
    実行結果
    C가 B 보다 사전상 뒤에 있겠네요
  • String比較
  • public class compareEx3 {
    	public static void main(String[] args) {
    	
    		String a = "김자바";
    		String b = "홍길동";
    		
    		Comparator<String> c = new Comparator<String>() {
    			@Override
    			public int compare(String o1, String o2) {
    				// compareTo
                    		// : 문자의 유니코드를 비교해 계산 후 리턴된다
    				return o1.compareTo(o2); 
    			}
    		};
    		int result = Objects.compare(a, b, c);
    		if (result < 0) {
    			System.out.println(a + " (이)가 " + b
                				+ "보다 사전상 먼저 있습니다");
    		} else if (result > 0) {
    			System.out.println(a + " (이)가 " + b
                				+ "보다 사전상 뒤에 있습니다");
    		} else { 
    			System.out.println("같은 단어 입니다");
    		}
    	}
    }
    実行結果
    김자바(이)가 홍길동보다 사전상 먼저 있습니다
  • 学号を入力して比較する(1)
    ユーザーの入力を受信して比較します.
    2つのオブジェクトを作成し、それぞれ2つのオブジェクトを挿入します.
  • public class CompareEx4_1 {
    	public static void main(String[] args) throws IOException {
    		// Student객체를 2번 생성해 2명 각각 넣기
    		Student s1 = new Student();
    		Student s2 = new Student();
    
    		// 학번 입력하기
    		BufferedReader br = new BufferedReader(new
            				InputStreamReader(System.in));
    		System.out.println("A의 학번을 입력해주세요");
    		s1.hakbun = br.readLine();
    		System.out.println("B의 학번을 입력해주세요");
    		s2.hakbun = br.readLine();
    
    		// 학번 비교하기
    		Comparator<Student> c = new Comparator<Student>() {
    			@Override
    			public int compare(Student o1, Student o2) {
    				return o1.hakbun.compareTo(o2.hakbun);
    			}
    		};
    		int result = Objects.compare(s1, s2, c);
    		if (result > 0) {
    			System.out.println("A가 후배입니다");
    		} else if (result < 0) {
    			System.out.println("A가 선배입니다");
    		} else {
    			System.out.println("A와 B는 동기입니다");
    		}
    	}
    }
    
    class Student {
    	String hakbun;
    }
    実行結果
  • 学号を入力して比較する(2)
    ユーザ入力を受信して比較
  • public class CompareEx4  {
    	public static void main(String[] args) throws IOException{
    		BufferedReader br = new BufferedReader(new
            				InputStreamReader(System.in));
    		
    		System.out.println("A의 학번을 입력해주세요");
    		String a = br.readLine();
    		System.out.println("B의 학번을 입력해주세요");
    		String b = br.readLine();
    		
    		Comparator<String> c = new Comparator<String>() {
    			@Override
    			public int compare(String o1, String o2) {
    				return o1.compareTo(o2);
    			}
    		};
    		
    		int result = Objects.compare(a, b, c);
    		
    		if (result > 0) {
    			System.out.println("A가 후배입니다");
    		} else if (result < 0) {
    			System.out.println("A가 선배입니다");
    		} else {
    			System.out.println("A와 B는 동기입니다");
    		}
    	}
    }

    equals()とdeepEquals()を同等に比較する

    Objects.equals(Object a, Object b)2つのオブジェクトを同等に比較し、次の結果を返します.特にnullの場合はtrueを返します.aとbがnullでない場合、a.equals(b)の結果が返されます.
    Objects.deepEquals(Object a, Object b)同じように2つのオブジェクトの等しいものを比較し、aとbが異なる配列であり、プロジェクト値が同じである場合、trueを返します.

    Deep equalsは、前述のObjectクラスの使用例で既に使用されています.以下のとおりです.
    // Deep_equals 의 원 형태
    /*
       public static boolean deepEquals(Object a, Object b) {
           if (a == b)
               return true;
           else if (a == null || b == null)
               return false;
           else
               return Arrays.deepEquals0(a, b);
       }
    */
    int[] intArr1 = {10, 20, 30};
    int[] intArr2 = {40, 50, 60};
    boolean result3 = Objects.deepEquals(intArr1, intArr2);
    System.out.println(result3);
    		
    int[] intArr3 = {10, 20};
    int[] intArr4 = {10, 20};
    boolean result4 = Objects.deepEquals(intArr3, intArr4);
    System.out.println(result4);
    		
    System.out.println("-------------------------------------------------");

    システムクラス


    :Javaプログラムはオペレーティングシステム上で直接実行するのではなく、JVM上で実行します.
    -> java.langパッケージのシステムクラスを使用すると、オペレーティングシステムのいくつかの機能を使用できます.つまり、プログラムを閉じたり、入出力をしたり、メモリを整理したり、現在の時間を読み取ったりすることができます.

    プログラムexit()を終了


    場合によっては、JVMを強制的に閉じる場合は、システムクラスのexit()メソッドを呼び出すことができます.exit()メソッドは、現在実行中のプロセスを強制的に終了させることができます.
    ユーザーに必要な終了設定.終了する前に、for文は正常に実行されます.
    public class ExitEx {
    	public static void main(String[] args) {
    		// 보안 관리자 설정
    		// 익명 자손 객체 만들기
    		System.setSecurityManager(new SecurityManager() {
    			@Override
    			public void checkExit(int status) {
    				// 사용자가 원하는 종료 설정
    				// 종료 상태값이 5일 경우 예외를 던지고
    				// 예외 처리에서 프로그램을 종료하도록 처리
    				if(status != 5) {
    					throw new SecurityException();
    				}
    			}
    		});
    		
    		for (int i=0; i<10; i++) {
    			//i값 출력
    			// 5까지는 정상적으로 출력되다가
    			System.out.println(i);
    			try {
    				// i에 5가 들어가면 exit() 실행 되는 모습
    				System.exit(i);
    			} catch (SecurityException e) { }
    		}
    	}
    }

    ごみ収集器gc()の運転


    JVMはメモリ不足やCPUアイドル時にゴミ収集器を実行し、未使用のオブジェクトを自動的にクリアします.
    ->gc()メソッドは、メモリが悪くない環境ではほとんど使用する必要はありません.

    現在の読み込みcurrentTimeMillis()、nanoTime()


    システムクラスのcurrentTimeMillis(0メソッドとnanoTime()メソッド)は、コンピュータクロックから現在の時間を読み出し、ミリ秒単位(1/1000秒)とナノ秒単位(1/1999,9999秒)の長い値を返します.
    // 컴퓨터의 시계로부터 현재 시간을 읽어서
    // 밀리 세컨드 단위와 나노세컨드 단위의 long값을 리턴
    long time = System.currentTimeMillis();
    System.out.println(time);
    time = System.nanoTime();
    System.out.println(time);
    for文に移動し、プログラムを実行するのに要する時間を求めましょう.
    // 시스템의 현재 시간
    long time1 = System.nanoTime();
    
    int sum = 0;
    for (int i = 1; i <= 1000000; i++) {
    	sum += i;
    }
    
    long time2 = System.nanoTime();
    
    System.out.println("1~100000 까지의 누적 합 : " + sum);
    System.out.println("계산에 걸린 시간 : " + (time2 - time1)
    					+ " (단위: 나노초)");

    システム構成読み込みgetProperty()


    システム構成とは、JVM起動時に自動的に設定されるシステムの属性値です.たとえば、オペレーティングシステムのタイプや、Javaプログラムを実行するユーザーID、JVMのバージョン、オペレーティングシステムで使用されるファイルパス区切り記号などです.
    String value = System.getProperty(String key);
    System.getProperty()メソッドを使用して、システムプロファイルを取得します.このメソッドは、システムプロファイルの鍵名をパラメータとして受け入れ、鍵の文字列を返します.
    propertyのキーと値を入力すると、次のようになります.
    // (키, 값)으로 구성된 속성(Properties)들을 리턴받는다
    Properties props = System.getProperties();
    // keySet() 은 '키'로만 구성된 set 객체를 받는다
    // Set은 자료구조의 하나로 컬렉션의 종류 중 하나
    Set keys = props.keySet();
    // for문은 Set 객체로부터 키를 하나씩 얻어내어 문자열로 변환한 다음
    // System.getProperty() 메소드로 값을 얻어와 키와 값을 모두 출력
    for (Object objkey : keys) {
    	String key = (String) objkey;
    	String value = System.getProperty(key);
    	System.out.println("[" + key + "]" + value);
    }
    あなたが使っている様子を見てみましょう.
    String osName = System.getProperty("os.name");
    String userName = System.getProperty("user.name");
    String userHome = System.getProperty("user.home");
    String javaVer = System.getProperty("java.version");
    String dir = System.getProperty("user.dir");
    		
    System.out.println("운영체제 이름 : " + osName);
    System.out.println("사용자 이름 : " + userName);
    System.out.println("사용자의 홈 디렉토리 : " + userHome);
    System.out.println("자바 버젼 : " + javaVer);
    System.out.println("현재 작업중인 디렉토리 경로 : " + dir);
    
    System.out.println("----------------------------------");
    System.out.println(" [key] value");
    System.out.println("----------------------------------");
    
    // (키, 값)으로 구성된 속성(Properties)들을 리턴받는다
    Properties props = System.getProperties();
    // keySet() 은 '키'로만 구성된 set 객체를 받는다
    // Set은 자료구조의 하나로 컬렉션의 종류 중 하나
    Set keys = props.keySet();
    // for문은 Set 객체로부터 키를 하나씩 얻어내어 문자열로 변환한 다음
    // System.getProperty() 메소드로 값을 얻어와 키와 값을 모두 출력
    for (Object objkey : keys) {
    	String key = (String) objkey;
    	String value = System.getProperty(key);
    	System.out.println("[" + key + "]" + value);
    }
    		
    		
    		
    System.out.println("----------------------------------");
    
    // 여기 있는 것이 null 값을 가지고 있다면, "여기 있는 것이 기본설정으로 출력된다"
    // 키가 null을 가지고 있다면(키가 유호하지 않다면), 여기 설정한 것이 기본 값이 된다
    String userDir = System.getProperty("user_dir", "기본 설정값");
    System.out.println(userDir);
    		
    String userjava = System.getProperty("java.version", "기본 설정값");
    System.out.println(userjava);

    環境変数getenv()の読み込み


    ウィンドウ環境変数の
    // name에 해당하는 value 값만 구해준다
    String getenvValue = System.getenv("JAVA_HOME");
    System.out.println(getenvValue);
    		
    // 모든 환경변수 출력하기
    Map allGetEnv = System.getenv();
    Set keys = allGetEnv.keySet();
    int cnt = 1;
    for(Object objkey : keys ) {
    	String key = (String) objkey;
    	String value = System.getenv(key);
    	System.out.println("NO " + cnt++
        			+ " | key : " + key + "\t\t\t value : " + value);

    クラス#クラス#


    クラスオブジェクトgetClass()を取得し、forName()


    プログラムからクラスオブジェクトを取得するには、Objectクラスが持つgetClass()メソッドを使用します.
    public class ClassEx {
    	public static void main(String[] args) {
    		Car car = new Car();
    
    		// Class는 java.lang 안에 있으니
            	// 따로 import 같은거 안해줘도 된다 
    		Class cc = car.getClass();
    		// 참조변수를 출력하면 자동으로 toString()이 붙는다
    		System.out.println(cc.toString());
    		System.out.println(cc);
    		System.out.println(cc.getName());
    		System.out.println(cc.getSimpleName());
    		System.out.println(cc.getPackage());
    		System.out.println(cc.getPackage().getName());
    	}
    }
    
    
    class Car{	}
    実行結果
    class a6_Class.Car
    class a6_Class.Car
    a6_Class.Car
    Car
    package a6_Class
    a6_Class

    返信


    クラスオブジェクトを使用して、クラスの作成者、フィールド、メソッド情報を理解できます.これを反射と呼ぶ.
    クラスメンバー情報の動的取得
    public class ReflectionEx {
    	public static void main(String[] args) throws Exception {
        		// 얻어올 java파일의 경로를 forName에 넣어준 것
    		Class clazz = Class.forName("a5_System.SystemTimeEx");
    		
    		System.out.println("[클래스 이름]");
    		System.out.println(clazz.getName());	
    		
    		System.out.println("[생성자 정보]");
    		Constructor[] constructors = clazz.getDeclaredConstructors();
    		for(Constructor constructor : constructors) {
    			System.out.print(constructor.getName() + "(");
    			Class[] parameters = constructor.getParameterTypes();
    			printParameters(parameters);
    			System.out.println(")");
    		}		
    		
    		System.out.println("[필드 정보]");
    		Field[] fields = clazz.getDeclaredFields();
    		for(Field field : fields) {
    			System.out.println(field.getType().getSimpleName() + " " + field.getName());
    		}
    		
    		System.out.println("[메소드 정보]");
    		Method[] methods = clazz.getDeclaredMethods();
    		for(Method method : methods) {
    			System.out.print(method.getName() + "(");
    			Class[] parameters = method.getParameterTypes();
    			printParameters(parameters);
    			System.out.println(")");
    		}			
    	}
    	
    	private static void printParameters(Class[] parameters) {
    		for(int i=0; i<parameters.length; i++) {
    			System.out.print(parameters[i].getName());
    			if(i<(parameters.length-1)) {
    				System.out.print(",");
    			}
    		}
    	}
    }
    実行結果
    [클래스 이름]
    a5_System.SystemTimeEx
    [생성자 정보]
    a5_System.SystemTimeEx()
    [필드 정보]
    [메소드 정보]
    main([Ljava.lang.String;)