📖 Books/자바 객체 지향의 원리와 이해

[Books] 전역변수 사용을 왜 지양해야 할까?

오늘 ONEUL 2023. 2. 25. 20:41

전역 변수란?

static 변수(클래스 변수)란?
여러 인스턴스가 공유해서 사용할 수 있는 변수

인스턴스 변수처럼 객체가 new연산자로 인스턴스화 될 때 생성되는 변수가 아닌,
프로세스가 메모리에 로드되는 순간 정적변수 영역(데이터 영역)에 딱 한번만 생성되는 변수이고,
이는 프로세스가 끝나서 언로드 될때까지 메모리에 상주한다.
따라서 인스턴스의 생성과 상관없이 사용할 수 있다.

 

 

전역 변수의 문제점

 

1. static은 객체 지향적이지 않다.

static 변수는 객체 지향의 패러다임과 상반된다.
한 객체가 가지고 있는 데이터들은 외부에서 함부로 접근하여 수정할 수 없도록 해야 한다는 원칙,
즉 OOP에서 중요한 요소 중 하나인 은폐성을 갖추지 못한다.

 

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

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

 

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

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

 

4. 동시성 문제(Concurrency issues)

프로그램 전역에서 사용되기 때문에 모든 스레드에서 static 변수를 공유하게 된다.
이때 한 스레드에서 값을 변경할 경우 다른 모든 스레드에서 영향을 받는다. 이는 동시성 문제를 야기한다.
기본적으로 thread safety하지 않으며, synchronize(동기화)를 사용하여 이를 보장하기 위해서는 추가적인 작업이 필요하다.

 

5. 메모리 할당 문제(Memory allocation issues)

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

 

6. 테스트하기 어려움(Testing and Confinement)

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

 

 

문제점의 대체 방법

 

 1. ContextObejct

어느 한 곳에 종속적이지 않게 추상적인 변수로 사용한다면, 오버라이드를 통해 쉽게 사용할 수 있다.

 

2. DependencyInjection(DI)

전역 변수를 위한 별도의 의존 관계 클래스(메소드)를 생성해서 사용한다.
DI 패턴을 사용하면 전역 변수 자체를 직접 사용하는 빈도가 줄어드는 장점이 있다.

 

3. 상태 저장

전역 변수를 위한 setter, getter등 각종 상태를 변경, 저장하기 위한 별도의 설정들을 정의해 사용한다.

 

4. 싱글톤 패턴(Singleton Pattern)

싱글톤 클래스의 멤버변수로 정의하여 사용한다. 싱글톤 패턴은 스레드 안정성을 가지고, 객체가 사용될 때마다 제대로 초기화 된다는 것을 보장한다.
전역 변수를 사용하는데 있어서 가장 훌륭한 대안이다.

 

 

📚 함께 읽어보면 좋을 참고 자료

 

왜 자바에서 static의 사용을 지양해야 하는가?

자바에서 데이터를 가공하거나 특정 메서드를 수행할 때 새로운 클래스를 만들어서 이를 인스턴스화 해서 쓸건지 아니면 static 으로 쓸건지 고민하게 될 때가 있다. 사실 후자는 객체지향적 관

unabated.tistory.com

 

 

 

※ 이 내용은 책 [스프링 입문을 위한 자바 객체 지향의 원리와 이해]를 보고 정리한 내용입니다.