How to monitor the computer's cpu, memory, and disk usage in Java?




http://stackoverflow.com/questions/47177/how-to-monitor-the-computers-cpu-memory-and-disk-usage-in-java

'java' 카테고리의 다른 글

자신 메모리 보는 코드  (0) 2015.10.04
final  (0) 2015.08.11
자바 쉽게 업데이트  (0) 2015.07.22
이클립스 전체폴더 키워드 찾기  (0) 2015.07.10
이클립스 여러줄 제어 단축키  (0) 2015.07.09
Posted by 이상욱1
,

package snippet;


public class Snippet {

 public static void main (String[] args) {

   double[] n1 = new double[1000000];

   double[] n2 = new double[1000000];

   long free  = Runtime.getRuntime().freeMemory();

   long total = Runtime.getRuntime().totalMemory();

   long max   = Runtime.getRuntime().maxMemory();

   System.out.format("Total Memory : %6.2f MB%n", (double) total / (1024 * 1024));

   System.out.format("Free  Memory : %6.2f MB%n", (double) free  / (1024 * 1024));

   System.out.format("Max   Memory : %6.2f MB%n", (double) max   / (1024 * 1024));

 }

}



'java' 카테고리의 다른 글

자바에서 os 값들 가지고오기  (0) 2016.01.05
final  (0) 2015.08.11
자바 쉽게 업데이트  (0) 2015.07.22
이클립스 전체폴더 키워드 찾기  (0) 2015.07.10
이클립스 여러줄 제어 단축키  (0) 2015.07.09
Posted by 이상욱1
,

final

java 2015. 8. 11. 09:10

final, static, abstract, synchronized


변수나 함수 선언시, 해당 변수나 함수 활용 방법에 대한 modifier를 설정할 수 있다.


 modifier

 구분

설명 

final 

 변수 선언

 변수를 상수로 이용하는 경우 사용한다. 

 함수 선언

 오버라이딩이 불가능한 메쏘드를 정의할 때 이용한다.

static 

 변수 선언

 클래스에 소속된 클래스 변수를 의미한다. 클래스 생성시 만들어진다.

 함수 선언

 abstract

함수 선언

 추상 메쏘드를 의미한다. 하위 클래스에 의해 구현된다.

 synchronized

함수 선언

 thread의 동기화를 의한 메쏘드이다. 

http://hyeonstorage.tistory.com/177



자바의 상속을 방지하는 명령어(final)

자바의 상속에 대해서 저번에 공부했었는데 final이란 키워드를 잠시 언급했었다. final이 어떨때 필요하고 어떻게 쓰이는지 알아보는 시간을 갖기로 하자. final 말그대로 마지막 최종 종결자(?)다. class 앞에 final이 붙으면 이 클래스는 상속할수 없게 된다. 메소드의 경우도 마찬가지로 앞에 final이 붙으면 이 메소드는 오버라이드 해서 재정의할수 없게 된다. 상속시 전부 똑같은 형태 즉 메소드 오버라이드해서 내용은 자기가 원하는 입맛대로 쓸수 있었지만 final이 붙었을 경우 이렇게 재정의해서 쓰는것이 불가능하다.


final class Parent
{
   final int total=0;

   final void pmethod( )
   {
       int a=0;
   }
}

class Child extends Parent  //final 때문에 상속불가능해서 에러남.
{
   int total=100; //final 때문에 값을 변경하지 못해서 에러남.

   void pmethod( )  //final 때문에 오버라이드 불가능해서 에러남.
   {
      int a=100;
   }
}

위의 예제에서 보듯이 설령 class 앞에 final이 없어서 상속까진 되었다고 하더라도 메소드에 final이 있으면 역시 에러난다. 변수에 붙어도 마찬가지로 final이 있으면 초기화된 그 값은 절대 변경할수 없다. 그렇다면 자바에서는 왜 이런 기능을 만들어 놓았을까?

여러분이 프로그램을 만들때 어떤 변수는 그 값을 변경하면 안되는 것이 있을수도 있고 혹은 보안을 위해서 어떤 메소드는 항상 똑같은 기능 이외에 다르게 쓰면 안되는 경우가 있을수 있다. 클래스에 final을 걸어놓으면 아예 상속이 불가능하여 원천적인 봉쇄가 가능해 완벽한 은닉이 가능해진다. 대표적인 final 클래스의 예로 우리가 jdk api에서 불러 쓰고 있는 System이나 String, 혹은 Math 클래스 같은 것들이 있다. 누군가가 System 클래스를 상속받아 재정의해 버린다면 제작자의 의도와는 다르게 치명적인 에러가 날수 있다. 이를 방지하기 위해 이런 중요한 클래스들은 자바에서 이미 final로 만들어 놓았다.

