본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[Java] System Class 한번 제대로 써보자. 이제 당신도 JAVA 중급 개발자

by 돼지왕 왕돼지 2012. 1. 12.
반응형



1. Prerequisite & Reference


- Java에 대한 기초 지식




2. Intro


System 클래스가 뭐라고 이렇게 따로 글을 써요?


System Class 는 자바 언어에서 기본으로 제공하는 API Class 중 하나로 System적 성격을 띄는 API Function 들이 많이 들어있습니다.
System Class 클래스의 function 들은 모두 public static 으로 정의되어 있습니다. 어디서든 맘 편히 부를 수 있다는 거죠.

System Class만을 따로 글로 작성하는 이유는
요 녀석을 잘만 활용하면 아주 기본적인 profiler 의 형태를 갖출 수 있습니다.
프로그램의 생명주기도 관리할 수 있으며, 시스템의 정보들도 쉽게 받아올 수 있습니다.

너무 매력적인 클래스에 접근성도 너무 좋아, 짚고 넘어가지 않을 수 없겠더라구요.




3. Information


API 들 중 활용도도 높고, 유용한 녀석들을 추려서 좀 알려주세요


 먼저 앞서 설명했던데로 System class 의 모든 함수들은 public static 으로 선언되어 있기 때문에
함수설명에 저 접두 accessor 들은 생략하였습니다.


void arraycopy( Object src, int srcPos, Object dst, int dstPos, int length )


 이 녀석은 말 그대로 array를 copy 하는 녀석입니다.
이 녀석만 있으면 귀찮게 for 문을 돌리며 array 카피를 하지 않아도 되죠.
사실 이녀석은 왜 system 영역에 있는가 의문이 들긴 합니다만...
어디서든 접근하며 많이 쓰기 때문에 system에 포함시킨 것이 아닌가

조심스럽게 추측해봅니다.
( 설마 왜 = 로 assign 안 하고 copy 를 하냐고 물으시는 분은 없겠죠? )


long currentTimeMillis()


 실제 개발에서 엄청나게 사용되는 녀석으로, 호출하면
1970년 1월 1일 0시를 기준으로 경과시간을 ms 단위로 던져줍니다. ( 기기, 단말 시간 )

Date class 와 혼합하여 현재시간, 현재 날짜를 구하는데 자주 쓰이기도 하고요.
아주 심플한 시간 profile 을 위해서도 사용하곤 합니다.

long startTime = currentTimeMillis();
// operation
long duration = currentTimeMillis() - startTime;


요런식으로 어떤 operation이 얼마나 시간이 걸리나를 간단히 측정할 수 있죠.
활용도 면에서 별 다섯개 주고싶은 api 입니다.

cf) long nanoTime()
  - 이 녀석은 주로 profile 용도로 사용됩니다. Nano 라고 해도 완전 정확한 시간을 보장하진 않습니다.


void exit( int code )


 VM ( Virtual Machine ) 의 동작을 멈추고 프로그램을 종료시키는 역할을 하는 API 입니다.
사실 이 녀석의 존재는 "알고는 있어야 할 것 같다." 지만 실제로 잘 쓰이지는 않습니다.
 이 녀석은 "정확한 목적"을 가지고 사용하지 않으면 안 되는 일종의 궁극의 api 라고 할 수 있습니다.


Properties getProperties()


 시스템의 설정 값들을 가져옵니다. 어떤 값들이 있는지는 Properties class 를 참조하세요.
( 대부분 OS, Vendor, Compiler, User 등의 정보입니다. )
주의사항은 이 녀석은 copy 해서 값을 가져오는 것이 아니라, property 자체 참조를 가져옵니다.
따라서 return 받은 properties 값을 변경하면 모두에게 반영되니 이 점을 꼭 주의하세요.
cf) String getProperty( String propertyName );


Map<String, String> getenv()


 변경 불가능한 환경 변수들을 가져옵니다.
getProperties()와 비슷한 성격의 녀석이지만 넘어오는 정보의 종류가 다르겠죠?

cf) String getenv( String name );


void load( String pathName )


 pathName 에 지정된 Dynamic library를 불러오고 링크시켜줍니다.
pathName에는 full path를 써줍니다.


void loadLibrary( String libName )


 libName 에 지정된 Dynamic library를 불러오고 링크시켜줍니다.
위에 소개한 load 와 같은 녀석이지만, 여기서는 libName 만을 받습니다.


void gc()


 VM에게 강제로 Garbage Collector 를 수행하도록 명령합니다.
주의할 점은 gc() 를 호출한다고 100% 바로 수행된다고 보장 할 수 없습니다.
그리고 강제 gc() 호출은 가급적 피하는 것이 좋습니다.


void runFinalization()


 VM에게 강제로 finalizer를 가동시키는 API 입니다.
 이 녀석도 솔찍히 거의 쓰일일은 없을거라 여겨집니다.
좋은 코딩에서는 "왠만해서는" class에 finalize() 를 기술하지 않을테니까 말이죠.
왜냐구요? Finalizer 가 언제 구동될지 보장 못 하거든요.
자세한건 아래 링크를 참조하세요~





4. Summary


- System class 는 public static 함수들을 가진 class 로 system에 관련된 유용한 API 들을 제공한다.

- System class 를 잘 활용하면 간단한 profile 을 할 수도 있고, 앱의 생명주기도 관리할 수 있으며, 시스템의 정보들도 쉽게 받아올 수 있다.

- arraycopy(), currentTimeMillies(). getProperties() 등의 유용한 함수들이 있으며 시스템 관련된 API 들이기 때문에 사용상의 주의가 요구된다.

- 자세한 사항 및 생략된 API 들은 Java 의 API Doc을 참조한다.




5. Reference


http://developer.android.com/reference/java/lang/System.html 
  안드로이드 쪽에 기술된 System Class API Doc.

- [자바 성능을 결정짓는 코딩 습관과 튜닝 이야기], 이상민 저, 한빛미디어
 자바의 성능에 관련된 여러가지 사항들을 소개하는 책으로 자바 중급자정도가 읽으면 좋은 책.
  


반응형

댓글