본문 바로가기
교육, 학습/스프링 입문을 위한 자바 객체지향의 원리와 이해

JAVA의 OOP - 메서드의 블랙박스화, 전역변수 비권장이유

by 개발하는 경제학도 2022. 2. 3.

책 소개

현재 읽고 있는 '스프링 입문을 위한 자바 객체 지향의 원리와 이해' 중의 일부를 적은 내용입니다.


메서드의 블랙박스화

메서드 간 값을 전달하거나 반환할 수 있는 방법은 메서드를 호출할 때의 인자와 메서드가 종료될 때의 반환 값을 통해서만 가능하다. 다시 말하자면, 메서드들이 서로 내부의 변수들을 확인할 수 없다.

물론, static을 사용하여 전역 변수를 사용하면 메서드 간 값을 공유할 수 있지만, 가급적 지역변수를 사용하는 것이 좋다.

 

전역 변수는 쓰지말자

T메모리는 스택, 힙, static영역 3가지로 구분된다.

static: 클래스들의 공간
스택: 메서드들의 공간 : 객체들의 공간

 

static이 붙은 변수로 코드 어느 곳에서나 접근할 수 있어 전역 변수라고 부른다. 또한, 메서드들이 공유하는 변수이기에 공유 변수라고도 부르기도 한다. 이 전역 변수는 T메모리 중 static영역에 할당된다.

이 전역 변수는 사용이 권장되지는 않는다. 프로젝트가 커져 코드가 방대해졌을 때 이 전역 변수가 어디서 어떻게 변경되었는지 추적하기가 매우 어렵기 때문이다. 따라서 스택 프레임에 독립적인 전역 변수보다, 스택 프레임에 종속적인 지역변수를 사용하는 것이 좋다.

다만, 읽기 전용으로 전역 상수를 사용하는 것은 좋다.

아래에서는 전역변수를 멀티스레드 환경에서 사용했을 경우 발생하는 문제점을 다룬다.

 

멀티스레드와 전역 변수

전역 변수를 멀티 스레드 환경에서 사용했을 경우 문제가 생길 수 있다.

스레드 1 스레드 2  
전역 변수 A에 5 할당   전역 변수 A는 5를 저장
  전역 변수 A에 10 할당 전역 변수 A는 10을 저장
전역 변수 A의 값을 출력   10이 출력된다.

 

스레드 1이 공유 영역(static, 힙)에 있는 전역 변수 A에 5라는 값을 할당한 뒤, CPU 사용권이 스레드 2로 넘어가서 전역 변수 A에 다른 값인 10을 할당한 상황을 가정해본다. 이 경우 다시 CPU사용권이 스레드 1로 넘어가서 전역 변수 A를 출력하면 5가 나와야 하는데, 10이 출력된다.

이런 상황을 스레드 안전성이 깨졌다고 표현한다.

이런 방법을 해결하기 위해서는 락(lock)을 걸 수는 있지만, 멀티 스레드의 장점을 포기한 것과 같다.

 

** 멀티스레드/ 멀티프로세스 개념

더보기

멀티스레드/ 멀티프로세스

1) 멀티스레드

static: 클래스들의 공간
스레드1 스레드2 스레드3 : 객체들의 공간

1개의 T메모리를 사용하지만, 내부의 스택 영역을 스레드의 개수만큼 나눈 것을 멀티 스레드라 한다.

각 스레드는 나눠져 있지만, 힙과 스태틱 영역은 공유되어 사용될 수 있다. 멀티 프로세스 대비 메모리 사용량이 적다.

 

2) 멀티 프로세스

static
클래스들의 공간
스택
메서드들의 공간

객체들의 공간
static
클래스들의 공간
스택
메서드들의 공간

객체들의 공간

다수의 T메모리를 갖는 구조이다. 즉, 다수의 저장공간을 가지고 있는 구조이다.

각자의 프로세스가 서로의 영역을 절대 침범할 수 없다. 안전하지만 메모리 사용량이 많다.

댓글