수업내용/Java

[2022.09.28.수] System 클래스

주니어주니 2022. 9. 29. 00:02

 

 

1. System 클래스

 

  • 자바 애플리케이션이 실행되는 시스템에 대한 정보 및 시스템과 연결된 입출력 객체를 제공
  • java.lang 패키지에 속해있다.
  • System 클래스의 모든 필드와 모든 메소드는 정적필드, 정적메소드다. (객체 생성할 필요 X ) 
  • 주요 API
    • 변수)
      static InputStream System.in;       
      - 표준 입력장치(키보드)와 연결된 객체를 제공

      static PrintStream System.out;     
      - 표준 출력장치(모니터 or 콘솔)와 연결된 객체를 제공

      static PrintStream System.err;       
      - 표준 에러출력장치(모니터 or 콘솔)와 연결된 객체를 제공 

    • 메소드)
      static String getenv(String name) 
      - 지정된 이름의 컴퓨터의 환경변수 값을 반환

      static String getProperty(String name)
      - 지정된 이름의 컴퓨터의 속성값을 반환

      static long currentTimeMillis()
      - 컴퓨터의 현재 날짜와 시간정보를 유닉스타임으로 반환
      - 유닉스타임 : 1970년 1월 1일 0시 0분 0초부터 지금 이순간까지의 경과시간을 1/1000초 단위로 환산한 값

      static String lineSeparator()
      - 이 시스템의 줄바꿈문자를 반환 

      static void exit(int status) 
      - 현재 실행중인 자바가상머신을 종료시킴

      static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
      - 배열을 다른 배열로 복사
      - 매개변수
        src                      : 원본배열
        srcPosition         : 원본배열에서 복사 시작위치 (대부분 0)
        dest                    : 대상배열 
        destPosition       : 대상배열에 값 추가 위치 (대부분 0)
        length                 : 복사할 개수 (대부분 원본배열의 길이와 동일한 값) 

 

 

1-1. static String getenv(String name), static String getProperty(String name) 

  • 지정된 이름의 컴퓨터의 환경변수 값, 속성값을 반환
public class SystemApp {

	public static void main(String[] args) {
		
		// 시스템의 환경변수값 조회하기
		String value1 = System.getenv("path");
		System.out.println("시스템 패스정보: "+value1);
		String value2 = System.getenv("username");
		System.out.println("시스템 사용자 이름: "+value2);
		
		// 시스템의 모든 환경 변수값 출력해보기 (따라치지x)
	    	Map<String, String> envMap =  System.getenv();
	  	Set<Map.Entry<String, String>> entries = envMap.entrySet();
	    	for (Map.Entry<String, String> entry : entries) {
	  	      System.out.println("[" + entry.getKey() + "] " + entry.getValue());
	   	 }
	    
	   	 // 시스템의 속성값 조회
	  	 String value3 = System.getProperty("user.home");
	 	 System.out.println("사용자의 홈 디렉토리: "+ value3);
	 	 String value4 = System.getProperty("user.dir");
	  	 System.out.println("프로젝트 디렉토리: "+ value4);
	 	 System.out.println();
         	 // 시스템의 줄바꿈 문자를 반환한다.
  		 String value2 = System.getProperty("line.separator");
 		 // 시스템의 디렉토리 경로 구분문자를 반환한다.
 		 String value3 = System.getProperty("file.separator");
	    
	    	// 시스템의 모든 속성값 조회
	     	System.out.println("### 시스템의 속성값 출력하기");
	     	Properties properties = System.getProperties();
	     	Set<Object> keys = properties.keySet();
	     	for (Object obj : keys) {
	         	String key = (String) obj;
	         	String value = properties.getProperty(key);
	        	System.out.println("["+key+"] " + value);
	      	}
	}
}

 

