Java

java.lang.System Class

jamie. 2020. 1. 7. 20:04
반응형

생성자

없음 (가장 큰 특징)

static 변수 3가지

static PrintStream err // 에러 및 오류를 출력할 때 사용
static InputStream in  // 입력값을 처리할 때 사용
static PrintStream out // 출력값을 처리할 때 사용

즉, 입/출력과 관련된 메서드의 경우 System Class를 보는 것이 아닌 PrintStream과 InputStream을 봐야함

System Class의 역할

  • System Property(속성) 값 관리

  • System Environment(환경) 값 조회

  • GC 수행 (절대 사용하지 말 것)

  • JVM 종료 (절대 사용하지 말 것)

  • 현재 시간 조회

  • 기타 (관리용 메서드) - 거의 사용되지 않음

System Property(속성) 값 관리

// key에 지정된 시스템 속성을 제거
static String clearProperty(String key)

// 현재 시스템 속성을 Properties 클래스 형태로 제공
static Properties getProperties()

// key에 지정된 문자열로 된 시스템 속성값(value)을 얻음
static String getProperty(String key)

// key에 지정된 문자열로된 시스템 속성값(value)을 얻고, 만약 없으면 def에 지정된 값을 리턴
static String getProperty(String key, String def)

// Properties 타입으로 넘겨주는 매개 변수에 있는 값들을 시스템 속성에 넣음
static void setProperties(Properties props)

// key에 지정된 시스템 속성의 값을 value로 대체
static String setProperty(String key, String value)

여기서 문제. Properties란 무엇인가?

  • java.util.Properties는 Hashtable을 상속받은 클래스
  • 자바 프로그램을 실행하면 무조건 Properties 객체가 생성되며, 그 값은 언제 어디든 같은 JVM 내에서는 꺼내서 사용할 수 있음

System Environment(환경) 값 조회

// 현재 시스템 환경에 대한 Map 형태의 리턴값을 받음
static Map<String, String> getenv()

// 지정한 name에 해당하는 값을 받음
static String getenv(String name)

System env의 경우 조회만 가능함(변경 불가)

GC 수행 - 사용하지 말 것!

// 가비지 컬렉터 실행
static void gc()

// GC 처리를 기다리는 모든 객체에 대하여 finalize() 메서드를 실행
static void runFinalization()

자바의 경우 GC를 JVM이 수행함

강제로 메서드 호출시 시스템은 모든 일을 중단하고, 해당 작업을 실행해야 함 → 매우 비효율적

JVM 종료 - 사용하지 말 것!

// 수행중인 JVM을 멈춤. status 0 → 정상 종료, 그 외 → 비정상 종료
static void exit(int status)

혼자 개발하는 미니 프로그램 해당 메서드를 호출하지 않아도 JVM이 멈추게 되어있음

(주의!) 웹 애플리케이션이나 안드로이드 앱 등에서 해당 메서드를 사용하면 해당 애플리케이션의 JVM이 멈추기 때문에 장애로 직결됨

현재 시간 조회

// UTC(Universal time) 기준 1970/01/01 00:00 ~ 지금까지의 차이를 출력

// 현재 시간을 밀리초(1/1000초) 단위로 리턴 - 주로 현재 시간 확인
static long currentTimeMillis()

// 현재 시간을 나노초(1/1,000,000,000초) 단위로 리턴 - 주로 시간 측정
static long nanoTime()

System.out

System.out vs System.err 변수

PrintStream(static)이라는 동일 클래스의 객체

정상적인 출력인지, 에러가 났을 때의 출력인지의 차이

PrintStream 클래스의 출력을 위한 주요 메서드

// 매개 변수에 있는 내용들을 출력
print()

/* 매개 변수에 있는 내용들을 출력 후 줄바꿈
 * 공란일 경우, 그냥 줄바꿈 println()
 */
println()

// JDK 5 ~ 포맷을 위한 메서드
format()
printf()

// System.out에서는 거의 안 쓰임
write()

print()와 println()

  • boolean, char, char[] int, long, double, float, Object, String을 매개변수로 받음

    • byte나 short 타입의 경우 int 타입으로 자동형변환 되므로 문제 없음

  • toString()으로 메서드 결과를 출력하는 것이 아닌 valueOf()로 결과를 받은 후 출력

    • null의 경우 null로 출력함

    • 객체를 출력할 떄는 toString()보다 valueOf() 메서드가 훨씬 안전함(NullPointException 방지)

public void jamieNull() {
    Object objNull = null;
    
    // null이 출력됨 - obj.valueOf()했기 때문
    System.out.println(obj);
    
    /* null is Null이 출력됨(JDK 5 ~ StringBuidler 연산이 되기 때문)
     * new StringBuilder().append(obj).append(" is Null")
     */
    System.out.println(obj + " is Null");
    
    /* 에러 발생 - NullPointerException
     * Exception in thread "main" java.lang.NullPointerException
     *   at ~~(생략)
     */
    System.out.println(obj.toString());
}

 

반응형