Finding
- OutOfMemoryError(OOME) : 프로그램을 잘못 작성하여 메모리가 부족한 경우 발생한다.
- StackOverflowError : 호출된 메소드의 깊이가 너무 깊어 스택이 가득 찬 경우 발생한다.
- Character 클래스를 제외하고는 parse타입 이름(), valueOf() 메소드를 제공한다.
- parse타입 이름() 메소드는 String 값을 인수로 받아 타입에 알맞은 숫자 기본 자료형으로 리턴한다.
- valueOf() 메소드는 String 값을 인수로 받아 타입에 알맞은 숫자 참조 자료형으로 리턴한다.
- 돈과 같이 중요한 연산을 할 때에는 정수형은 BigInteger, 소수형은 BigDecimal을 사용해야 정확하다.
- BigIneger와 BigDecimal을 java.lang.Numer 클래스의 상속을 받았으며, java.math 패키지에 선언되어 있다.
- 출력과 관련된 메소드는 System 클래스에서 찾으면 안 되고 PrintStream 클래스에서 찾아야 한다.
- PrintStream과 InputStream은 모두 java.io 패키지에 선언되어 있다.
- System 클래스는 시스템 정보를 확인하는 클래스이다.
- 시스템 속성 값 관리
- 시스템 환경(Environment) 값 조회
- GC 수행
- 현재 시간 조회
- 기타 관리용 메소드들
- Properties 클래스는 java.util 패키지에 속하며 Hashtable의 상속을 받은 클래스이다.
- 객체는 key-value로 묶여 있는 여러 개의 데이터를 제공한다.
- 자바 프로그램을 실행하면 Properties 객체가 생성되고 어디서 든 지 같은 JVM 내에서 꺼내서 사용할 수 있다.
- @Test void test_systemPropertiesCheck_javaHome(){ System.out.println(System.getenv("JAVA_HOME")); }
- System.gc() 라는 메소드를 호출하면 가비지 컬렉션을 명시적으로 처리하도록 할 수 있다.
- Object 클래스에 선언되어 있는 finalize() 메소드를 명시적으로 실행시키는 runFinalization() 메소드가 있다.
- currentTimeMillis() 메소드는 1970년 1월 1일 00:00을 기준으로 현재 시간을 밀리초 단위로 리턴한다. 밀리초는 1/1000 초다.
- nanoTime() 메소드는 시간의 차이를 측정하기 위해 사용된다. 1 나노초는 1/1,000,000,000 초이다.
@Test
void test_systemPropertiesCheck_javaVersion(){
System.out.println(System.getProperty("java.version"));
}
@Test
void test_numberMinMaxElapsedCheck(){
long startTime = System.currentTimeMillis();
long startNanoTime = System.nanoTime();
System.out.println("Milli second : " + (System.currentTimeMillis() - startTime));
System.out.println("Nano second : " + (System.nanoTime() - startNanoTime));
}
- 시간을 측정할 때는 currentTimeMillis() 말고 nanoTime()을 사용하는 게 좋다.
- print()와 println()은 byte, short 타입을 매개 변수로 받는 메서드가 없다. 하지만 int 타입을 매개변수로 받는 메서드에서 처리해준다.
@Test
void test_printStreamCheck(){
byte b = 127;
short s = 32767;
System.out.print(b);
System.out.println();
System.out.print(s);
System.out.println();
System.out.println(b);
System.out.println(s);
}
- null인 객체를 System.out.println() 메소드로 출력하면 null이 출력된다. 내부적으로 toString()을 사용하는 것이 아니라 valueOf()를 사용하기 때문이다.
- 객체를 출력할 때는 valueOf()를 사용하는 게 안전하다.
- null과 문자열을 합쳤는데 예외가 발생하지 않는 이유는 내부적으로 StringBuilder를 사용하기 때문이다.
@Test
void test_printNull(){
Object object = null;
System.out.println(object); // null
System.out.println(object + " is object's value"); // null is object's value //
new StringBuilder().append(obj).append(" is object's value)와 동일하게 실행된다.
}
@Test
void test\_toString(){
Object object = null;
System.out.println(object.toString()); // NullPointerException!
}
Feeling
- 책에는 println() 메소드가 static 메소드라고 나와 있는데 인텔리제이로 따라가 보니 그렇지 않았다. 오타인지 이유가 있는 건지 아직은 모르겠다.
Affirmation
- System 클래스를 다음에 학습할 때에는 조금 더 깊게 공부해야겠다.