시스템 패스정보: C:/app/eclipse/plugins/org.eclipse.justj.openjdk.hotspot.jre.full.win32.x86_64_17.0.2.v20220201-1208/jre/bin/server;C:/app/eclipse/plugins/org.eclipse.justj.openjdk.hotspot.jre.full.win32.x86_64_17.0.2.v20220201-1208/jre/bin;C:\jdk1.8\bin;C:\Program Files\Common Files\Oracle\Java\javapath;C:\Program Files (x86)\Common Files\Intel\Shared Libraries\redist\intel64\compiler;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\WINDOWS\System32\OpenSSH\;C:\Program Files (x86)\ePapyrus\Papyrus-PlugIn-ntas;C:\Program Files (x86)\ePapyrus\Papyrus-PlugIn-ntas\Addins;C:\Users\wnnns\AppData\Local\Programs\Python\Python38\Scripts\;C:\Users\wnnns\AppData\Local\Programs\Python\Python38\;C:\Users\wnnns\AppData\Local\Microsoft\WindowsApps;C:\Program Files\JetBrains\PyCharm Community Edition 2021.3.1\bin;;C:\Program Files\Java\jdk-18\bin;;C:\WINDOWS\System32;
시스템 사용자 이름: wnnns

### 모든 환경변수값
[configsetroot] C:\WINDOWS\ConfigSetRoot
[USERDOMAIN_ROAMINGPROFILE] DESKTOP-D7L0304
[LOCALAPPDATA] C:\Users\wnnns\AppData\Local 
...

사용자의 홈 디렉토리: C:\Users\wnnns
프로젝트 디렉토리: C:\app\java-workspace\api

### 시스템의 속성값 출력하기
[java.specification.version] 17
...

 

 

 

1-2.static long currentTimeMillis()

  • 컴퓨터의 현재 날짜와 시간정보를 유닉스타임으로 반환
    유닉스타임 : 1970년 1월 1일 0시 0분 0초부터 지금 이순간까지의 경과시간을 1/1000초 단위로 환산한 값
import java.util.Date;

public class SystemApp2 {

	public static void main(String[] args) {
		
		long unixTime = System.currentTimeMillis();	//시스템은 객체생성없이 바로 
		System.out.println("유닉스타임: "+unixTime);
		
		// Date객체를 생성하면 현재 시점의 날짜, 시간 정보가 포함된 Date객체를 획득
		Date now = new Date();
		System.out.println(now);
		long nowunixTime = now.getTime();		//Date객체를 만든 후 시간메소드
		System.out.println("유닉스타임: "+nowunixTime);
		
		// Date객체를 생성할 때 생성자의 매개변수 인자값으로 유닉스타임을 지정하면
		// 해당 시점의 날짜와 시간 정보가 포함된 Date객체를 획득
		Date date = new Date(0); 			// 유닉스타임=0일때
		System.out.println(date);
	}
}

 

유닉스타임: 1664332428275
Wed Sep 28 11:33:48 KST 2022
유닉스타임: 1664332428280
Thu Jan 01 09:00:00 KST 1970

 

 

 

1-3. static void arraycopy(Object src, int srcPos,Object dest, int destPos, int length)

  • 배열을 다른 배열로 복사
    매개변수
     - src                      : 원본배열
     - srcPosition         : 원본배열에서 복사 시작위치 (대부분 0)
     - dest                    : 대상배열 
     - destPosition       : 대상배열에 값 추가 위치 (대부분 0)
     - length                 : 복사할 개수 (대부분 원본배열의 길이와 동일한 값) 

 

- 배열복사하기 

import java.util.Arrays;

public class SystemApp3 {

	public static void main(String[] args) {
		int[] src = {10, 20, 30, 40, 50};
		int[] dest = new int[10];
		
		// src 배열의 값을 dest 배열에 복사하기
		System.arraycopy(src, 0, dest, 0, src.length);
		
		// src배열과 dest 배열에 저장된 값을 출력하기
		System.out.println(Arrays.toString(src));
		System.out.println(Arrays.toString(dest));
	}
}

 

[10, 20, 30, 40, 50]
[10, 20, 30, 40, 50, 0, 0, 0, 0, 0]

 

 

* 배열 복사하는 이유

