자바의 변수와 메서드는 메모리에 어떻게 표시될까 2

자바의 변수와 메서드는 메모리에 어떻게 표시될까 2

 

전역변수와 메모리

두 메서드 사이에 값을 전달하는 방법은 메서드를 호출할때 인자를 이용하는 방법과 메서드를 종료할 때 반환값을 넘겨주는 방법이 있다.

또한 한가지 방법이 더 있는데, 그것은 바로 전역 변수를 사용하는 것이다.

 

 

share 변수에 static 키워드가 붙어 있다. 그래서 share 변수는 스태틱 영역에 변수 공간이 할당 된다.

그것도 class 안에 정의가 되었기 때문에 스태틱 영역에 배치될 때 그 안에 share 변수가 클래스의 멤버로 공간을 만들어서 저장된다.

 

7번째 줄을 실행하기 위해서 main 메서드 스택 프레임에 k 변수 공간이 만들어 진다.

이어서 제어는 fun() 메서드가 있는 12번째 줄로 넘어간다.

그럼 func() 메서드 스택 프레임이 생성되고 인자값들과 반환값을 저장할 변수 공간도 생긴다.

 

13번째 줄이 실행되고 나면 m 변수와 p 변수에 있는 값을 더해 share 변수에 할당한 상태가 된다.

 

 

코드의 15번째 줄을 실행하고 나면 메모리는 아래와 같아진다. 

 

5번째 줄과 13번째 줄에서 살펴본 것처럼 메서드 밖에서 선언된 변수 share는 메서드들 사이에서 공유해서 사용할 수 있는 전역 변수가 된다.

지역 변수와 전역 변수의 특징은 다음과 같다.

 

지역변수 : 스택에 종속적이다.

전역변수 : 스택에 독립적이다.

 

전역 변수를 쓰지 말라고 하는데 프로젝트의 규모가 커지면 전역 변수의 값을 파악하기 쉽지가 않기 때문이다.

따라서 전역 변수의 사용은 줄이고 대신 읽기 전용으로 값을 공유해서 전역 상수로 쓰는 것은 권장된다.

 

 

멀티 스레드와 멀티 프로세스의 이해

 

멀티 스레드는 메모리의 스택 영역을 스레드 개수만큼 분할해서 쓰는 것이다.

 

멀티 프로세스는 다수의 데이터 저장영역, 즉, 다수의 메모리를 갖는 구조이다.

 

 

멀티 프로세스는 각 프로세스마다 각자의 메모리가 있고 각자 고유의 공간이므로 서로 참조할 수 없다.

그와 반대로 멀티 스레드는 하나의 메모리만 사용하는데 스택 영역만 분할해서 사용하는 구조이다.

 

멀티 프로세스는 하나의 프로세스가 다른 프로세스의 메모리 영역을 절대 침범할 수 없는 메모리 안전한 구조이지만 메모리 사용량은 크다.

 

멀티 스레드는 하나의 메모리 안에서 스택 영역만 분할한 것이기 때문에 하나의 스레드에서 다른 스레드의 스택 영역에는 접근할 수 없지만 스태틱 영역과 힙 영역은 공유해서 사용하는 구조다. 따라서 멀티 프로세스 대비 메모리를 적게 사용할 수 있는 구조다.

 

멀티 스레드의 전역 변수 문제

두개의 스래드로 구성된 프로그램에서 스레드1이 공유영역(스태틱,힙)에 있는 전역 변수 A에 10을 할당했다.

그 후 CPU 사용권이 스레드 2로 넘어가고 스레드 2가 전역 변수 A에 20을 할당했다.

그리고 바로 CPU 사용권이 스레드 1로 넘어갔다면?

스레드 1로 넘어가서 A 변수에는 무슨 값이 출력이 될까?

 

정리

1.스태틱 : 클래스의 활동 공간

2.스택 : 메서드의 활동 공간

3.힙: 객체들의 활동 공간

 

 

 

참고 : 스프링 입문을 위한 자바 객체 지향의 원리와 이해