본문 바로가기
Java

Static 사용을 피해야 하는 이유

by kellis 2020. 10. 20.

Java에는 static이라는 키워드가 존재하며, 이는 static으로 지시된 특정한 멤버가 해당 클래스의 인스턴스가 아니라 클래스 자체에 속해 있음을 나타냅니다. 즉, 클래스의 모든 인스턴스에서 공유되는 단 하나의 static member의 인스턴스가 생성되도록 명령하는 키워드입니다. 

위 그림과 같이 모든 인스턴스들은 static 필드 혹은 메서드를 공유하게 됩니다.

static에 대한 자세한 내용은 A Guide to the Static Keyword in Java를 참고하시고, 이 글에서는 어째서 많은 사람들이 static이 나쁘다고 말하는지 알아보도록 하겠습니다.


언뜻 보기에 static은 사용하기에도 편하고 효율적인 것처럼 보입니다. 예를 들어 어떤 클래스 내의 메서드를 매우 빈번하게 호출해야 한다면 그럴 때마다 인스턴스를 생성하는 것보다 Class.method()로 사용하는 것이 더 나아 보일 수도 있습니다.  Stackoverflow의 Why are static variables considered evil? 에 따르면 아래와 같은 이유로 Static의 사용을 권장하지 않습니다. 

 

1. 전체 프로그램과 동일한 라이프사이클

static 멤버는 사용을 하던 사용하지 않던 프로그램의 시작과 끝까지 메모리 내에 존재합니다. 

 

2. static 변수의 생성과 소멸을 지시할 수 없음

프로그램이 로딩될 때 생성되고, 프로그램이 종료되거나 JVM이 내려갈 때 소멸됩니다. 개발자가 프로그램적으로 생성과 소멸에 관여할 수 없습니다. 

 

3. thread safe하지 않음

프로그램 전역에서 사용되기 때문에 모든 스레드에서 static 필드를 공유하게 됩니다. 이때 한 스레드에서 값을 변경할 경우 다른 모든 스레드에서 영향을 받습니다. 이는 동시성 문제를 야기합니다. 

 

4. thread safe하게 만들기 위해 추가적인 작업 필요

전역으로 관리되기 때문에 기본적으로 thread safety하지 않으며, synchronize를 사용하여 이를 보장하기 위해서는 추가적인 작업이 필요합니다. 

 

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

 

6. static 멤버는 Serialization 불가

객체 직렬화는 인스턴스에 대해 적용되기 때문에 클래스 자체 정보인 static 멤버는 여기에 포함되지 않습니다. 

 

7. 런타임 다형성 불가

 

8. 메모리 문제 

static 멤버는 프로그램이 종료될 때까지 Garbage Collector로 회수되지 않기 때문에, 많은 수의 static 필드나 메서드가 존재할 경우 메모리에 영향을 미칩니다. static 필드에 데이터가 계속해서 쌓이게 되면 OutOfMemory가 발생할 수도 있습니다. 

 

9.  테스트하기 어려움 

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

 

그러나 무조건적으로 static의 사용이 나쁘다는 것이 아닙니다. 늘 그렇듯이 올바르게 사용한다면 static은 그 자체로 성능을 향상할 수 있습니다.

예를 들어 자주 사용하지만 절대 변하지 않는 변수, 즉 상수의 경우에는 관례적으로 final static을 사용하여 선언합니다. 이 경우 적어도 1바이트 이상의 GC 대상 객체가 사라지게 됩니다. GC가 애초에 대상으로 인식하지 않기 때문에 성능 향상에 도움을 줄 수 있습니다. 

다만 단순히 편리하다는 이유로 잘못 사용하게 되면 의도한 바와 달리 예상하지 못한 문제를 야기할 수도 있습니다.

 

 

 

[references]

https://stackoverflow.com/questions/7026507/why-are-static-variables-considered-evil

 

Why are static variables considered evil?

I am a Java programmer who is new to the corporate world. Recently I've developed an application using Groovy and Java. All through the code I wrote used quite a good number of statics. I was asked...

stackoverflow.com

java static keyword

 

Static keyword in Java - Javatpoint

static keyword. Let's see what is static variable,method and block in java and what is its advantage and usage.

www.javatpoint.com

 

댓글