[Java] Static 변수 & 메서드

“Static” 이란 키워드는 자바를 이용하여 개발을 하다 보면 참 많이 마주치는 키워드입니다.

실행할 main 구문만 확인해도 static이 붙어있기 때문입니다.

public static void main(String[] args){ ... }

 

그렇다면 static이 왜 붙어있는지, 도대체 무엇인지, 어떻게 쓰이는 것인지 알아보겠슴다.

static이란 무엇인가?

static은 클래스에 공유되는 변수나 메서드를 정의할 때 사용됩니다.

아래 두 가지 경우에 주로 사용되는데, 각 항목을 자세히 살펴보겠습니다.

  1. static 변수
  2. static 메서드

(1) Static 변수

https://goldenrabbit.co.kr/2021/11/03/자바-코드와-메서드-스태틱-변수-등은-메모리의-어디/

static이 붙은 변수는 클래스의 모든 객체가 공유합니다.

이러한 변수는 메모리의 메서드(static) 영역에 저장되며, 프로그램 실행 시 한 번만 메모리에 할당됩니다.

 

이러한 이유로 값이 변하지 않는 변수에는 static을 사용하면 메모리를 효율적으로 사용할 수 있습니다.

이는 static 변수가 프로그램 실행 중 한 번만 메모리에 할당되기 때문에, 객체마다 별도로 변수를 저장하는 경우보다 메모리 사용량이 적기 때문입니다.

또한, static 변수는 클래스의 static 영역에 저장되며, 모든 객체가 동일한 메모리 주소를 참조하므로 값을 공유할 수 있습니다.

 

따라서 변수에 static을 붙이는 경우를 정리해보자면 크게

  1. 각 객체들에서 공통적으로 하나의 값이 유지되는 경우 (메모리 효율 ↑ )
  2. 모든 객체가 값을 공유해야하는 경우 (공유의 목적)

에 사용할 수 있습니다.

(2) Static 메서드

static 메서드는 객체 생성 없이 클래스를 통해 직접 호출할 수 있습니다.

따라서 객체의 상태를 관리할 필요가 없는 함수형 메서드에서 자주 사용됩니다.

예를 들어 int m = math.abs(input_num)이라고 하면 num을 class 객체에 관리할 필요가 없으므로 바로 쓸 수 있게 static을 이용하는 것입니다.

즉, 데이터의 상태를 관리하지 않거나 상태를 유지할 필요가 없는 경우에 static 메서드를 사용하면 객체 생성 없이 바로 사용할 수 있습니다.

 

그러나 static 메서드에는 인스턴스 변수를 사용할 수 없다는 제약이 있습니다.
이는 static 메서드가 클래스 로딩 시 메모리에 먼저 올라가기 때문에, 객체 생성 후에만 접근 가능한 인스턴스 변수나 인스턴스 메서드를 참조할 수 없기 때문입니다.

class Example {
    int instanceVar = 10;

    static void staticMethod() {
        // System.out.println(instanceVar); // 오류 발생
    }
}
 

예를 들어, staticMethod가 instanceVar를 출력하려고 하면, staticMethod는 객체 생성과 무관하게 메모리에 먼저 올라가기 때문에, 아직 생성되지 않은 객체의 instanceVar에 접근할 수 없어 오류가 발생합니다.