본문 바로가기

04번. IT 힌트얻기/▶ 자바

[Java] Static vs. Non-Static


static 메소드와 non-static 메소드의 차이는 무엇일까?

non- static 변수는 class로 부터 반드시 객체를 만들어야만 호출할 수 있다. 
String s = "abcd";
s.substring(1,3);

String.substring(1,3);

더이상 설명안해도 두번째 예제는 말도 안된다는 것을 아시겠죠?

static 메소드는 객체를 만들지 않고 class로 부터 직접 호출해야 합니다.물론 객체를 만들어 객체로부터 호출해도 에러는 없지만, 이것은 메소드의 올바른 사용법이 아닙니다.

그렇다면 당연히 static 변수와 method는 객체의 생성과는 아무런 연관이 없게됩니다. 따라서 static 변수와 메소드는 객체가 생성되기 이전에 먼저 메모리에 로드됩니다. 즉 static 메소드와 변수는 객체 생성 이전의 문제라는 겁니다.

하지만 non-static 메소드는 반드시 객체를 만들어야만 메모리에 로드되고 사용이 가능해집니다.
자식이 태어나지도 않았는데, 부모님이 자식한테 심부름을 시킬수는 없죠. 


객체를 생성할 때마다 메모리(heap)에 객체가 올라가지만
static은 한번만 올라갑니다. (아마 method에 올라갈거예요)
메모리 구조가 method, stack, heap 이렇게 되어있는데(가물가물 확신이 안서네요)
암튼.. 객체 생성할 때마다 heap에 생성한 만큼 올라가게 됩니다.
하지만 static은 한 번만 올라가죠
그리고 static과 non-static으로 나뉘는데
static은 non-static을 못 봅니다. (접근을 할 수 없어요.)
static은 언제 쓰냐면..
여러 페이지에서 많이 쓰는 변수라든지..
DB의 Port번호를 변수화시키고 싶을 때 static final PORT 
공통적으로 쓰이는 것... 이런거에 쓰면 될겁니다.
static 변수는 사용할 때에 따로 메모리에 올리지 않아도 사용이 가능하지만
사용법은 객체명.변수명으로 사용하면 된다. 

<추가설명>

class StaticVar
{
   int su1 = 100;     // 객체를 생성을 할 때마다 메모리 할당을 다시 한다.
  static int su2 = 100; // 객체 생성과는 관련 없다.
  void pr(){
    System.out.println("su1(non-static) = " + su1 ++ + "\t" + "su2(static) = " + su2++);
  }
 }

class StaticVar Test
{
   public static void main(String[] args)
   {
     StaticVar obj = new StaticVar(); // 클래스를 찾아 객체 생성을 한다
     obj.pr();

     obj = new StaticVar();
     obj.pr();  // 객체 생성을 할 때마다 su1은 다시 메모리 할당을 한다

     obj = new StaticVar();
     obj.pr();
    }
}

출처 : 네이버지식인
http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040201&docId=71226148&qb=c3RhdGljIG5vbi1zdGF0aWM=&enc=utf8&section=kin&rank=21&search_sort=0&spq=0