: 배열은 크기 불변이기 때문에, 원래 배열보다 값을 더 넣고싶을때, 더 큰 배열을 만들어서 복사 

 

 

 

-점수 입력받아서, 일정 개수를 넘어가면 복사해서 그만큼 증가시키기

import java.util.Arrays;

import utils.KeyboardReader;

public class SystemApp4 {
	
	public static void main(String[] args) {
		KeyboardReader keyboard = new KeyboardReader();
		
		//  입력된 점수를 저장하는 배열
		int[] scores = new int[5];		
		// 현재 저장위치
		int position = 0;		
		// 현재 배열의 최대 크기
		int limit = scores.length;		
		// 한번에 증가시킬 배열의 크기
		int size = 5;
		
		while(true) { 
			System.out.println("------------------------------------------------");
			System.out.println("1.입력  2.조회  3.평균  0.종료");
			System.out.println("------------------------------------------------");
			
			System.out.print("메뉴 선택: ");
			int menuNo = keyboard.getInt();
			System.out.println();
			
			if(menuNo == 1) {
				System.out.println("<< 점수 입력 >>");
				System.out.print("점수: ");
				int score = keyboard.getInt();
				
				scores[position] = score;
				position++;
				
				// 배열의 크기를 가변적으로 늘린다.
				if(position == limit) {
					limit += size;					// scores.length + size 
					int[] dest = new int[limit]; 			// limint만큼 더 커진 배열을 새로 만들고
					System.arraycopy(scores, 0, dest, 0, scores.length);
					scores = dest;					// 배열을 덮어쓰기 
				}
				
			} else if(menuNo == 2) {
				System.out.println("<< 점수 조회 >>");
				System.out.println(Arrays.toString(scores));
				
			} else if(menuNo == 3) {		// position은 입력한 값보다 1칸 더 가있지만, 인덱스가 0부터 시작하기떄문에 입력한개수=positon
				System.out.println("<< 평균 점수 조회 >>");
				
				// 총점과 평균 계산하기
				int total = 0;
				for(int score : scores) {
					total += score;
				}
				int average = total/position;
				System.out.println("평균점수: "+average);
				
			} else if(menuNo == 0) {
				System.out.println("### 프로그램을 종료합니다.");
				System.exit(0);
			}
			System.out.println();
			System.out.println();
		}
	}

}

 

------------------------------------------------
1.입력  2.조회  3.평균  0.종료
------------------------------------------------
메뉴 선택: 1

<< 점수 입력 >>
점수: 80


------------------------------------------------
1.입력  2.조회  3.평균  0.종료
------------------------------------------------
메뉴 선택: 2

<< 점수 조회 >>
[80, 90, 0, 100, 0]


------------------------------------------------
1.입력  2.조회  3.평균  0.종료
------------------------------------------------
메뉴 선택: 3

<< 평균 점수 조회 >>
평균점수: 67


------------------------------------------------
1.입력  2.조회  3.평균  0.종료
------------------------------------------------
메뉴 선택: 0

### 프로그램을 종료합니다.

 

 

** position == limit 일 때 증가시키는 이유

position = 0부터 시작하기 때문에, 

position = 0일 때, 값 1번째 입력 -> position = 1 로 넘어감

값 2번째 입력 -> position = 2 

값 3번째 입력 -> position = 3

입력한 값의 개수 = position

 

 

 

 

2. Wrapper 클래스 

 

2-1. Wrapper 클래스 

  • 기본자료형 값을 담는(감싸고있는 Wrapping) 객체를 생성하는 클래스
    ( 자바의 자료구조에는 객체만 담을 수 있고, 기본자료형을 담을 수 없어 그래서 이런 클래스가 생김 ) 
  •  각각의 기본자료형마다 대응되는 Wrapper 클래스가 존재
기본 자료형 Wrapper 클래스
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Charcter
boolean Boolean
  • Wrapper 객체에 기본자료형값 담기 (원래 이렇게 담음) 
    • Integer x = new Integer(10);
    • Long x = new Long(10000000L);
    • Double x = new Double(3.14);
    • Boolean x = new Boolean(true):

 

