JAVA Static변수와 메모리 구조

yonii·2021년 7월 18일
2
post-thumbnail

Java로 프로그래밍하다보면 가끔 생각 없이 Static을 쓰고 낭패를 보는 경우가 생긴다.. 나만 그런거겠지.. 하아 ..
명확하게 개념을 잡고 실수를 안하고자 Static에 대해서 글로 정리해보려 한다.

Static이란?

Java에서 Static이란 키워드는 메모리에 한번 할당되어 프로그램이 종료될 때 해제되는 것을 의미한다.
프로그램이 실행되기 위해서는 프로그램이 메모리에 load 되어야한다. 또한 프로그램에서 사용되는 변수들을 저장할 메모리도 필요하다.
Static에 대해서 알아보기전에 컴퓨터 운영체제가 프로그램의 실행을 위해 제공하는 다양한 메모리 공간 구조에 대해서 먼저 살펴볼 것 이다.

1. Code 영역
Code 영역은 실행할 프로그램의 코드가 저장되는 영역으로 CPU는 Code영역에 저장된 명령어를 하나씩 가져가 처리한다.

2. Data 영역
Data 영역은 프로그램의 전역 변수정적(Static)변수가 저장되는 영역이다. Data 영역은 프로그램의 시작과 함께 할당되며 프로그램이 종료되면 소멸한다.

3. Stack 영역
Stack 영역은 함수의 호출과 관계되는 지역변수매개변수가 저장되는 영역이다. Stack 영역은 함수의 호출과 함께 할당되며 함수의 호출이 완료되면 소멸한다. Stack영역은 LIFO(Last In, Last Out)구조로 높은 주소에서 낮은 주소의 방향으로 할당된다는 특징이 있다.

4. Heap 영역
Heap 영역은 사용자가 직접 관리할 수 있는 메모리 영역이다. Heap 영역은 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다. Stack 영역과 반대로 낮은 주소에서 높은 주소의 방향으로 할당된다.

일반적으로 우리가 프로그래밍하여 만드는 Class는 Static영역에 생성되고 new 연산을 통해 생성한 객체는 Heap영역에 생성된다.

Static변수는 메모리 구조상에서 Data영역에 저장되며 이는 메모리상에 한번 할당되면 프로그램이 종료될때 해제된다는 것을 의미한다. Class가 여러번 생성되어도 클래스 내부 Static변수는 딱 한번만 생성된다.

객체 생성시에 할당된 Heap 영역의 메모리는 Garbage Collector를 통해 수시로 관리받는다. Static 영역에 할당된 메모리는 모든 객체가 공유하는 메모리라는 장점을 지니지만 GC의 관리 영역 밖에 존재하므로 Static을 남발하면 시스템의 퍼포먼스에 악영향을 끼칠 수 있다.

Static변수와 자주 혼용해서 쓰는게 Global변수이다. 둘다 Data영역에 저장되고 라이프타임이 프로그램이 종료될때까지라는 점에서 비슷하다. 사실 둘의 차이를 크게 생각하지 않고 막 쓰는데 둘의 차이점은 다음과 같다.

전역변수(Global)
다른 파일에서도 해당 변수에 접근 가능

정적변수(Static)
다른 파일에서는 접근할 수 없고, 해당 파일내에서만 scope에 맞게 접근 가능

참고자료

메모리의 구조
Static

profile
공부하려고 노력ing....

0개의 댓글