티스토리 뷰

Java/Class

[java.lang] System

MinChyang 2018. 1. 5. 18:10

System Class



◎ Define


- Java Program은 항상 JVM(Java Virtual Machine, 바이트코드를 실행할 수 있는 자바 가상 머신) 위에서 실행된다. 즉, Java Code로 운영체제의 모든 기능에 접근하기 어렵다는 뜻이다. 하지만 System Class를 이용하면 운영체제의 일부 기능을 이용할 수 있다.

(입력, 출력, GC(메모리정리), 현재 시간 읽기, 시스템 프로퍼티 읽기, 환경 변수 읽기 등)



◎ JVM Structure



◎ System Class Field



Field

Brief description

static PrintStream err

에러 및 오류를 출력할 때 사용

static InputStream in

입력 값을 처리할 때 사용

 static PrintStream out

 출력 값을 처리할 때 사용



◎ System Class Method


Method

Brief description

static long currentTimeMillis()

현재 시간 Millisecond로 반환

static void exit(int status)

현재 실행 중인 JVM 종료

static void gc()

 GC(Garbage Collector) 실행

static String getProperty(String key)

전달된 key에 의해 나타나는 시스템의 Property 반환

 static String getenv(String name)

전달된 환경 변수 이름에 맞는 값 반환



◎ Explanation


① Wrapper Class에 대해서 좀 더 면밀히 알아보자.


참조)


Why? 왜 Wrapper Class 라는 것을 사용하는 것일까?


이와 같은 궁금증을 가지는 사람들이 많을 것이며, 그에 대한 답 또한 다양 할 것이다.


최대한 좁혀 보자.


1. 객체로 다루어야 될 상황


2. OOP 은닉화


3. null



1. 객체로 다루어야 될 상황


위에 나열된 이유 세 가지 중 가장 큰 비중을 차지할 것으로 보인다.


프로그래밍을 하다 보면 아주 무수히 많은 상황들에 직면하게 된다.


그 많은 상황들은 꼬리에 꼬리를 물고 늘어져 있을 것이며,


"객체로 다루어야 될 상황" 이라는 상황에 물린 꼬리들도 무수히 많을 것이다.


하지만 이 상황이 Wrapping을 하는 이유 중 가장 많고 큰 비중을 차지 할 것으로 본다.


말 그대로다. 프로그래밍이라는 게 더 직관적으로 더 깊숙히 추상적으로 파고 들어가면


정말 한도 끝도 없을 것이다.


그러므로 여기서는 간단하게 정리만 하겠다.


- null 이 필요한 상황


- 객체간 비교가 필요한 상황


- 객체만이 요구 될 때(ex : Generic)



2. OOP 은닉화


OOP? 어쩌면 생소하게 들릴 수도 있다.


하지만 우리가 JAVA라는 것을 시작 할 때 1000명 중 999명은 들었을 말이고


JAVA의 가장 큰 강점 중 하나이다.


바로 "객체 지향 프로그래밍 (Object-Oriented Programming)" 이다.


이 객체 지향 프로그래밍에서 강조하는 것 중 하나가 "은닉화(Hiding)" 즉, 숨길 것은 최대한 숨기자라는 말이다.


여기서 말하는 은닉이란.. 은닉화를 왜 하는 것인가?


물론 모든 개념을 다 알고 있다는 것과 일부 개념만 알고 있다는 것은 아주 큰 차이가 있을 것이다.


허나 인간은 완벽 할 수 없으며, 인간의 두뇌에도 용량이라는 한계가 존재한다.


용량에 과부하가 걸리는 일이 없도록, 수 많은 내용 중에서 가장 중요한 것들만 효율적으로 담자는 얘기다.


그럼 본론으로 돌아가서 그에 대한 답 역시 대표적인 것만 간단하게 서술하겠다.


- 외부에 노출하지 않아도 될 정보들을 숨기기 위해


- 외부에서 접근하는 것을 막아 잘못된 수정이 일어나는 것을 막기 위해



3. null


어떻게 보면 1번에 포함해도 될 것 같은 내용이지만 따로 설명하겠다.


여기서 null이 왜 중요한지 알아보자.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class WrapperClass {
    public static void main(String[] args) {
        
        String str1 = null;
        String str2 = "";
 
        System.out.println("str1 : " + System.identityHashCode(str1));
        System.out.println("str2 : " + System.identityHashCode(str2));
 
        // result
        // str1 : 0
        // str2 : 366712642
 
    }
}




