콘텐츠로 이동

System

System Class

  • JVM과 운영체제 수준의 시스템 기능을 접근하기 위한 유틸리티 클래스
  • java.lang 패키지에 포함 → import 없이 사용 가능
  • 모든 멤버 static, 생성자 private → 인스턴스 생성 불가

왜 사용하는가?

  • JVM 실행 환경과 직접 연결된 기능(입출력, 시간, 환경변수, 종료 등) 접근
  • 배열 복사를 네이티브 레벨로 빠르게 수행
  • 성능 측정, 환경 설정 값 조회 등 시스템 수준 작업 처리

특이점

  • System.arraycopy()는 native 메서드로 JVM 내부 최적화 → 일반 for문보다 빠름
  • System.exit()finally도 실행 안 될 수 있어 서버 환경에서는 사용 지양

표준 입출력 스트림

스트림 설명
System.in 표준 입력 스트림 (키보드 입력)
System.out 표준 출력 스트림 (콘솔 출력)
System.err 표준 오류 출력
System.out.println("출력");
System.err.println("오류 출력"); // 빨간색으로 출력

시간 측정

메서드 설명 용도
System.currentTimeMillis() 밀리초(ms) 단위 현재 시간 날짜/시간 계산
System.nanoTime() 나노초(ns) 단위 시간 정밀한 성능 측정
long start = System.nanoTime();
// 측정할 코드
long end = System.nanoTime();
System.out.println("경과 시간: " + (end - start) + "ns");

환경 변수 조회

  • 운영체제 환경 변수 접근 (읽기 전용)
    String path = System.getenv("PATH");
    String dbHost = System.getenv("DB_HOST"); // 실무에서 민감 정보 관리
    

배열 고속 복사

System.arraycopy(src, srcPos, dest, destPos, length)
int[] a = {1, 2, 3};
int[] b = new int[3];
System.arraycopy(a, 0, b, 0, 3); // a 전체를 b로 복사
- native 메서드, JVM 내부 최적화 - ArrayList 내부에서도 사용됨

시스템 속성 (System Properties)

  • JVM 실행 환경의 설정 정보 (key-value)
    System.getProperty("java.version"); // JVM 버전
    System.getProperty("user.dir");     // 현재 실행 디렉토리
    System.getProperty("os.name");      // 운영체제
    System.getProperty("file.separator"); // 파일 구분자
    

프로그램 종료

System.exit(0);  // 정상 종료
System.exit(1);  // 비정상 종료
- JVM 즉시 종료 → finally가 실행되지 않을 수 있음 - Spring / 서버 환경에서는 사용 지양

어떻게 사용하는가?

// 성능 측정
long start = System.nanoTime();
performTask();
System.out.println((System.nanoTime() - start) + "ns");

// 배열 복사
int[] src = {1, 2, 3, 4, 5};
int[] dest = new int[src.length];
System.arraycopy(src, 0, dest, 0, src.length);

// 환경 변수
String apiKey = System.getenv("API_KEY");

어떨 때 많이 쓰는가?

상황 사용 메서드
성능 측정, 벤치마크 nanoTime()
타임스탬프, 로그 시간 currentTimeMillis()
배열 대량 복사 arraycopy()
환경 설정 값 읽기 getenv(), getProperty()
콘솔 출력/디버깅 out.println(), err.println()