(지역, 인스턴스, 클래스) 변수 차이

정주영·2024년 12월 9일

자바

목록 보기
6/10
post-thumbnail

오늘은 자바에서 지역, 인스턴스 클래스 변수가 어떤 차이점이 있는지 확실히 알아보자 !
확실히 개념을 이해했다면 자바 JVM 메모리 구조도 같이 보는 것을 추천합니다.

클래스 변수(Static 멤버)

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

인스턴스 변수(Non-static 멤버)

  • 클래스 내에 선언된 변수
  • 객체 생성 시마다 매번 새로운 변수가 생성됨
  • 클래스 변수와 달리 공유되지 않음

지역 변수(Non-static 멤버)

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

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

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

출력 결과
1. 100, 50
2. 100, 50

  1. 200, 100
  2. 200, 50

메모리에 적재되는 위치

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

클래스 변수(Static)의 주의점

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

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

클래스 변수 제약조건

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

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

profile
효율적인 시스템 설계를 고민하며, 확장성과 안정성을 갖춘 백엔드 개발자가 되길 희망합니다.

0개의 댓글