변수에 값을 넣는다(변수의 초기화)의 의미는 곧 "메모리에 공간을 차지한다"는 의미이며,


null은 "메모리 공간을 차지하지 않는다"는 의미이다.


참조형(Reference Type) 변수 str1은 선언만 되었을 뿐 "null" 상태이기 때문에


따로 메모리 공간을 차지하지 않아 참조형(Reference Type) 변수임에도 해당 변수의


주소(메모리에 저장된 값의 주소)값이 나타나지 않는 것이다.


메모리 공간을 많이 차지 한다는 것은 그만큼 프로그램이 느려진다는 뜻이며,

필요한 곳에 null 을 사용한다면 메모리 공간을 좀 더 효율적으로 사용할 수 있을 것이다.


허나 ""로 빈 값을 가지고 있는 참조형(Reference Type) 변수 str2는 주소 값이 출력된다.


여기서 알 수 있는 것은 빈 값인 ""(blank, 쌍따옴표(double quotation)) null은 엄연히 다르게 동작 된다는 것이다.



② Wrapper Class 박싱(Boxing)과 언박싱(Unboxing)에 대해서 알아보자.



◎ Wrapper Class Method


 Method

Brief description

 boolean booleanValue()

해당 객체의 값을 boolean으로 변환 후 반환

byte byteValue()

해당 객체의 값을 byte로 변환 후 반환

 double doubleValue()

해당 객체의 값을 double로 변환 후 반환

float floatValue()

해당 객체의 값을 float으로 변환 후 반환

int intValue()

해당 객체의 값을 int로 변환 후 반환

long longValue()

해당 객체의 값을 long으로 변환 후 반환

short shortValue()

해당 객체의 값을 short으로 변환 후 반환

 Object Method

Object Method



1. Boxing : 기본형(Primitive Type)을 Wrapper Class의 객체, 참조형(Reference Type)으로 변환(포장)하는 과정


2. Unboxing : Wrapper Class의 객체, 참조형(Reference Type)을 기본형(Primitive Type)으로 변환하는 과정



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
public class WrapperClass {
    public static void main(String[] args) {
        
        // Boxing
 
        int int_num = 1;
        Integer w_num = new Integer(int_num);
 
        double double_num = 1.0;
        Double w_num2 = new Double(double_num);
 
        char character_cha = 'm';
        Character w_cha = new Character(character_cha);
 
        boolean boolean_bool = true;
        Boolean w_bool = new Boolean(boolean_bool);
 
        // Unboxing
 
        int num = w_num.intValue();
 
        double num2 = w_num2.doubleValue();
 
        char cha = w_cha.charValue();
 
        boolean bool = w_bool.booleanValue();
        
 
    }
}




JDK 1.5 버전 이후부터 자동으로 Boxing과 Unboxing을 처리하도록 AutoBoxing과 AutoUnBoxing이 제공된다.


AutoBoxing & AutoUnBoxing



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
public class WrapperClass {
    public static void main(String[] args) {
        
        // AutoBoxing
 
        int int_num = 1;
        Integer w_num = int_num;
 
        double double_num = 1.0;
        Double w_num2 = double_num;
 
        char character_cha = 'm';
        Character w_cha = character_cha;
 
        boolean boolean_bool = true;
        Boolean w_bool = boolean_bool;
 
        // AutoUnBoxing
 
        int num = w_num;
 
        double num2 = w_num2;
 
        char cha = w_cha;
 
        boolean bool = w_bool;
        
    }
}




AutoBoxing이 생기면서 반환 값에 대한 차이가 없어졌다.


그러므로 valueOf()든 parse()든 뭘 쓴다고 해도 결과는 얻을 수 있고


데이터 타입마다 메서드가 나누어져 있는 parse() 보단


모든 데이터 타입에 쓸 수 있는 valueOf()가 사용하기 편할 수도 있다.


단, 성능만 두고 보자면 valueOf() 가 조금 더 느리다.

'Java > Class' 카테고리의 다른 글

[java.lang] Boolean  (0) 2018.01.10
[java.util] StringTokenizer  (0) 2018.01.08
[java.lang] Wrapper  (0) 2018.01.05
[java.lang] Math  (0) 2018.01.05
[java.lang] StringBuilder  (0) 2018.01.04
댓글
Notice
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
Link
«   2025/04   »
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
글 보관함