본문 바로가기
자바

static

by 이상한나라의개발자 2023. 12. 13.

자바에서 static 키워드는 주로 변수와 메서드에 사용되며, jvm 메서드 영역에서 관리되므로 jvm 로딩시 메모리에 저장 되게 됩니다. 이는 static 변수나 메서드가 특정 인스턴스에 속하는 것이 아니라 클래스 정의와 함께 존재한다는 의미 입니다. 

 

정적 변수 ( Static 변수 )

  • static 변수는 클래스 레벨의 변수로, 클래스의 모든 인스턴스에 의해 공유 됩니다. 이러한 변수는 클래스가 메모리에 로드될 때 생성되고 프로그램 종료시 소멸됩니다.
  • 모든 인스턴스가 같은 값을 공유합니다. 한 인스턴스에서 static 변수의 값을 변경하면 이 변경 사항이 모든 인스턴스에 반영 됩니다.
  • 공통의 값을 모든 인스턴스가 공유해야 할 때 사용됩니다. 예를 들어 회사 이름, 버전 정보 등

 

정적 메서드 ( Static 메서드 )

  • static 메서드 역시 클래스 레벨의 메서드로, 클래스의 인스턴스 없이 호출할 수 있습니다
  • static 메서드는 내부에서 인스턴스 변수나 인스턴스 메서드에 직접 접근할 수 없습니다. 오직 static 변수나 다른 static 메서드만 접근 가능합니다.
  • 객체의 상태 (인스턴스 변수)에 의존하지 않는 기능을 제공할 때 사용됩니다. 예를들어 간단한 메서드 하나로 사용되는 유틸리티성 메서드 인데, 이 경우 인스턴스 변수 없이 입력 한 값을 계산하고 반환하는 것이 대부분 입니다.

 

public class ExampleClass {

    // static 변수
    public static int staticCounter = 0;

    // 일반 인스턴스 변수
    public int instanceCounter = 0;

    public ExampleClass() {
        staticCounter++;
        instanceCounter++;
    }

    // static 메서드
    public static int getStaticCounter() {
        return staticCounter;
    }

    // 일반 인스턴스 메서드
    public int getInstanceCounter() {
        return instanceCounter;
    }
}

class Test {
    public static void main(String[] args) {
        ExampleClass obj1 = new ExampleClass();
        ExampleClass obj2 = new ExampleClass();

        System.out.println(ExampleClass.getStaticCounter()); // 출력: 2
        System.out.println(obj1.getInstanceCounter());       // 출력: 1
        System.out.println(obj2.getInstanceCounter());       // 출력: 1
    }
}

 

위 소스에서 보면 객체를 2번 생성하게 되며 staticCounter은 2로 증가하게 되고 instanceCounter 은 1로 증가하게 됩니다.

이유는, 인스턴스 변수는  객체를 생성하게 될 때 각각 다른 참조값을 메모리에 저장하게 되므로 서로 다른 주소에 다른 인스턴스 변수를 할당 받게 됩니다. staticCounter의 경우는 jvm 메소드 영역에 할당되며 이미 메모리에 로딩 되어 있고 인스턴스가 생성될때 그 값을 증가 하므로 2가 출력 되게 됩니다.

 

 

'자바' 카테고리의 다른 글

자바 캐스팅(casting)  (1) 2023.12.15
final, 상수  (0) 2023.12.14
자바 메모리 구조  (0) 2023.12.13
Stream & Optional & Parallel Stream  (0) 2023.12.12
Stream  (0) 2023.12.12