2-2. AutoBoxing (오토박싱)과 AutoUnBoxing (오토언박싱) 

 

 

 

1) AutoBoxing (오토박싱) 

  • 기본자료형 값을 Wrapper 객체에 담기
    • 기본자료형 값을 Wrapper 객체타입의 참조변수에 대입
    • 기본자료형값을 포함하는 Wrapper객체가 생성되고 그 객체의 주소값이 참조변수에 대입
    • Integer a = 10; 이렇게만 적어도 자동으로 객체가 생성되고 그 안에 값이 저장됨
    • Integer a = new Integer(10); 으로 자동인식해서 반영 
    • 참조변수 a에는 Wrapper 객체의 주소값이 들어있음! 
  • 예시)
    • Integer x = 10;                     // Integer x = new Integer(10);
      Long x = 10000000000L;    // Long x = new Long(10000000L);
      Double x = 3.14;                  // Double x = new Double(3.14);
      Boolean x = true;                 // Boolean x = new Boolean(true):
  Integer instance = new Integer(10);  	  // 박싱
  
  Integer instance = 10;  		  // 오토박싱 
  // Integer instance = new Integer(10);  // 실제로 실행되는 코드

 

 

2) AutoUnBoxing (오토언박싱) 

  • Wrapper 객체에서 기본자료형 값을 꺼내서, 기본자료형 타입의 변수에 대입하기
    • 원래 Wrapper 객체의 주소값을 기본자료형의 변수에 대입하면, Wrapper객체의 xxxValue()메소드를 실행하여 객체에서 기본자료형 값을 꺼내서 대입
    • 기본자료형 타입의 변수에 Wrapper객체의 주소값이 대입되지 않고, 자동으로 Wrapper객체에 포함된 기본자료형값이 변수에 대입
    • int x = a; 이렇게 적으면, 원래는 a의 주소값이 x에 들어가야되는데, 기본자료형타입이라서 주소값을 넣을수가 없잖아 -> a가 바라보고있는 객체의 속성에 있는 값이 대입됨 
  • 예시)
    • Integer x = new Integer(10);         // 박싱.
      int y = x;                                       // 오토언박싱. int y = x.intValue(); (x의 intValue()에서 획득한 값을 y에 대입) 

      Double x = new Double(3.14);      // 박싱. 
      double y = x;                               // 오토언박싱. double y = x.doubleValue();
  Integer instance = new Integer(10);   // 박싱
  int value = instance.intValue();      // 언박싱

  int value = instance; 		// 오토 언박싱
  // int value = instance.intValue();   // 실제로 실행되는 코드

 

 

 

* int x = 10; 
  x의 값은 10이다

* Integer x = 10; 
  x의 값은 Integer 객체의 주소값이다.  Integer객체가 10을 가지고 있다.

* Object x = 10; 
  정수 10을 가지고 있는 Integer객체가 생성되고,
  x가 Object 타입이기 때문에 클래스 형변환에 의해 Integer객체의 부모객체인 Object 객체의 주소값이 x에 대입
  x의 값은 Object 객체의 주소값이다. 

