'정적변수'에 해당되는 글 1건

  1. 2009.09.22 static 변수의 동작 (4)

자바에서 static 으로 변수를 선언하면 어떻게 될까.

여지껏 정확한 동작을 잘 모르고 있었다.

정확한 동작을 살펴본다.

static 으로 멤버변수를 선언하면 그 변수는 인스턴스 레벨이 아닌 클래스 레벨이 된다.

다시말해 클래스 자체에 메모리가 할당되어 변수로 가지게 되는 것이다.

코드를 보자.

public class StaticFieldTest
{
 int total = 0;
 static int grandTotal = 0;
 void accumulate(int amount)
 {
  total += amount;
  grandTotal += amount;
 }

}

grandTotal 을 static 으로 선언했다.

이렇게 되면 이 클래스의 인스턴스를 여러개 생성해도 grandTotal 의 값은 하나인 것이다.

왜냐하면 static 변수는 클래스 레벨에 존재하기 때문이다.

public class StaticFieldTestDrive
{
 public static void main(String[] args)
 {
  StaticFieldTest obj1 = new StaticFieldTest();
  StaticFieldTest obj2 = new StaticFieldTest();
  obj1.accumulate(10);
  obj2.accumulate(20);

  System.out.println("obj1.total = " + obj1.total);
  System.out.println("obj1.grandTotal = " + obj1.grandTotal);
  System.out.println("obj2.total = " + obj2.total);
  System.out.println("obj2.grandTotal = " + obj2.grandTotal);

 }
}

위 코드를 실행하면

---------- Java Running ----------
obj1.total = 10
obj1.grandTotal = 30
obj2.total = 20
obj2.grandTotal = 30

Output completed (0 sec consumed) - Normal Termination

위에서 보는 것과 같이 같은 값의 grandTotal 이 출력된다.

또 다르게 obj1, obj2 라고 코딩하지 않고 클래스 이름 즉 StaticFieldTest.grandTotal 을 직접 출력해도 같은 30 이 출력된다.

더불어 설명하면 static 변수나 메소드를 접근하는 방법은 클래스 이름을 이용하는 것이다.

인스턴스의 생성과는 상관없이 클래스 이름을 통해 접근할 수 있다.

static 으로 선언한 변수나 메소드는 인스턴스가 아닌 클래스 레벨에 존재한다. ( 모든 인스턴스에서 공유되는 자원이다. )

Posted by 행복한 프로그래머 궁금쟁이박

댓글을 달아 주세요

  1. Richpapa 2009.09.22 17:52  댓글주소  수정/삭제  댓글쓰기

    그렇게 하지 않아도, main 메소드를 생각하면 쉬울 듯. 메인을 가지고 있는 클래스의 인스턴스보다 먼저 실행되어야만하는 이유 !!

    그리고 static {} 사용해서 실행해보면 bp 잡지 않는 이상 트레이스가 안되기 때문에 이것도 쉽게 알 수 있겠죠.

  2. 스파게티코드 2009.09.23 14:09  댓글주소  수정/삭제  댓글쓰기

    싱글턴으로 DB 작업하는 메소드 구현할때도 사용했었지...
    기억 안나나 ㅋㅋㅋ

  3. BlogIcon 행복한 프로그래머 궁금쟁이박 2009.09.23 16:16 신고  댓글주소  수정/삭제  댓글쓰기

    아 생각났다.ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