부분적으로도 가능한데 메소드의 예를 들자면, 뭔가 열리는 기능을 갖춘 open( ) 이라는 메소드를 만들었는데 누군가가 이를 오버라이드 해서 open( ) 메소드를 열리는게 아닌 뭔가 닫히는 기능으로 바꿔버린다면 전체 프로그램이 엉망이 될것이다. 이렇게 상속해서 공유해 쓰는것은 가능하지만 부분적으로 변경을 원하지 않는 경우 우리는 그 부분을 final로 만들면 이런 발생가능한 위험을 사전에 차단할수 있다.

또한 final은 프로그램의 성능 향상에 기여한다. 지금 단계에서 할말은 아닌듯 하지만 자바에서는 메소드가 하위 클래스에서(상속받은 클래스에서) 오버라이드 하는지 안하는지 검사를 한다. 그런데 메소드 앞에 final이 붙어있으면 자동으로 이런 검사를 안하게 되어 메소드 호출시 속도를 높여 성능향상에 기여하게 된다.

다시 정리하자면,
final이 붙은 클래스는 상속할수 없다.
final이 붙은 메소드는 오버라이드할수 없다.
final이 붙은 초기화된 변수(final int a=0;)는 값을 변경할수 없다.(a=1; 불가능)
final이 붙은 선언만된 변수(final int a;)는 값을 오직 한번만 넣을수 있다.
(a=1; 가능, 하지만 두번째부터는 a=0; 불가능)
오직 한번이라고 했으니 그 다음부터 1 이외의 다른 값으로 변경불가능하다.

자바의 상속에 대해서 공부하고 느끼겠지만 그에 대한 파장(?)이 얼마나 큰지 몸소 체험하고 있을 것이다. 아직도 갈길이 멀다. 그래서 오늘은 강좌를 본의아니게 짧게 마무리한다. 다음시간을 위해 에너지(?)를 비축해두기 바란다.^^


'java' 카테고리의 다른 글

자바에서 os 값들 가지고오기  (0) 2016.01.05
자신 메모리 보는 코드  (0) 2015.10.04
자바 쉽게 업데이트  (0) 2015.07.22
이클립스 전체폴더 키워드 찾기  (0) 2015.07.10
이클립스 여러줄 제어 단축키  (0) 2015.07.09
Posted by 이상욱1
,

자바 쉽게 업데이트

java 2015. 7. 22. 13:00



'java' 카테고리의 다른 글

자신 메모리 보는 코드  (0) 2015.10.04
final  (0) 2015.08.11
이클립스 전체폴더 키워드 찾기  (0) 2015.07.10
이클립스 여러줄 제어 단축키  (0) 2015.07.09
string 클래스 이해 하기  (0) 2015.06.24
Posted by 이상욱1
,

왼쪽 네비게이터 에서 검색할 폴더를 쉬프트로 다중 선택하신 뒤 컨트롤 + h  


'java' 카테고리의 다른 글

final  (0) 2015.08.11
자바 쉽게 업데이트  (0) 2015.07.22
이클립스 여러줄 제어 단축키  (0) 2015.07.09
string 클래스 이해 하기  (0) 2015.06.24
final 키워드  (0) 2015.06.24
Posted by 이상욱1
,

1. 줄번호를 추가 해 보자!

 

       이클립스 처음 쓰시는 분들은 다들 떠올리셨을 겁니다.

 

       아니 도대체 왜!!! 라인 넘버가 안나오는거지 어디서 하는거야?

 

       (아니셨다면 사죄의 말씀 올리겠습니다.)

 

       궁금하신분들! 아래의 스크린샷을 보시면 아주 간단히 라인 넘버를 추가 하실수 있습니다!

 

 E001_01.png

 

 

 

