본문 바로가기

RETROSPECT

[자바의신2 20장] 회고

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 클래스를 다음에 학습할 때에는 조금 더 깊게 공부해야겠다.