[java] 클래스변수, 인스턴스 변수 차이(static변수와 non Static변수)

 

목차

  1. 클래스 변수, 인스턴스 변수
  2. 클래스 변수, 인스턴스 변수, 지역 변수가 메모리에 적재되는 위치
  3. 클래스 변수(Static)의 주의점, 클래스 변수가 필요한 이유



클래스 변수, 인스턴스 변수


클래스 변수(Static 멤버)
  • 클래스 내에 Static 키워드로 선언된 변수
  • 처음 JVM이 실행되어 클래스가 메모리에 올라갈 때 ~ 프로그램이 종료될 때까지 유지
  • 클래스가 여러 번 생성되어도 Static 변수는 처음 딱 한 번만 생성됨
  • 동일한 클래스의 모든 객체들에 의해서 공유됨


인스턴스 변수(Non-static 멤버)
  • 클래스 내에 선언된 변수
  • 객체 생성 시마다 매번 새로운 변수가 생성됨
  • 클래스 변수와 달리 공유되지 않음


아래 예제에서 StaticTest 인스턴스를 두 개 생성한 후 staticTest1의 클래스 변수와 인스턴스 변수를 수정해보았다.

클래스 변수 classVar은 처음 한 번만 생성되고 동일한 객체를 staticTest1staticTest2 에서 서로 공유하기 때문에 양쪽이 동시에 바뀌었지만 instanceVar은 객체 생성 시 마다 매번 새로 메모리에 할당되기 때문에 staticTest1.instanceVar만 변경된 것을 확인할 수 있다.

스크린샷 2021-03-03 오후 9 46 25


// 출력 결과
1. 10, 28
2. 10, 28
  
1. 12, 400
2. 12, 28




클래스 변수, 인스턴스 변수, 지역 변수가 메모리에 적재되는 위치


지역변수
  • 메소드 블럭 안에 선언된 변수로 메소드 호출 시점 ~ 메소드 종료 시점 동안 유지된다.

image



메모리에 적재되는 위치
  • 위의 예제처럼 staticTest1, staticTest2 두 객체를 생성했을 때 new()로 생성된 두 객체가 각각 Heap에 할당되고 각 객체를 가리키는 staticTest1변수와 staticTest2변수가 stack에 생성된다.
  • 인스턴스 변수지역변수는 객체가 생성될 때마다 Stack영역에 매번 새로 생성되지만 클래스 변수Static Area에 한 개만 생성되고 하나의 영역을 공유한다.

image





클래스 변수(Static)의 주의점, 클래스 변수가 필요한 이유


주의
  • 실제 static 멤버의 생성 시점은 JVM에 따라 다르다.

  • 보통 JVM은 필요한 대부분의 클래스를 처음부터 로딩하기 때문에 static멤버의 생성 시점은 JVM이 시작되는 시점이라고 할 수 있다.

  • 제약조건

    • static 메소드는 오직 static멤버만 접근 가능

      => static메소드도 static멤버와 로드되는 시점이 동일하기 때문에 객체가 생성되지 않은 상황에서도 변수를 사용할 수 있어야 한다.

    • this 키워드 사용 불가

      => this는 호출 당시 실행 중인 객체를 가리키는 레퍼런스인데 static메소드는 객체가 생성되지 않은 상황에서도 호출이 가능하기 때문이다.


클래스 변수가 필요한 이유
  • 자바는 캡슐화 원칙에 따라서 C/C++과 달리 어떤 변수나 함수도 클래스 바깥에 존재할 수 없다. 따라서 전역변수나 전역메소드로 사용해야 할 경우 static을 이용해서 해결한다.