2. 귀찮은 노가다 한방에 끝내기

 

       작업 하시다 보면 printf문 같은거 쓰실때나 여러줄 한번에 탭하고 싶으실때 있으시죠?

 

 

 E001_02.png

 

 

       고럴때 만들라고 있는 것이 바로 이것! Alt + Shift + A !!

 

       (Shift + Alt + A 하셔도 무방하나 A부터 누르시면 곤랍합니다.)

 

 E001_03.png

 

       다른 방법으로 응용

 

 E001_04.png

 

E001_05.png

 

E001_06.png

 

       이 방법을 응용하면 좀더 쉬운 코딩이 가능합니다!

 

       그 부분에 대해서는 각자 생각하여 활용 하시면 대단히 감사하겠습니다.

 

       끝으로 이 방법을 사용후 증가하는 귀차니즘이나 기타 부작용에 대해서는 일체 책임지지 않습니다!

 

       별거 아닌 팁이지만 읽어 주셔서 정말 감사합니다.

 참조 사이트- http://forum.falinux.com/zbxe/index.php?document_srl=550330&mid=lecture_tip

'java' 카테고리의 다른 글

자바 쉽게 업데이트  (0) 2015.07.22
이클립스 전체폴더 키워드 찾기  (0) 2015.07.10
string 클래스 이해 하기  (0) 2015.06.24
final 키워드  (0) 2015.06.24
이클립스 에서 jdk 소스를 보도록 설정  (0) 2015.06.23
Posted by 이상욱1
,



이번 강좌에서는 String 클래스를 좀더 깊숙히 알아보는 시간을 갖고자 합니다.

 

우선 String = "12"; 즉, 스트링 객체에 12 라는 문자열이 들어 있습니다.

 

위 String 객체에 담긴 12 라는 문자열은 내부적으로 어떻게 처리되어 저장될까요?

 

일단 좀더 깊숙히 들어가 봅시다.

 

첫번째, String 객체의 내부 비밀

 

String 객체는 final 한 클래스로서 상속(확장) 이 불가능 합니다.

또한, String 객체는 내부적으로 char 배열에 데이터를 저장하여 보관하고 있습니다.

 

 

 

 

<그림 1> String 클래스

 

 

 

 

<그림 2> String 생성자

 

 

 

 

 

실제 String str = new String("ABC") 한개의 String 객체를 생성할때

 

생성자 내부적으로 String 객체를 char 배열로 변환해서 저장합니다. (위 그림 참조)

 

즉, value 라는 char 배열에 문자열이 들어간것이 아니라,

 

char 배열안에 한문자 한문자 들어가 있게 되는 겁니다.

 

value[0] = 49;

value[1] = 50;

 

이런식으로 말이죠.

 

아니? 잠깐!! 왜 1,2 가 들어간게 아닐까요?

 

자 한번더 깊숙히 들어가 봅시다.

 

컴퓨터는 내부적으로 모든 데이터의 표현 및 연산을 2진수로 처리 합니다.

 

코드상에서 겉보기엔 문자를 처리하는것 처럼 보이지만,

 

내부적으로 숫자밖에 인식하지 못합니다.

 

그래서 미국표준협회(ANSI) 에서는 문자표현에 대한 표준을 아스키(ASCII) 코드를 탄생시키게 됩니다.

 

문자 a는 숫자 97, 문자 b 는 숫자 98...

 

이런식으로 약속한것이 아스키코드 입니다.

 

 

 

<그림 3> 아스키코드 표 

 

 

자 그럼 다시 올라가 봅시다.

 

String 객체에 "12" 가 있다면 내부적으로 char 배열에 아래와 같이 저장된다고 했습니다.

 

value[0] = 49;

value[1] = 50;

 

자 이해가 가시나요?

 

12 는 10진수로 저장된게 아닙니다.

 

이미 12는 문자로 인식하고 있기 때문에

 

문자 0 은 10진수 49

문자 1 은 10진수 50

 

이렇게 내부적으로 매핑하여 저장되어 있는겁니다.

 

위 아스키 코드표를 참고해보세요.

 

 

 

이렇게 char a 변수에 문자 a 를 넣고 1을 곱하는 연산이 가능한 이유가 바로 내부적으로

 

10진수로 저장하고 있기 때문에 가능 한겁니다.

 

위 코드를 출력하면 97이 나옵니다. 왜냐하면 10진수 97은 아스키코드 문자로 a 이기 때문 입니다.

(이래서 C를 꼭 먼저 접해 보라는 말이 나오는 이유 입니다.)

 

 

