✔️ 이 글은 [스프링 입문을 위한 자바 객체 지향의 원리와 이해 - 김종민] 도서를 바탕으로 정리한 글입니다.
자바 프로그램의 개발과 구동
- JVM(Java Virtual Machine)
- 자바 가상기계로 가상의 컴퓨터
- JRE(Java Runtime Environment)
- 자바 실행 환경으로 가상의 컴퓨터를 제어하는 운영체제
- 자바 프로그램 실행기인 java.exe와 JVM을 포함
- JDK(Java Development Kit)
- 자바 개발 도구로 라이브러리 등에 해당
- 자바 소스 컴파일러 javac.exe와 JRE를 포함
코드 실행 영역와 데이터 저장 영역으로 분리되는데, 객체 지향에서 데이터 저장 영역은 Static, Stack, Heap 영역으로 나누어서 사용한다.
자바에 존재하는 절차적/구조적 프로그래밍의 유산
절차적 프로그래밍이란 goto를 사용하지 않게 해 돌아가지 않고, 코드를 순서대로 수행하게 하는 것이고, 구조적 프로그래밍은 논리를 함수 단위로 분리하고, 공유 사용시 문제가 발생하기 쉬운 전역 변수 보다는 지역변수를 사용하라는 등의 지침을 의미한다.
Fuction과 Method의 차이점
절차적/구조적 프로그래밍에서는 함수(Function)이라 부르는데 함수는 클래스나 객체와 아무 관계가 없다. 반면에, 메소드(Method)는 객체 지향에서 함수를 지칭하는 단어로 반드시 클래스 정의 안에 있어야 한다.
다시 보는 main() 메소드 : 메소드 스택 프레임
main 실행 과정
- JRE가 프로그램 안에 main()이 있는지 확인
- main()의 존재가 확인되면 JRE는 프로그램 실행을 위해 JVM에 전원을 넣어 부팅
- JVM은 목적 파일(.class)을 받아 실행하고 전처리 단계 수행 -> java.lang 패키지 및 파일 안의 클래스들과 import 패키지들을 Static 영역에 저장
- main() 메소드의 여는 중괄호를 만나면 Stack Frame(함수의 호출 정보)이 Stack 영역에 할당
- main() 메소드 인자와 지역 변수를 저장할 공간을 Stack Frame의 맨 밑에 할당
- main() 메소드 안의 내용을 수행
- main() 메소드의 닫는 중괄호를 만나면 Stack Frame이 소멸
- main() 메소드의 Stack Frame이 소멸되면 JRE는 JVM을 종료하고, JRE 자체도 운영 체제 상의 메모리에서 사라짐
변수와 메모리: 변수! 너 어디 있니?
메소드의 안의 변수들은 Stack Frame 공간에 할당된다.
블록 구문과 메모리: 블록 스택 프레임
if문을 만나고 조건이 참일 때, if 문의 블록 Stack Frame이 main() 메소드 안에 중첩되어 생성된다. if 문이 참일 때의 블록을 종료하는 닫는 중괄호를 만나면 if 블록 Stack Frame은 Stack 영역에서 소멸된다.
지역 변수와 메모리 : 스택 프레임에 갇혔어요!
- 지역 변수 : 스택 영역에 저장, 스택 프레임이 사라지면 함께 사라짐
- 클래스 멤버 변수 : 스태틱 영역에 저장, JVM이 종료될 때 사라짐
- 객체 멤버 변수(인스턴스 변수) : 힙 영역에 저장, 객체와 함께 가비지 컬렉터에 의해 사라짐
- 매개 변수 : 스택 영역에 저장
메소드 호출과 메모리: 메소드 스택 프레임 2
main() 메소드 외의 다른 메소드가 호출되면 그 메소드에 대한 스택 프레임을 스택 공간에 할당해준다. 다른 메소드를 닫는 중괄호를 만나면 그 메소드 스택 프레임은 소멸된다.
자바에서 포인터를 사용할 수 없어 스택 프레임끼리 변수를 참조하는 것은 불가능하다.
전역변수와 메모리: 전역 변수 쓰지 말라니까요!
클래스 멤버 변수는 변수가 선언된 클래스가 스태틱 영역에 할당될 때 같이 공간을 할당 받는다.
전역 변수인 클래스 멤버 변수는 프로그램 어디에서든지 접근이 가능하고, 객체 멤버 변수는 해당 클래스 내의 모든 메소드에서 접근이 가능하다.
스태틱에 할당되는 클래스 멤버 변수는 프로그램이 종료될 때까지 메모리 공간을 차지하고 있기 때문에 남발하면 안된다.
멀티 스레드/ 멀티 프로세스의 이해
멀티 스레드
- 스택 영역을 스레드 개수만큼 분할해서 사용
- 스택 영역만 분할한 거라 스태틱 영역와 힙 영역은 서로 공유
- 메모리 사용량 작음
멀티 프로세스
- 데이터 저장 영역 여러개를 사용
- 서로 참조 불가능
- 메모리 안전한 구조
- 메모리 사용량 큼
멀티 스레드에서의 전역 변수 사용의 문제점
쓰기 가능한 전역변수를 사용하게 되면 스레드의 안전성이 깨지기 때문에 문제가 발생할 수 있다.
'도서 > 스프링 입문을 위한 자바 객체 지향의 원리와 이해' 카테고리의 다른 글
[도서/스프링 입문] #6 스프링이 사랑한 디자인 패턴 (0) | 2023.01.17 |
---|---|
[도서/스프링 입문] #5 객체 지향 설계 5원칙 - SOLID (1) | 2023.01.17 |
[도서/스프링 입문] #4 자바가 확장한 객체 지향 (0) | 2023.01.14 |
[도서/스프링 입문] #3 자바와 객체 지향 (0) | 2023.01.14 |
[도서/스프링 입문] #1 사람을 사랑한 기술 (0) | 2023.01.14 |