잘 준비를 마치고 유튜브에서 우연히 자바강의를 찾아서 홀린듯이 보게되었다.
자바를 구조적으로 프로그래밍 하는 방법을 알려주는 강의였다. 그 중 마지막 강의를 보게 되었는데 코드 실행과 함수 호출 스택에 대한 내용을 다루었다.
자바 프로그램이 실행되어 프로세스가 되고, 프로세스의 실행 순서에 따라 코드, 레퍼런스 혹은 일반 변수, 인스턴스가 각각 text, stack, heap 영역에 어떻게 저장되는지 알 수 있었다.
프로그램이 실행되면 작성한 코드들이 바이너리 형식으로 text영역에 로드된다. 이후 main 함수가 호출되기 전에 main함수에 필요한 변수들이 stack 영역에 로딩되고, 인스턴스가 생성되면 동적 메모리 공간인 heap영역에 할당되며 레퍼런스 변수는 heap 메모리 주소값을 가진다.
프로세스가 실행되며 더 이상 참조되지 않는 인스턴스는 가비지 컬렉터에 의해 메모리에서 해제된다.
이 강의를 듣고 일반 변수는 값을 어떻게 저장하는지 궁금해져 찾아보게 되었다.
정수의 저장
10이라는 정수 리터럴을 a에 저장한다고 가정하자.
int a = 10;
리터럴은 메소드 영역(heap과 구분되어 설명되지만, 자바 공식문서에 따르면 logical 하게는 heap에 속한다.)의 Runtime Constant Pool 이라는 메모리 영역에 할당되며 변수는 이 리터럴의 값을 복사하여 저장한다. (constant는 상수, 불변의 등의 의미를 가진다.)
다시 10이라는 정수를 b에 저장한다고 가정하자.
b는 이전에 생성되었던 Constant Pool의 리터럴 10을 참조하며 a 와 b는 동일한 주소를 가리키게 되고 a==b가 성립되는 것이다. ( == 는 주소값을 비교한다 )
복사하여 저장한다. (== 연산은 기본적으로 주소값을 비교하지만 피연산자 중 하나라도 원시타입 변수라면 값을 비교한다)
문자열의 저장
그렇다면 String은 어떻게 값을 저장할까
String str = "문자열";
먼저 String 타입 변수 str이 Stack 프레임 영역에 저장된다. 이후 “문자열”은 Constant Pool 영역에 저장되고, 변수 str 은 “문자열”의 주소값을 가리키게 된다.
나는 지금까지 새로운 지식을 습득하기 급급했다. 왜? 라는 질문을 하지 않게 되었고 습득한 내용은 이미 알고 있다고 생각하여 되돌아 보지 않았다. 지금까지의 학습 방식을 되돌아보고 반성할 필요가 있다.
지금은 구조적인 프로그래밍 강의를 처음부터 보고있다. 나는 지금까지 객체지향 보다는 구조적에 가까운 프로그래밍을 하고 있었던 것 같다. 이 강의를 보고 난 이후 OOP에 대해 다시 공부하려 한다.
지금 딱 생각나는 사진이 있다.
나는 지금 우매함의 봉우리에서 절망의 계곡으로 가는 중이다.. “나는 도대체 아는 게 무엇인가”
Reference
'JAVA' 카테고리의 다른 글
[JAVA] 코드의 배포와 재사용 (0) | 2023.03.24 |
---|---|
[JAVA] 객체지향은 왜 생겼고 캡슐화는 뭘까? (0) | 2023.03.24 |
[JAVA] 상속 (Inheritance) - Is A (0) | 2023.03.23 |
[JAVA] 얕은 복사와 깊은 복사 (0) | 2023.03.23 |
[JAVA] 싱글톤 패턴 (Singleton pattern) (0) | 2023.03.22 |