System 클래스
JDK 라이브러리에서 운영체제와의 상호작용에 필요한 기능을 모아놓은 System 클래스.
1. System 클래스의 대표적인 기능
표준 입출력 : 키보드 입력과 모니터 출력 기능
환경 변수 읽기 : 운영체제에 설정되어 있는 환경 변수를 읽어오는 기능
시스템 프로퍼티 읽기 : 프로그램의 환경 모드를 프로퍼티 형태로 읽고 쓰는 기능
현재 시각 측정 : 시스템 시계로부터 현재 시각을 읽어오는 기능
프로그램 실행 관련 기능 : 프로그램을 끝내는 기능과 가비지 컬렉터 관련 기능
보안 설정 기능 : 자바 프로그램의 보안 관리자 설정 기능
그 밖의 유용한 기능 : 배열을 효율적으로 복사하는 기능 등
ㅁ
System 클래스의 필드와 메소드들은 모두 정적 필드와 정적 메소드로 선언되어 있다.
때문에 System 클래스는 객체를 만들지 않고 사용한다.
-------------------------------------------------------------------------------------
2. 표준 입출력에 사용되는 필드 in, out
키보드로 입력받는 표준 입력과 모니터로 출력하는 표준 출력
1) 키보드로부터 입력을 받는 방법 System.in
in 필드는 바이트 스트림을 입력받는 클래스인 InputStream 클래스 타입으로 선언되어 있다. 때문에 in 필드는 바이트 스트림을 문자 스트림으로 바꾸는 InputSreamReader 클래스와 함께 사용해야 한다. 사용 방법은 in 필드를 생성자 파라미터로 삼아 InputSreamReader 객체를 생성해야 한다.
InputStreamReader reader = new InputStreamReader(System.in);
이렇게 생성된 InputSreamReader 객체는 read 메소드를 호출하면 키보드로부터의 입력을 문자단위로 읽어들일 수 있다. read 메소드는 파라미터 없이 호출하면 int 타입의 값을 리턴하는데 그 값은 하나의 문자를 담고 있으므로 char 타입으로 캐스트해서 사용해야 한다.
char ch = (char) reader.read();
read 메소드는 IOException을 발생시킬 수 있으므로 try-catch문을 사용해 처리해야 한다.
예제) 키보드로부터 문자를 1개씩 입력받는 프로그램
import java.io.*;
class SystemExample1 {
public static void main(String args[]) {
InputStreamReader reader = new InputStreamReader(System.in);
// System 클래스의 in 필드를 가지고 InputSreamReader 객체를 생성한다.
try {
while(true) {
char ch = (char) reader.read(); // 키보드로 한글자씩 입력
System.out.println("입력된 문자: " + ch); // 입력받은 문자 출력
if (ch == '.') // 마침표가 입력될 때까지 반복
break;
}
}
catch (IOException e) { // read 메소드가 발생하는 IOException 처리
System.out.println("키보드 입력 에러");
}
}
}
1줄로 처리한 경우
이렇게 생성된 BufferedReader 객체에 대해 readLine이라는 메소드를 호출하면 키보드로 입력받은 문자를 행 단위로 읽을 수 있게 된다.
String str = reader2.readLine();
// 입력 문자를 행 단위로 읽어들이는 메소드
예제2) 키보드로부터 문자를 1줄씩 입력받는 프로그램
import java.io.*;
class SystemExample2 {
public static void main(String args[]) {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
// System 클래스의 in 필드를 가지고 BufferedReader 객체를 생성
try {
String str = reader.readLine(); // 키보드로 한 줄씩 입력받음.
System.out.println("입력된 문자열: " + str);
}
catch (IOException e) { // readLine 메소드가 처리하는 IOException을 처리
System.out.println("키보드 입력 에러");
}
}
}
2) 모니터로 출력을 하는 방법 System.out
out 필드는 표준 출력을 하는데 사용하는 필드이다. System.out.println, System.out.print, System.out.printf 메소드에 있는 out이 바로 이 필드. out 필드는 System 클래스에 PrintStream 클래스 타입으로 선언되어 있으며 PrintStream 클래스의 println, print, printf를 사용할 수 있다.
System.out.println("Hello, Java");
System.out.print(12.5);
System.out.printf("%d", 27);
System.err.println("잘못된 포맷입니다."); // err 필드는 에러 메시지 출력용
예제) 표준 출력과 표준 에러 출력을 하는 프로그램
class SystemExample3 {
public static void main(String args[]) {
int arr1[] = { 77, 82, 99, 100, -27, 0, 42, -35, 60, 72 };
int arr2[] = { 7, 0, 3, 0, -1, 2, 11, 5, 0, 9 };
for (int cnt = 0; cnt < arr1.length; cnt++) {
try {
int result = arr1[cnt] / arr2[cnt];
System.out.printf("%d / %d = %d %n", arr1[cnt], arr2[cnt], result);
}
catch (java.lang.ArithmeticException e) { // 에러메시지에 대한 err 출력
System.err.println("잘못된 연산입니다. (index=" + cnt + ")");
}
}
}
}
이클립스에서는 Run Configurations를 실행 후, 실행하려는 Application을 선택, Common 탭을 클릭. File 앞 체크박스를 체크한 다음에 Workspace나 File System을 선택하여 로그파일 위치와 파일명을 지정한다. 아래에 Append를 체크하게 되면 실행할 때마다 콘솔의 내용을 append 하게 된다.
운영체제에는 운영체제에 속하는 환경 변수(environment variable)이라는 것이 있다. 윈도우즈의 경우 명령 프롬프트에서 SET 명령어로 환경 변수를 설정할 수 있다. 자바에서 읽을 때엔 System 클래스의 getenv 메소드를 사용한다.
예제) path 환경 변수의 값을 읽어오는 프로그램
class SystemExample4 {
public static void main(String args[]) {
String str = System.getenv("path"); // 환경변수 path의 값을 읽어온다.
System.out.println(str);
}
}
-------------------------------------------------------------------------------------
시스템 프로퍼티는 자바 프로그램의 실행 환경에 대한 여러가지 정보를 담는 역할을 하는 변수다. 시스템 프로퍼티는 JVM이 자바 프로그램을 시작할 때 운영체제로부터 읽어와서 자동으로 설정한다.
시스템 프로퍼티를 읽어오는 방법은
1) 설정되어 있는 모든 시스템 프로퍼티를 한꺼번에 읽어오는 방법
2) 특정 시스템 프로퍼티 하나만 읽어오는 방법
1) 모든 시스템 프로퍼티를 한꺼번에 읽어오는 System.getProperties
System 클래스의 getProperties라는 메소드를 이용하면 모든 시스템 프로퍼티를 한꺼번에 읽어올 수 있다. 이 메소드는 시스템 프로퍼티를 Properties라는 클래스 객체에 담아 리턴하므로 다음과 같이 호출한다.
Properties props = System.getProperties();
// 모든 시스템 프로퍼티를 읽어오는 메소드
여기서 사용한 Properties 클래스는 java.util 패키지에 속하므로 import java.util.Properties;를 해줘야 한다.
list라는 메소드를 쓰면 Properties 객체에 있는 모든 프로퍼티를 파라미터로 넘겨진 출력 스트림 객체를 통해 출력할 수 있다.
예제) 시스템 프로퍼티를 모두 가져와서 출력하는 프로그램
import java.util.Properties;
class SystemExample5 {
public static void main(String args[]) {
Properties props = System.getProperties(); // 시스템 프로퍼티를 모두 가져온다.
props.list(System.out); // 가져온 시스템 프로퍼티를 출력한다.
}
}
2) 특정 시스템 프로퍼티를 읽어오는 System.getProperty
System 클래스의 getPropery 메소드를 사용하면 특정 시스템 프로퍼티를 읽어올 수 있다. 이 메소드는 시스템 프로퍼티 이름을 파라미터로 받고, 그 시스템 프로퍼티의 값을 문자열로 리턴하는 메소드이다.
class SystemExample6 {
public static void main(String args[]) {
String str = System.getProperty("user.dir"); // 특정 시스템 프로퍼티 user.dir을 읽어온다.
System.out.println(str);
}
}
5. 자바 프로그램 실행에 관련된 메소드 exit, gc, runFinalization
1) 자바 프로그램을 종료하는 System.exit
자바 프로그램은 main 메소드에서 return 문을 만나면 끝난다. 하지만 다른 메소드에서 프로그램을 끝내야 할 경우 System.exit 메소드를 사용한다. exit 메소드에는 int 타입 파라미터를 넘겨야 하며 이 값은 보통은 사용되지 않으나 다른 프로그램에 의해 자바 프로그램이 호출되었을 때 사용될 수도 있다. 0은 정상 종료, 0이 아닌 값은 비정상 종료로 표시한다.
class SystemExample7 {
public static void main(String args[]) {
if (args.length != 2) {
System.out.println(
"Usage: java SystemExample7 <정수> <정수>");
System.exit(1); // 명령행 파라미터 수가 안맞으면 비정상 종료
}
try {
int num1 = Integer.parseInt(args[0]);
int num2 = Integer.parseInt(args[1]);
int sum = num1 + num2;
System.out.println("sum = " + sum);
System.exit(0); // 정상 종료
}
catch (NumberFormatException e) {
System.err.println("잘못된 숫자입니다.");
System.exit(-1); /익셉션이 발생하면 비정상 종료
}
}
}
2) 가비지 컬렉터를 빨리 실행시켜주는 System.gc
JVM에는 필요없는 객체들을 자동으로 삭제하는 가비지 컬렉터란 모듈이 있다. 새로운 객체를 생성할 메모리가 부족하거나 다른 할 일이 없으면 자동 작동하는데, 인위적으로 가비지 컬렉터가 더 빨리 일을 하도록 만들어준다. 이 메소드를 호출한다고 가비지 컬렉터가 즉시 실행된다는 보장은 없으나 가능한 빨리 실행되도록 스케줄이 조정된다.
1) ResourceUser 클래스
class ResourceUser {
ResourceUser() {
System.out.println("시스템 자원을 할당 받습니다.");
}
void use() {
System.out.println("시스템 자원을 사용합니다.");
}
protected void finalize() {
System.out.println("시스템 자원의 할당을 해제합니다.");
}
}
class SystemExample8 {
public static void main(String args[]) {
ResourceUser obj = new ResourceUser(); // ResourceUser 클래스의 객체 생성
obj.use(); // 객체 사용
obj = null; // 객체가 더이상 필요하지 않은 상태
System.gc(); // 가비지 컬렉터가 실행되도록 유도
}
}
3) finalize 메소드를 실행시키기 위한 System.runFinalization
가비지 컬렉터가 객체를 제거하기 전에 객체의 finalize 메소드를 호출하는데, 객체를 제거하는 것이 목적이 아니라 finalize 메소드를 실행하는 것만이 목적일 때 사용하는 메소드.
-------------------------------------------------------------------------------------
6. 배열을 일괄 복사하는 arraycopy 메소드
1) System.arraycopy 사용 방법
배열의 일부 또는 전부를 일괄 복사하기 위해서는 다음과 같이 반복문을 사용해야 했다.
for (int cnt = 0; cnt < 5; cnt++)
arr2[cnt + 20] = arr1[cnt + 10];
// arr1[10]부터 arr1[14]까지의 값을 arr2[20]부터 arr2[24]까지 복사하는 반복문
위의 반복문을 arraycopy로 바꾸면 다음과 같다.
System.arraycopy(arr1, 10, arr2, 20, 5);
arraycopy 메소드는 5개의 파라미터를 받는다.
1) 원본 배열, 2) 원본 항목의 시작 위치, 3) 복사 대상 배열, 4) 복사 대상 항목의 시작 위치, 5) 복사 항목의 수
예제) arraycopy 메소드의 사용 예를 보여주는 프로그램
class SystemExample9 {
public static void main(String args[]) {
char arr1[] = { '가','나','다','라','마','바','사','아','자','차','카','타','파','하' };
char arr2[] = { 'a','b','c','d','e','f','g','h','i','j','k' };
System.arraycopy(arr1, 10, arr2, 2, 3); // arr1의 10번 값부터를 arr2의 2번 값부터 3개를 바꾼다.
for (char ch : arr2)
System.out.print(ch + " ");
}
}
class SystemExample10 {
public static void main(String args[]) {
int arr[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
System.arraycopy(arr, 0, arr, 3, 5); // arr[0]~arr[4]의 값을 arr[3]~arr[7]로 복사
for (int num : arr)
System.out.println(num + " ");
}
}
0 1 2 0 1 2 3 4 8 9 10
-------------------------------------------------------------------------------------
7. 현재 시각을 읽어오는 메소드
1) System.currentTimeMillies 사용 방법
시스템 시계로부터 현재 시각을 읽어서 밀리세컨드 단위로 리턴하는 메소드
이 메소드는 Calendar, GregorianCalendar 클래스와는 달리 시스템 시각을 그대로 리턴하기 때문에 날짜와 시간 표시에는 사용되지 않고, 프로그램의 실행 시간 측정에 사용된다.
예제) currentTimeMillies 메소드의 사용예
class SystemExample11 {
public static void main(String args[]) {
long time1 = System.currentTimeMillis(); // 현재 시각 측정
double total = 0.0;
for (int cnt = 1; cnt < 1000000000; cnt += 2) // 원주율 π(파이)의 근사값을 계산하는 부분
if (cnt / 2 % 2 == 0)
total += 1.0 / cnt;
else
total -= 1.0 / cnt;
double pi = total * 4;
long time2 = System.currentTimeMillis(); // 현재 시각 측정
System.out.println("result = " + pi);
System.out.printf("계산에 %d ms가 소요되었습니다.",
time2 - time1);
}
}
'자바의 기초문법' 카테고리의 다른 글
ArrayList를 이용한 합집합, 교집합 메소드 (0) | 2015.12.22 |
---|---|
Exception 클래스 (0) | 2015.12.22 |
자료구조 클래스: ArrayList, LinkedList, HashMap, HashSet (0) | 2015.12.22 |
Wrapper 클래스: value, parse, valueOf, Boxing/Unboxing (0) | 2015.12.22 |
Object 클래스: toSting, equals, clone, finaize, getClass (1) | 2015.12.22 |