상세 컨텐츠

본문 제목

static

청강컴정/JAVA

by luckey 2009. 4. 5. 21:43

본문

객체를 new 연산자를 이용하여 생성했을 때 비로소 Method나 멤버 변수들이 메모리공간을 확보하게 된다.
따라서 new연산자로 객체를 생성하지 않고서는 객체의 Method나 멤버 변수들을 사용할 수 없다.
하지만 이러한 절차를 거치지 않고 멤버변수나 Method를 사용하는 방법이 있었으니 바로 static 이란 키워드이다.

static : 객체가 메모리에 생성되지 전에 먼저 메모리 상에 로딩되어진다.

특징
1. 멤버 변수와 Method에 사용
2. 객체를 만들지 않고 접근이 가능하게 해준다.
3. static으로 정의하면 객체가 생성되기 전에 메모리에 로딩
4. 클래스명으로 접근이 가능해진다.
5. method내에서는 static 변수를 선언할 수 없다.(즉 지역변수에는 사용이 불가능하다.)
6. static method내에서는 this의 사용이 불가능하다.
   - this는 객체 자신을 가리키게 되는데 static의 경우는 객체가 생성되기 전에 메모리에 올라간 상태로 자신을 가리킬수 없다.

일단 아래의 예제를 한번보자.

public class StaticTest
{
 int a;
 static int total;
 
 public static void main(String[] args)
 {
  StaticTest s1 = new StaticTest();
  StaticTest s2 = new StaticTest();

  s1.a = 100;
  s1.total = 100;


  System.out.println("int a = " + s1.a);
  System.out.println("int a = " + s2.a);

  System.out.println("static int total = " + s1.total);
  System.out.println("static int total = " + s2.total);
 }
}

StaticTest란 클래스 안에서 하나의 변수는 일반 정수형 변수로 선언을 하고 (int a), 하나의 변수는 static 을 사용하였다.
결과가 어떻게 나올 것 같은가??

  StaticTest s1 = new StaticTest();
  StaticTest s2 = new StaticTest();

이 줄을 보면 s1과 s2 모두 StaticTest를 생성하고 있는 것을 볼 수 있다.
즉 s1과 s2는 별도의 메모리 공간을 가지게 되고 이렇게 함으로써 서로 다른 일을 하는 객체 2개를 생성한 것이다.

그리고는  s1의 객에 안에 있는 변수 a와 total에 값을 주고 있고 그것을 화면에 출력하고 있다.

결과를 출력해보면 아래와 같을 것이다.

int a = 100
int a = 0
static int total = 100
static int total = 100

무언가 이상하다. int a의 값은 s2에서는 주질 않았으니 0으로 나오는게 맞지만 total의 경우에도 0이 나와야 정상인데 그렇지 않다. 그렇다면 하나의 결론을 내릴 수 있을 것이다. int a라는 변수는 클래스가 생성될때 같이 생성된 멤버변수로써 동작을 하지만 static int total은 클래스가 생성될때 각자의 클래스 안에서 동작하는것이 아니었던 것이다.

즉 s1 클래스에서는 a라는 변수의 메모리 공간을 따로 가지고 있고 s2클래스 에서도 a라는 변수의 메모리 공간을 따로 가지고 있지만 total의 경우에는 같은 메모리 공간을 사용한다는 것이다.


그래서 위의 그림처럼 s1에서 total에 100의 값을 주었을 경우 s2에서도 total에 있는 값을 그대로 사용할 수 있는 것이다.

그럼 total의 값을 s1에서 주고 s2에서 바꾸면 어떻게 될까???

public class StaticTest
{
 int a;
 static int total;
 
 public static void main(String[] args)
 {
  StaticTest s1 = new StaticTest();
  StaticTest s2 = new StaticTest();

  s1.a = 100;
  s1.total = 100;

  s2.a = 200;
  s2.total = 200;


  System.out.println("int a = " + s1.a);
  System.out.println("int a = " + s2.a);

  System.out.println("static int total = " + s1.total);
  System.out.println("static int total = " + s2.total);
 }
}

결과는 직접 돌려보고 확인해 보자.

그리고 static 의경우 이 값을 상수화 시키는 명령어가 final이다.

관련글 더보기

댓글 영역