(왼쪽이 객체면 오른쪽이 무조건 Integer 객체가 생성됨

* String x = 10; 
  컴파일 오류.
  x의 타입이 String인데, String은 Integer객체의 부모가 아니다. 

==> Integer의 부모가 Number, 그 부모가 Object 

 

public class WrapperApp {

	public static void main(String[] args) {
		
		// 오토박싱이 지원되기 때문에 기본자료형을 대입하면
		// 1. 자동으로 Wrapper객체가 생성
		// 2. 생성된 Wrapper객체의 주소값이 참조변수에 대입된다
		// abc는 객체의 주소값을 담기 때문에 -> 문자열 출력(toString의 반환값)
		// xyz는 기본자료형 값을 담기 때문에 -> 값 출력 
		Integer a = 10;		// a는 Integer객체의 주소값을 가지고 있다.
		Long b = 1000000000L;	// b는 Long객체의 주소값을 가지고 있다.
		Double c = 3.14;	// c는 Double객체의 주소값을 가지고 있다.
		
		System.out.println(a);	// System.out.println(a.toString()); "10"출력 (문자열)
		System.out.println(b);	// System.out.println(a.toString()); "1000000000"출력 (문자열)
		System.out.println(c);	// System.out.println(a.toString()); "3.14"출력 (문자열)
			
		int x = a;		// x는 a가 참조하는 Integer객체의 정수값 10을 가지고 있다. 
		long y = b;		// y는 b가 참조하는 Long객체의 정수값 10000000000을 가지고 있다. 
		double z = c; 		// z는 c가 참조하는 Double객체의 실수값 3.14를 가지고 있다.
		
		System.out.println(x);	// 10 (숫자)
		System.out.println(y);	// 1000000000 (숫자)
		System.out.println(z);	// 3.14 (숫자) 
		
		Integer k = 10; 
		Integer i = 100;
		Double j = 3.0;
		
		// k, i, j는 객체의 주소값을 가지고 있지만, 
		// 사칙연산에 참여하게 되면, 주소값이 아닌 그 객체가 가지고 있는 기본자료형값을 사칙연산에 사용 
		System.out.println(k + i + j);
		
	}
}

 

10
1000000000
3.14

10
1000000000
3.14

113.0

 

 

 

 

 

2-3. Wrapper 클래스의 주요 API

  • Integer
    • 필드
        - static final int MAX_VALUE                 // int타입의 최대값
        - static final int MIN_VALUE                  // int타입의 최소값
    •  메소드 (정적메소드)
        - static int Integer.parsInt(String text)    // 문자열을 정수로 반환
                                                                           // "1234" -> 1234 
                                                                           // "3.14" -> 오류 
        - static String toBinaryString(int value)      // 정수를 2진수의 문자열로 반환
        - static String toHexString(int value)          // 정수를 16진수의 문자열로 반환
        - static String toOctalString(int value)        // 정수를 8진수의 문자열로 반환

  • Long
    • 필드
        - static final long MAX_VALUE                // long타입의 최대값
        - static final long MIN_VALUE                 // long타입의 최소값
    • 메소드 (정적메소드)
        - static long Long.parseLong(String text)    // 문자열을 정수로 반환
                                                                                 // "1000000000" -> 1000000000
                                                                                 // "3.14" -> 오류 
        - static String toBinaryString(long value)         // 정수를 2진수의 문자열로 반환
        - static String toHexString(long value)             // 정수를 16진수의 문자열로 반환
        - static String toOctalString(long value)           // 정수를 8진수의 문자열로 반환
  • Double
    • 필드
        - static final long MAX_VALUE                    // double타입의 양수 최대값
        - static final long MIN_VALUE                     // double타입의 양수 최소값
    • 메소드 (정적메소드)
        - static double Double.parseDouble(String text)   // 문자열을 실수로 반환
                                                                                           // "123" -> 123.0

 

* 문자열을 다른 값으로 바꾸고 싶을 때 -> parse

문자열을 정수로     : Integer.parseInt(문자열) -> 정수값
                                 Long.parseLong(문자열) -> 정수값
문자열을 실수로     : Double.parseDouble(문자열) -> 실수값
문자열을 불린으로 : Boolean.parseBoolean("true") -> true
                                 Boolean.parseBoolean("false") -> false
문자열을 날짜로     : SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                                 sdf.parse("2022-09-28") -> Date 객체 

 

 

 

public class WrapperApp2 {
	
	public static void main(String[] args) {
		
		String text1 = "1234";	// text의 값이 공백, 숫자가 아닌 문자, 소수점이 포함되어 있으면 정수로 변환할 때 오류 발생
		String text2 = "33";
		int value1 = Integer.parseInt(text1);
		int value2 = Integer.parseInt(text2);
		
		System.out.println(value1*value2);
	}

}

 

40722