두번째, String 객체는 리터럴 방법으로 생성 하는것과 new 로 생성 한다면? (상수풀에 대한 이해)

 

String 객체는 리터럴("") 로 생성하는 경우 JVM 메모리에 있는 상수풀(Constant Pool)로 들어갑니다.

 

두번째 생성하는 String 객체 역시 처음 생성했던 객체와 동일한 문자열을 가지는 경우 같은 레퍼런스를 참조 하게 됩니다. 

 

String str1 = "ABC";

String str2 = "ABC";

 

즉 내부적으로 intern 을 호출하여 상수풀에 등록된 스트링의 레퍼런스를 가지게 됩니다.

 

intern 메소드는 무엇일까요?

 intern 메소드는 String이 상수풀(Constant Pool)에 등록된 경우 해당 스트링의 주소값을 반환하는 역할을 합니다.

 

그렇기 때문에 위 String 객체를 == 연산하는 경우 같은 주소를 가지는 이유 입니다.

 

 

하지만 new 로 생성되는 경우 어떻게 될까요?

 

String str3 = new String("ABC");

String str4 = new String("ABC");

 

위 str3 == str4 는 서로 false 즉 서로 다른 레퍼런스 입니다.

 

메모리 힙 영역에 서로 다른 객체로 자리매김 하고 있습니다.

 

자 그럼 리터럴로 생성된 String 처럼 str3 와 str4 를 같은 레퍼런스를 가지게 할 수 있을까요?

 

정답은 가능하다 입니다.

 

String str3 = new String("ABC").intern();

String str4 = new String("ABC").intern();

 

위 객체를 == 연산하는 경우 true 가 됩니다.

 

왜냐하면 처음 str3 객체가 생성됨과 동시에 상수풀에 등록이 되고,

str4 객체가 생성이 되면서 ABC 문자열과 동일한 String 객체가 상수풀에 있기 때문에 같은 레퍼런스를 가지게 됩니다.

 

 

 

세번째, String 객체는 바뀌지 않는 변할 수 없는 객체다.

 

많은 사람들이 String 객체를 사용시 변수처럼 사용하곤 합니다.

 

String str4 = "ABC";

str4 += "DEF";

 

간단한 문자열을 합치는 연산을 해봤습니다.

 

첫번째 str4과 두번째 str4 과연 같은 레퍼런스 일까요?

 

정답은, 서로 다른 레퍼런스 를 가지고 있습니다.

 

 

   

 

자 첫번째 그림은 첫번째 소스코드 ABC 문자열만 삽입 했을때 입니다.

그리고 두번째 그림은 DEF 를 합친 순간 입니다.

 

보시는 바와같이 레퍼런스가 변해버렸습니다.

 

결론은 String 객체로  = 연산으로 문자열을 삽입하거나 += 연산으로 문자열을 합치는 행위를 할때는

 

이전에 있던 객체(ABC)는 GC의 대상이되고 새로운 객체(ABCDEF)가 생성되어 집니다.

 

즉, 문자열이 합쳐지는게 아니라 새로운 객체가 생성된다고 보시면 됩니다.

 

왜 이런일이 발생하는 걸까요?

 

이는 앞서 설명해드렸습니다. String 객체는 내부적으로 데이터를 char 배열로 보관한다고 했습니다.

 

하지만 char 배열이 final 로 되어 있기 때문에 데이터를 변경할 수 없습니다.   

 

간단한 예제를 통해 이해해 봅시다.

 

 

final int data 에 100을 정의한 상태에서

 

data 변수에 100을 대입하면 무슨일이 발생할까요?

 

당연히 에러가 발생합니다. 이유는 final 로 변수를 선언해버렸기 때문에 데이터를 변경할 수 없는 상수가 되었기 때문입니다.

 

String 객체 역시 마찬가지 입니다.

 

append 할 수 없는 가장큰 이유가 바로 내부적으로 final 로 char 배열이 선언되어 데이터를 상수로 가지고 있기 때문입니다.

 

(참고로 이거까지 설명하는 자바책은 없더군요. 뭐 누구나 자바SDK 소스를 보시면 금방 눈치챌수 있습니다.)

 

 

반대로 StringBuffer, StringBuilder 은 왜 append 할수 있냐구요?

 

 

