Language/JAVA

[JAVA] 정적 변수와 메소드 (static)

4Legs 2021. 3. 25. 15:51

static 키워드

JAVA에서 static 키워드는 메모리에 한 번 할당된 후, 프로그램 종료 시점까지 해제되지 않음을 의미한다.

static 키워드가 붙은 변수나 메소드는 각 객체(인스턴스)에 속하지 않고, 클래스 자체에 고정된다. 이러한 필드나 메소드를 통틀어 정적 멤버라 한다.

자바의 메모리 영역

즉, 정적 멤버들은 위 그림에서 static 영역에 할당되어, 모든 객체가 공유해 어디서든 참조할 수 있다는 특징을 갖는다.

하지만 static 영역은 Garbage Collector의 관리 영역에 포함되지 않기 때문에, 프로그램 종료 시까지 메모리가 할당된 상태로 유지된다. 따라서 무분별한 사용은 좋지 않다.

Garbage Collector : 메모리 관리 기법 중 하나로, 프로그램이 동적으로 할당한 메모리 영역 중 더 이상 필요하지 않은 영역을 해제하는 기능이다. 

 

정적 변수 (Static Variable, Static Field)

정적 변수의 선언

static int staticVariable = 0;	//정적 변수 선언

 

정적 변수는 해당 클래스의 모든 객체들이 공용으로 사용한다. 다음 예시 코드를 보자.

class Example{
    static int staticCount = 0;
    int count = 0;

    public void addCount(){
        staticCount++;
        this.count++;
    }
}


Example ex1 = new Example();
Example ex2 = new Example();

ex1.addCount();
ex1.addCount();
ex2.addCount();

ex1 객체는 addCount 메소드를 두 번, ex2 객체는 addCount 메소드를 한 번 실행했다.

각 객체 내의 count 변수는 정적 변수가 아니므로, 객체 내에 소속되며 객체마다 별도의 값을 갖는다.

즉, 각 객체의 count의 값을 확인하면 ex1은 2가 되고, ex2는 1이 될 것이다.

하지만 staticCount는 ex1에서 접근하던 ex2에서 접근하던 동일한 메모리이다. 따라서 staticCount의 값은 3이 된다.

 

정적 메소드 (Static Method)

정적 메소드의 선언

public static void staticMethod(){
	//...
}

 

클래스의 정적 메소드는 객체를 생성하지 않고 바로 사용할 수 있다. 다음 예시 코드를 보자.

class Example{
    public static void staticExampleMethod(){
        System.out.println("Static Method Called");
    }   
}

Example.staticExampleMethod();

new 키워드를 통해 Example 클래스의 객체를 만들지 않고도, staticExampleMethod를 호출할 수 있다.

객체를 생성하지 않아도 된다는 특징으로 인해 사용성(Utility)이 높은 메소드를 구현하는 데 사용된다.