ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] 자바 기본 API - System Class
    CSE/Java 2016. 3. 28. 14:05

    자바 기본 API는 여러 절로 구성되어 있습니다.



    Intro

    Object Class

    Objects Class

    System Class

    Class Class

    String Class

    StringTokenizer, StringBuffer, StringBuilder Class

    Regular Expression & Pattern Class

    Arrays Class

    Wrapper Class

    Math, Random Class

    Date, Calendar Class

    Format Class

    java.time Package




    System Class

     자바 프로그램은 운영체제상에서 바로 실행되는 것이 아니라 JVM 위에서 실행됩니다. 따라서 운영체제의 모든 기능을 자바 코드로 직접 접근하기란 어렵습니다. 


     하지만 java.lang 패키지에 속하는 System 클래스를 이용하면 운영체제의 일부 기능을 이용할 수 있습니다. 즉, 프로그램 종료, 키보드로부터 입력, 메모리 정리, 현재 시간 읽기, 시스템 프로퍼티 읽기, 환경 변수 읽기 등이 가능합니다.


     프로그램 종료(exit())

      경우에 따라서는 JVM을 강제적으로 종료시킬 때도 있습니다. 이때 System 클래스의 exit() 메소드를 호출하면 됩니다. exit() 메소드는 현재 실행되고 있는 프로세스를 강제 종료하는 역할을 합니다.


      exit() 메소드는 int 파라미터를 지정하도록 되어 있는데, 이 값을 종료 상태값이라고 합니다. 일반적으로 정상 종료일 경우 0으로 지정하고 비정상 종료일 경우 0 이외의 다른 값을 줍니다.


    1
    2
    System.exit(0);
     
    cs



      어떤 값을 주더라도 종료가 되는데, 만약 특정 값이 입력되는 경우에만 종료하고 싶다면 자바의 보안 관리자를 직접 설정해서 종료 상태값을 확인하면 됩니다. 


      System.exit() 가 실행되면 보안 관리자의 checkExit() 메소드가 자동 호출되는데, 이 메소드에서 종료 상태값을 조사해서 특정 값이 입력되지 않으면 SecurityException을 발생시켜 System.exit()를 호출한 곳에서 예외 처리를 할 수 있도록 해줍니다. checkExit()가 정상적으로 실행되면 JVM은 종료가 됩니다. 


    1
    2
    3
    4
    5
    6
    7
    8
    System.setSecurityManager(new SecurityManager() {
        @Override
        public void checkExit(int status) {
            if (status != 5) {
                throw new SecurityException;
            }
        }
    });
    cs



      다음 예제는 종료 상태값이 7일 경우에만 프로세스를 종료합니다. for문은 10번 반복되는데, i가 7이 되면 System.exit(7)이 되어 출력을 멈추고 종료하게 됩니다. 이외의 값은 SecurityException을 발생시키고 예외 처리합니다.


     * ExitExample.java


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    package api;
    public class ExitExam {
        public static void main(String[] args) {
            System.setSecurityManager(new SecurityManager(){
                @Override
                public void checkExit(int status) {
                    if (status != 7) {
                        throw new SecurityException();
                    }
                }
            });
            
            for (int i = 0; i < 10; i++) {
                System.out.println(i);
                try {
                    System.exit(i);
                } catch (SecurityException e) {}
            }
        }
    }
     
     
     
    cs



     







     쓰레기 수집기 실행(gc())

      자바는 개발자가 메모리를 직접 코드로 관리하지 않고 JVM이 알아서 자동적으로 관리해줍니다. JVM은 메모리가 부족할 때와 CPU가 한가할 때 쓰레기 수집기(Garbage Collector)를 실행시켜 사용하지 않는 객체를 자동 제거합니다.


      쓰레기 수집기는 개발자가 직접 코드로 실행시킬 수 없고, JVM에게 가능한 빨리 실행해 달라고 요청하는 방법으로 이루어집니다. 바로 System.gc() 메소드를 통해서 말입니다. gc() 메소드가 호출되면 쓰레기 수집기가 바로 실행되는 것이 아니고, JVM은 빠른 시간 내에 실행시키기 위해 노력합니다.


    1
    System.gc();
    cs


      

      쓰레기가 생길 때마다 쓰레기 수집기가 동작한다면 정작 수행되어야 할 프로그램의 속도가 떨어지기 때문에 성능 면에서 좋지 않습니다. 


      다음은 쓰레기 수집기가 객체를 삭제하는지 확인하기 위해 객체 소멸자에서 학습한 소멸자를 이용했습니다. 쓰레기 수집기는 객체를 삭제하기 전에 마지막으로 객체의 소멸자를 실행합니다.


     

     * GcExam.java


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    package api;
     
     
    public class GcExam {
        public static void main(String[] args) {
            Employee emp;
            emp = new Employee(1);
            emp = null;
            emp = new Employee(20);
            emp = new Employee(300);
            
            System.out.print("최종적으로 참조하는 사원 번호:" + emp.eno);
            System.gc();
        }
    }
     
     
    class Employee {
        public int eno;
        
        public Employee(int eno) {
            this.eno = eno;
            System.out.println("Employee(" + eno + ")가 메모리에 생성됨");
        }
        
        public void finalize() {
            System.out.println("Employee(" + eno + ")가 메모리에서 제거됨");
        }
    }
     
     
     
    cs







     현재 시각 읽기(currentTimeMillis(), nanoTime())

      System 클래스의 currentTimeMillis() 메소드와 nanoTime() 메소드는 컴퓨터의 시계로부터 현재 시간을 읽어서 밀리세컨드 혹은 나노세컨드 단위의 long 값을 리턴합니다.


    1
    2
    long miTime = System.currentTimeMillis();
    long naTime = System.nanoTime();
    cs



      리턴값은 주로 프로그램의 실행 소요 시간 측정에 사용됩니다.


      다음 예제는 for문을 사용해서 1부터 1000000까지의 합을 구하는데 걸린 시간을 출력합니다.


     * SystemTimeExam.java


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    package api;
     
     
    public class SystemTimeExam {
        public static void main(String[] args) {
            long time1 = System.nanoTime();    // 시작 시간 읽기
            
            int sum = 0;
            for (int i = 1; i <= 1000000; i++) {
                sum += i;
            }
            
            long time2 = System.nanoTime();
            
            System.out.println("1~1000000까지의 합: " + sum);
            System.out.println("계산 시간 " + (time2 - time1) + " 나노초 소요");
        }
    }
     
     
     
    cs







     시스템 프로퍼티 읽기(getProperty())

      시스템 프로퍼티는 JVM이 시작할 때 자동 설정되는 시스템의 속성값을 말합니다. 예를 들어 운영체제의 종류 및 자바 프로그램을 실행시킨 사용자 아이디, JVM 버전, 운영체제에서 사용되는 파일 경로 구분자 등이 여기에 속합니다. 시스템 프로퍼티는 키(key)와 값(value)으로 구성되어 있습니다. 


      시스템 프로퍼티를 읽어오기 위해 System.getProperty() 메소드를 이용하면 됩니다. 이 메소드는 시스템 프로퍼티의 키 이름을 파라미터로 받고, 해당 키에 대한 값을 문자열로 리턴합니다.


    1
    String value = System.getProperty(String key);
    cs



      다음 예제는 운영체제 이름, 사용자 이름, 사용자 홈 디렉토리를 알아내고 출력합니다. 그리고 모든 시스템 프로퍼티를 키와 값으로 출력해봤습니다.


     * GetPropertyExam.java


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    package api;
     
     
    import java.util.Properties;
    import java.util.Set;
     
    public class GetPropertyExam {
        public static void main(String[] args) {
            String osName = System.getProperty("os.name");
            String userName = System.getProperty("user.name");
            String userHome = System.getProperty("user.home");
            
            System.out.println("운영체제 이름:" + osName);
            System.out.println("사용자 이름:" + userName);
            System.out.println("사용자 홈디렉토리:" + userHome);
            
            System.out.println("---------------------");
            System.out.println("[Key] Value");
            System.out.println("---------------------");
            
            Properties props = System.getProperties();
            Set<Object> keys = props.keySet();
            
            for (Object objKey : keys) {
                String key = (String) objKey;
                String value = System.getProperty(key);
                System.out.println("[" + key + "]" + value);
            }
        }
    }
     
     
     
    cs









    end

     


     * 이 포스트은 서적 '이것이 자바다' 를 참고하여 작성한 포스트입니다.


    댓글

Designed by Tistory.