static 키워드

2 분 소요

static은 ‘클래스의’ 또는 ‘공통적인’ 이란 의미를 가지고 있다.
자바에서 변수와 메서드앞에 static 키워드를 붙이게 되면 겍체의 멤버 변수나 멤버 메서드가 아니라 클래스 변수, 클래스 메서드가 된다.

일반적인 클래스의 멤버 변수, 멤버 메서드의 경우 인스턴스화 과정을 거친 후에 사용이 가능하지만 static으로 선언된 변수와 메서드는 이러한 객체의 인스턴스화 과정 없이 바로 사용할 수가 있다. 예를 들면 다음과 같다.

Class Test {
    public static int staticNum;
    public int memberNum;
    public static void run(){ }

    public static void main(String[] ar) {
        Test.staticNum;
        Test.run();
    }
}

이러한 것이 가능한 이유는 static이 붙은 경우 클래스가 처음 메모리에 로드될 때 자동적으로 생성되기 때문이다. 또한, 객체가 인스턴스화 될 때 멤버들이 초기화되는 멤버 변수나 멤버 메서드와 달리 static의 경우 처음 생성될 때 단 한번 초기화 되기 때문에 해당 클래스의 인스턴스화된 모든 객체는 동일한 클래스 변수, 클래스 메서드를 가지게 된다.
즉, 변수의 경우 해당 클래스의 모든 객체에서 공통적으로 같은 값을 유지한다.

static 메서드의 경우 내부에 멤버 변수를 사용할 수 없다. 멤버 변수는 인스턴스화 된 이후 사용이 가능한데 static 메서드의 경우 인스턴스 생성과정 없이 사용이 가능하기 때문에 이를 허용하지 않는다.

메서드의 경우 멤버 변수를 사용할 일이 없다면 클래스 메서드로 만드는 것이 좋다. 멤버 메서드는 실행될 때 호출되어야 할 메서드를 찾는 과정이 추가적으로 필요하기 때문에 시간이 더 걸리기 때문이다.

static의 경우 적절히 사용할 경우 메모리를 효율적으로 사용할 수 있는 방법이 되지만 남용할 경우 역효과가 발생한다. 위의 Test 클래스를 예를 들어 Test 인스턴스를 100개 생성할 경우 클래스 변수인 staticNum은 단 한번만 메모리에 올라가기 때문에 멤버 변수를 사용할 때(100번 메모리에 올라감)보다 효율적이다.

하지만 규모가 있는 프로그램에서 클래스 변수를 남용할 경우 자바의 메모리 구조에 따라 오히려 비효율적이게 된다. static 영역은 GC의 대상이 되지 않기 때문에 프로그램이 종료될 때가 되야 JVM에 메모리를 반환한다.
즉, 사용하지 않더라도 GC에 의해 메모리를 반환하지 않고 프로그램이 종료될 때까지 유지하게 된다.

static 블럭

static 블럭은 생성자와 무관하게 클래스가 최초 로딩될때 수행된다.
한 class 내에 static 블럭은 여러개 존재할 수 있고, 만약 다른 블럭에서 같은 변수 값을 수정한다면 가장 마지막에 지정한 값으로 설정된다. 즉, static 블럭은 순차적으로 읽혀진다.

public class StaticTest {
	private static String sValue;
	
	// static 블럭 1
	static {
		sValue = "value1";
	}
	
	public static void main(String[] args){
		// 출력되는 값은 "value2" 이다.
		System.out.println(StaticTest.sValue);
	}
	
	// static 블럭 2
	static {
		sValue = "value2";
	}
}

객체지향 관점에서의 접근

프로그래밍은 현실세계를 모델링하여 컴퓨터안에서 작동하는 프로그램으로 만드는 과정이다. 그리고 이러한 프로그램은 현실세계와 마찬가지로 다양한 상태들로 구성되는데 이러한 상태들은 몇몇 관련있는 다른 상태들과 유기적으로 연계된다.

이렇게 서로 연계되는 상태들을 하나로 묶는 시도가 클래스이다. (좀더 자세히 말하면 클래스는 연계되는 상태뿐 아니라 이러한 상태를 다루는 알고리즘(함수)의 LifeCycle 유사함을 고려하여 만든다.)

정리하면 프로그램 발달과정에서 객체지향 프로그래밍은 현실세계를 모델링 하여 프로그램으로 만드는 과정에서 관련있는 상태와 알고리즘을 lifecycle의 유사함을 고려하여 클래스로 만들고 이러한 클래스들을 조합하여 프로그램을 만든다.

각각의 클래스는 관련있는 상태들을 가지는데 이러한 상태가 클래스 고유의 값이면 클래스 변수이고 생성된 객체들 각각이 다른 상태를 가진다면 그것이 멤버 변수다.
그리고 클래스의 상태를 변화시키는 메서드의 경우 일반적으로 클래스 메서드로 만들고 객체 각각의 상태인 멤버 변수의 값을 변화시키는 역할을 할 때 멤버 메서드로 만든다.

카테고리:

업데이트:

댓글남기기