티스토리 뷰
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 |