1 분 소요

객체지향프로그래밍 입문 강의의 강의 내용을 참고하여 정리한 글입니다.

static 변수

하나의 class를 만들면 여러 instance를 Heap 메모리에 각각 할당된다. 이 경우 멤버변수(attribute)를 각각 만드는데, 때론 모든 instance들이 공유하는 변수가 있고, 이런 변수를 static으로 선언하게 된다.

이런 instance들이 저장되는 곳이 Heap 메모리이며, Heap 메모리는 동적 메모리라서 객체가 생성될 때 할당받고, 객체가 소멸되면 사라지게 되는 방식으로 작동한다. 그렇기 때문에 static은 Heap이 아닌 데이터 영역(상수영역, 정적영역)에 저장된다. 이 영역은 상수, 리터럴, static 변수들이 이 메모리에 할당된다.

그럼 다른 메모리에 저장되어 있다면 언제 할당될까
바로 전체 프로그램이 메모리에 로드될 때 할당받게 된다.

이것이 어떤 클래스에 속한 변수이면서 인스턴스 레벨은 아니니 참조할 때에도 클래스 이름으로 직접 참조하게 되고, 이런 특징으로 인스턴스 변수(멤버변수)가 아닌, 클래스 변수라고 부르기도 한다.

선언 방식

<static 예약어> <자료형> <변수이름>;

작동방식

스택 메모리에 있는 지역변수(참조변수)들이 기존에는 Heap 메모리의 인스턴스를 가리키고 있었다면 데이터 영역의 static 변수도 가리키게 된다. 이 때 서로 다른 지역변수라고 하더라도 공유하기 때문에 동일한 static 변수를 가리키게 된다.

변수의 유효범위

변수 유형 선언 위치 사용 범위 메모리 생성과 소멸
지역변수(로컬변수) 함수 내부에 선언 함수 내부에서만 사용 스택 함수가 호출될 때 생성되고 함수가 끝나면 소멸함
멤버변수(instance 변수) 클래스 멤버 변수로 선언 클래스 내부에서 사용하고 private이 아니면 참조변수로 다른 클래스에서 사용가능 Heap 인스턴스가 생성될 때 Heap에 생성되고, 가비지 컬렉터(GC)가 메모리를 수거할 때 소멸됨
static 변수(클래스 변수) static 예약어를 사용하여 클래스 내부에 선언 클래스 내부에서 사용하고 private이 아니면 클래스 이름으로 다른 클래스에서 사용가능 데이터 영역 프로그램이 처음 시작할 때 상수와 함께 데이터 영역에 생성되고 프로그램이 끝나고 메모리를 해제할 때 소멸됨

태그: ,

카테고리:

업데이트:

댓글남기기