본문 바로가기
JAVA/Java Study

[Java] static은 언제, 어떻게 사용해야 할까?

by ♡˖GYURI˖♡ 2024. 2. 16.

자바 공부를 하면서 static이 무엇인지는 배웠는데...

도대체 어떤 상황에서는 꼭 사용해야 하고, 어떤 상황에서는 사용하지 말아야 하는지가 궁금해졌다.

 

static

static은 고정된, 정적인 이라는 의미이다. static이라는 키워드를 사용해서 static field(정적 필드)와 static method(정적 메소드)를 만들 수 있다. 이 둘을 묶어서 정적 멤버(클래스 멤버)라고 한다. 즉, 객체(인스턴스)에 소속된 멤버가 아닌 클래스에 고정된 멤버라는 뜻이다. 객체를 생성하지 않고도 사용할 수 있는 이유가 바로 static은 객체에 소속된 것이 아니기 때문이다.

 

static에 대해 글을 찾아보니 JVM에 관한 내용이 함께 나오는데, JVM에 대해서는 개념 정도만 알고 있었기 때문에 다시 정리해보았다.

 

JVM

 

JVM은 Class Loader, Excution Engine, Garage Collector, Runtime Data Area(Memory Area)로 이루어져 있다.

 

JVM의 기본적인 수행 과정

프로그램 실행 시 개발자에 의해 작성된 소스코드(.java)는 자바 컴파일러(javac)를 통해 Byte code(.class) 파일로 변환된다. JVM이 읽을 수 있도록 변환하는 것이다.

이렇게 변환된 Byte code 파일을 JVM 내부의 Class Loader가 읽어들여 Runtime Data Area에 저장하게 된다.

저장된 코드들을 Excution Engine이 하나의 명령어 단위로 읽어들여 실행하게 되고, 사용이 끝나 더이상 사용하지 않는 코드들을 Garbage Collector가 모아서 메모리에서 해제한다.

 

Class Loader : .class 파일을 가져와서(load) 이를 Runtime Data Area에 올려주는 역할, 여기 올라간 파일은 Excution Engine에 의해 실행된다.

 

Runtime Data Area( = Memory Area) : JVM이 프로그램을 수행하기 위해 OS로부터 할당받은 공간

이 메모리 영역은 Method Area, Stack, Heap, PC Register, Native Method Area로 다시 구분된다.

  • Method Area
    • 자바 프로그램에서 사용되는 클래스에 대한 정보와 클래스 변수 저장 (필드, 메소드, 생성자 등)
  • Heap
    • new 연산자를 이용해 동적으로 생성된 객체, 배열 등을 저장하는 영역
    • Stack 영역에는 주소, Heap 영역에는 주소에 해당하는 실제 값이 저장됨
    • JVM이 중단되거나 GC가 실행되기 전까지 영구적으로 저장됨
    • 여기서 사용이 끝난 객체들을 Garbage Collector가 모아서 처리하게 됨
  • Stack
    • 프로그램 실행 중 메소드가 호출되면, Stack 영역에 각각의 메소드를 위한 메모리가 할당됨
    • 즉, 각 메소드는 하나씩의 Stack을 가지게 됨
    • Stack 영역은 이 메소드들 안에서 사용되어지는 값을 저장하며, 호출된 메소드의 지역변수, 매개변수, 리턴값 및 연산값들을 임시로 저장하는 공간
    • 임시로 저장하기 때문에 사용이 끝나면 Stack 영역에서 해제됨

 

다시 본래 목적이었던 static에 대해 이야기해보자.

 

Class Loader가 .class 파일을 탐색하던 중, static 키워를 보는 순간 객체가 생성되지 않아도 항상 메모리를 할당해야 하는 멤버라고 보고, Method Area( = Static Area)에 메모리를 할당한다.

Static 영역에 할당된 메모리는 모든 객체가 공유하므로, 하나의 멤버를 어디서든지 참조할 수 있다. 하지만 Garbage Collector의 관리 영역 밖에 존재하기 때문에 Static Area에 있는 멤버들은 프로그램의 종료 시까지 메모리가 할당된 채로 존재하게 된다. static을 너무 남발하는 것이 좋지 않다고 말하는 이유가 바로 이 점 때문이다.

 

static은 언제 사용할까?

  • 클래스를 설계할 때, 멤버 변수 중에서 모든 인스턴스에 공통적으로 사용해야 하는 것이 있다면 static을 붙인다.
  • 작성한 메소드 중에서 인스턴스 변수를 사용하지 않는 메소드가 있다면 static을 붙여준다.

 

제약조건

  • static 메소드는 오직 static멤버만 접근 가능
    • static메소드도 static멤버와 로드되는 시점이 동일하기 때문에 객체가 생성되지 않은 상황에서도 변수를 사용할 수 있어야 함
  • this 키워드 사용 불가
    • this는 호출 당시 실행 중인 객체를 가리키는 레퍼런스인데 static메소드는 객체가 생성되지 않은 상황에서도 호출이 가능하기 때문

 

static의 장점

  1. 코드를 간결하게 작성할 수 있다.
  2. 어디서든 접근이 가능하다.
  3. GC 오버헤드를 줄여줄 수 있다.

 

static의 단점

  1. 무분별한 static의 사용은 Memory Leak의 원인이 된다.
  2. 객체지향적이지 않다.
  3. 재사용성이 떨어진다.
  4. Thread-safe하지 않다.

 

 

 


 

[Java] static 뜯어보기 !

자바를 공부하는 사람이라면 static에 대해 많이 들어보았고, 사용하고 있으리라 생각한다. 필자는 얼마 전 보았던 1차 면접에서 면접관님에게 "static에 대해 설명해주세요"라는 질문을 받았을 때,

velog.io

 

 

[JAVA] 변수와 메서드(variables, method)

JAVA의 정석(2nd Edition) (남궁 성 著) 164p~187p 를 참조해 코드를 작성했으며개인적인 공부 내용을 적은 것이므로 오류가 있을 수 있습니다. 0. 들어가기에 앞서 오늘의 공부파트 static 이 붙으면 클래

whatisthenext.tistory.com

 

 

[java] 클래스변수, 인스턴스 변수 차이(static변수와 non Static변수) - Break Out of Your Comfort Zone

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

sujinhope.github.io

 

 

Static의 올바른 사용법은?

저번 포스팅(Strategy vs Factory Method Pattern in Java)에 이어 PDF 변환 라이브러리를 개발하면서 가졌던 의문중 하나인 ‘Static의 올바른 사용법은?’에 대해 다뤄보고자 합니다. 이번 포스팅은 Static의…

medium.com