[Java] Static 이란?

tiki·2021년 11월 29일
0

Java

목록 보기
2/4

코딩을 하면서 한 번쯤은 Static이 뭐지?라고 생각해 보신 적이 있으실 겁니다. 언제 사용해야 하는 것이며, 언제는 사용하면 안 되는지 알아보기 위해서 자료를 정리해 보았습니다.

❓ static 이란?

From. Java의 정석 3rd Edition By 남궁 성 (344p)

  • Static은 '클래스의' 또는 '공통적인' 의미를 가지고 있다. 인스턴스 변수는 하나의 클래스로부터 생성되었더라도 각기 다른 값을 유지하지만, static 변수는 인스턴스에 관계없이 같은 값을 갖는다.

  • Static이 사용될 수 있는 곳은 - 클래스의 변수, 메서드, 초기화 블럭이다.

  • Static이 사용된 메서드들은 인스턴스를 생성하지 않고도 호출이 가능하게 된다. 이때 static 메서드 내에서는 인스턴스 멤버들을 직접 사용할 수 없다.

  • 가능하다면 static 메서드를 사용하는 것이 더 편리하고 속도도 더 빠르다.


🔧 static과 메모리

Static 키워드를 이해하기 위해서는 JAVA에 꼭 필요한 JVM의 메모리 구조 및 실행 단계에 대한 이해가 필요합니다.

코드를 작성한다면 확장자가 java인 *.java 파일들이 만들어집니다. 해당 java 파일들은 Java 컴파일러(javac)에 의해 .class파일인 JAVA Byte Code로 컴파일됩니다. 이렇게 컴파일된 바이트 코드들은 Class Loader가 메모리가 할당된 Runtime Data Area으로 코드들을 적재시킵니다.

  • Heap Area은 메서드 안에서 사용되는 객체들을 위한 영역으로 new를 통해 생성된 객체, 배열, immutal 객체 등의 메모리와 값이 저장됩니다.

  • Method Area(Static Area)는 static으로 지정된 메서드 멤버 값들이 저장됩니다.


😈 Why are static variables considered evil?

장점이 많은 static임에도 불구하고 객체지향 프로그래밍에서는 static을 지양해야 한다는 이야기가 나온다. 그 이유는 무엇일까?

1. 객체와 다른 라이프사이클

  • static 멤버는 사용을 하던 사용하지 않던 프로그램의 시작과 끝까지 메모리(Method Area-Static Area) 내에 존재합니다. 즉, 그 클래스를 이용한 작업을 끝내더라도 static 변수가 점유하고 있는 메모리는 garbage collector에 의해서 회수되지 않게 됩니다. 반대로, 프로그래머가 그 변수를 인스턴스화 해서 main() 함수 내에서 하나의 인스턴스로 생성하고 호출을 시키게 되면, 호출이 끝난 후 인스턴스는 소멸됩니다.

2. 메모리 문제

  • 위에 있는 말처럼 인스턴스화 시킨 변수는 garbage collector에 의해서 메모리가 회수됩니다. 이때 static 변수는 회수가 되지 않고 쌓이게 되는데, 이 메서드 혹은 변수에 대한 호출이 많아지면 많아질수록 메모리 문제가 생겨날 수 있습니다.

3. 코드의 상호의존성(inter-dependency)이 높다

  • 프로그램 전역에서 사용되기 때문에 모든 스레드에서 static 필드를 공유하게 됩니다. 이때 한 스레드에서 값을 변경할 경우 다른 모든 스레드에서 영향을 받습니다. 따라서 변화가 찾아왔을 때 유연하게 대처하기 힘들 수 있습니다.

4. static 메서드는 오버라이딩 불가

  • 더불어서 오버라이딩을 할 수 없는 static 멤버들 때문에 클래스를 확장하는게 어려워질 것입니다.

5. 테스트 어려움

  • static 필드는 전역으로 관리되기 때문에 프로그램 전체에서 이 필드에 접근할 수 있고 변경할 수 있으므로 해당 필드를 추론하기 어려워 테스트하기가 까다롭습니다.

🤔 느낀점

자료를 찾아보았지만 결과를 얻지 못한 기분입니다. 정답이 주어진 것이 아니고 상황에 따라서 다르지만, 대부분의 객체지향적인 코드를 지향한다면 피하라는 의미라고 생각된다. 그렇다고 static을 사용을 금기시하는 것은 아니다. 분명 메모리 적으로 인스턴스 변수를 사용했을 때와 메서드를 활용할 때 트레이드 오프를 잘 계산해야 할 것이다. 우선은 캡슐화를 목표로 하기 위해서 대안으로 final를 사용하는 것으로 하고 더 깊은 공부가 필요해 보인다.


📔 References

profile
하루하루 조금씩 발전하려는 개발자 입니다.

0개의 댓글