티스토리 뷰





■Static Keyword, Method Area


 static은 사전적으로 '정적인, 고정된, 움직이지 않는'의 의미를 갖는다. jvm 메모리에 고정됨을 뜻함과 동시에 static을 사용한다는 의미는 모든 객체가 '공유'한다는 의미를 뜻한다.


 인스턴스 변수의 값이 인스턴스 마다 다른 값을 가질 수 있다는 점은 하나의 클래스를 여러개의 인스턴스로 만들어서 사용할 수 있다는 점에서 좋은 기능이라고 할 수 있다. 

 

 그러나, 때에 따라서 모든 인스턴스가 같은 값을 공유하게 하고 싶을 때가 있다. 이런 경우 해당 변수를 클래스의 멤버로 만들면 된다. 인스턴스 변수와 마찬가지로 class 내부에 위치 하지만, static 키워드를 멤버 앞에 붙이면 클래스의 멤버가 된다. 즉, 해당 클래스 소속의 변수가 된다. 물론, 메소드도 마찬가지이다. 


 static이 실행되는 시점은 클래스가 메모리상에 올라갈 때이다. 즉, 우리가 프로그램을 실행하면 필요한 클래스가 jvm 메모리상에 로딩되는 과정을 거친다. 그리고 한번 로딩된 클래스는 특별한 일이 발생하지 않는 이상 메모리상에서 객체를 생성할 수 있도록 메모리에 상주한다. static은 이 시점에 메모리에 올라가면서 필요한 동작을 처리한다. 결론적으로 static은 객체의 생성과는 관계없이 클래스가 로딩되는 시점에 단 한번만 필요한 동작을 처리하기 위해 사용한다. 이 때, jvm 의 메소드 영역(클래스 영역)에 클래스의 정보들이 올라가게 된다.


 이해를 돕기위한 JVM의 메모리 구조의 메소드 영역(클래스 영역)에 대한 간략한 설명이다. 전체적인 자바 프로그램 실행 과정과 JVM 메모리 구조에 대한 포스팅은 추후에 진행하도록 할 것이다.







출처 : http://huelet.tistory.com/entry/JVM-%EB%A9%94%EB%AA%A8%EB%A6%AC%EA%B5%AC%EC%A1%B0





 


 프로그램이 실행되면 JVM은 OS로부터 메모리를 할당 받고, 그 메모리를 용도에 따라 여러 영역으로 나누어 관리한다. 이번 포스팅의 핵심인 메소드 영역에 대해서 자세히 보면, 프로그램을 수행하기 위해 OS에서 할당받은 메모리 공간인 Runtime Data Area 안에 포함되어 있다.

 

 메소드 영역은 Class Area, Code Area, Static Area로 불려지며, 의미상 공유 메모리 영역이라고도 불린다. 코드에서 사용되는 클래스들을 클래스 로더로 읽어 클래스 별로 런타임 상수 풀(runtime constant pool), 필드(field) 데이터, 메소드(method) 데이터, 메소드 코드, 생성자 코드 등을 분류해서 저장한다. 위에서도 말했지만, 메소드 영역은 JVM이 동작해서 클래스가 로딩될때 생성되고, 모든 스레드가 공유하는 영역이다.

 

 static이 붙은 변수를 클래스 변수라고 하는 것은 위에 그림에서 확인할 수 있듯이 변수가 존재하는 영역이 클래스가 존재하는 영역과 같기 때문이다.



 그렇다면 코드상에서 static 변수의 접근방법은?




1. 클래스 내부에서는 직접 접근이 가능하다.(왜? 라고 생각 되면, 위의 내용을 다시 한번...)

public class StaticExample { 
  static int count = 0;

  StaticExample() {}

  public void increase() {
    count += 1;
  }
}



2. 클래스 이름으로 접근, 인스턴스 생성 후 접근(인스턴스 변수와의 구분이 어렵다. 권장하지 않는다.)

public class Main { public static void main(String[] args) { StaticExample.count++; //클래스 이름으로 접근 StaticExample staticExample = new StaticExample(); staticExample.count++; //인스턴스 생성 후 접근(권장하지 않음.) }





댓글