<그림> AbstractStringBuilder 추상클래스

 

 

StringBuffer, StringBuilder 클래스는 공통적으로 AbstractStringBuilder 추상클래스를 상속받아 구현되어진 클래스 입니다.

 

AbstractStringBuilder 추상클래스에는 char 배열이 final 로 되어있지 않습니다.

append 메서드 내부적으로 char 배열만 다시 생성해서 메모리공간을 늘리고 기존의 데이터를 복사해서

 

append 한 str 만큼 값을 추가하는 형태이지만,

 

String 객체는 자체를 new 하고 값을 다시 변경하지만,

 

StringBuffer, StringBuilder 객체는 안에 있는 char 배열 데이터만 변경하는 차이 인것 입니다.

 

이제 이해가 되시나요?

 

가장 좋은 방법은 다시 한번 SDK 를 직접 소스코드를 분석해보는것이 좋습니다 ^^

 

더 궁금한점은 답글 주시면 답변 드리겠습니다.


출처 :http://globalbiz.tistory.com/81

'java' 카테고리의 다른 글

이클립스 전체폴더 키워드 찾기  (0) 2015.07.10
이클립스 여러줄 제어 단축키  (0) 2015.07.09
final 키워드  (0) 2015.06.24
이클립스 에서 jdk 소스를 보도록 설정  (0) 2015.06.23
void return 함수  (0) 2015.05.27
Posted by 이상욱1
,

final 키워드

java 2015. 6. 24. 15:19

final 키워드는 주로 class 나 method 의 재정의(overriding)를 막기 위하여 사용되며, 맴버변수나 로컬변수 등에서 변수 초기화 이후 바꿀수 없는 변수를 만드는 용도로도 사용을 합니다.

'java' 카테고리의 다른 글

이클립스 여러줄 제어 단축키  (0) 2015.07.09
string 클래스 이해 하기  (0) 2015.06.24
이클립스 에서 jdk 소스를 보도록 설정  (0) 2015.06.23
void return 함수  (0) 2015.05.27
삼항연산자  (0) 2015.05.14
Posted by 이상욱1
,


3 Ways of JDK Source Code Attachment in Eclipse

You wanna look at a JVM class while you are coding and you cannot. Here is the solution.

First of all, download your related JDK source code files unless you already have it. In general, source code is included in the JavaSE bundle and located under the root directory of your installation (src.zip mostly).

1. Try to “Open Decleration (F3)” to any JVM class (i.e String class). You will take “Source Not Found” message and below it you will see Attach Source… button. Press it, select the source code file (External File…) and press OK.

Method 1

2. Go to Project > Properties > Java Build Path > Libraries and expand JRE System Library [your jre version] then, rt.jar. Select Source attachment, click Edit…. Select the source code file (External File…) and press OK.

Method 2

3. Go to Window > Preferences > Java > Installed JRES and click Edit… for your desired JRE. Expand rt.jar, select Source attachment and click Source Attachment…. Select the source code file (External File…) and press OK.

Method 3

You can use the above techniques for other libraries that you need to navigate/discover if their source codes are in your hand.

And you’re OK now. Happy coding. :D

P.S: Menu structure is taken from Eclipse 3.4.0 version.

참조사이트 :http://www.cavdar.net/2008/07/14/3-ways-of-jdk-source-code-attachment-in-eclipse/

'java' 카테고리의 다른 글

string 클래스 이해 하기  (0) 2015.06.24
final 키워드  (0) 2015.06.24
void return 함수  (0) 2015.05.27
삼항연산자  (0) 2015.05.14
증감 연산자 예제  (0) 2015.05.09
Posted by 이상욱1
,

void return 함수

java 2015. 5. 27. 17:41


public void method() {

       System.out.println(" 쉽죠?");

       return;

}



리턴문을 사용하면 for문에서 break를 사용한것과 같은 효과가 나타난다. 

public void method() {

       System.out.println(" 쉽죠?");

       return;

       System.out.println("Unreachable code");
}


'java' 카테고리의 다른 글

final 키워드  (0) 2015.06.24
이클립스 에서 jdk 소스를 보도록 설정  (0) 2015.06.23
삼항연산자  (0) 2015.05.14
증감 연산자 예제  (0) 2015.05.09
linux 상에서 자바 실행 시키기  (0) 2015.05.08
Posted by 이상욱1
,