본 게시글은 하단 책을 읽고 학습한 내용을 제 생각으로 요약, 정리한 글입니다.
목차
1. 자바 프로그램의 개발과 구동
- 현실 세계
- 개발 도구 이용해 개발된 프로그램이
- 운영체제 통해
- 물리적 컴퓨터인 하드웨어 상에서 구동됨
- 자바의 가상 세계
- 자바 개발 도구(JDK) 이용해 개발된 프로그램이 → 자바 소스 컴파일러 javac.exe 포함
- 자바 실행 환경(JRE) 통해 (즉, JRE는 JVM용 OS인 셈) → 자바 프로그램 실행기 java.exe 포함
- 가상의 컴퓨터인 자바 가상 기계(JVM) 상에서 구동됨
2. 자바의 절차적/구조적 프로그래밍적 특징
- 절차적 프로그래밍: goto 사용 금지(인간이 이해하기 복잡해져서)
→ 대신 제어 흐름 위해 순서도, 제어문 사용
- 구조적 프로그래밍: 함수 사용(중복 코드 제거, 논리 분할), 지역 변수 사용 권장
3. 자바 프로그램이 메모리를 사용하는 방식
- 코드 실행 영역
- 데이터 저장 영역 (T 메모리 구조)
- 스택 영역 - 메서드가 사용
- 스태틱 영역 - 클래스가 사용
- 힙 영역 - 객체가 사용
4. main() 메서드를 실행하는 동안의 T 메모리 변화 (메서드 스택 프레임)
- JRE(OS, 자바 프로그램 실행 환경)가 프로그램 안에 main() 메서드 있나 확인함
- JRE가 JVM(가상 기계)을 부팅함
- JVM이 java.lang 패키지(println 메서드 쓰게 해줌)를 스태틱 영역에 갖다 놓음 (전처리)
- JVM이 개발자가 작성한 모든 클래스(Start)와 임포트 패키지를 스태틱 영역에 갖다 놓음 (전처리)
- main() 메서드 스택 프레임이 스택 영역에 놓임
- 스택 프레임: 클래스 정의와 관련된 걸 제외하고서, 여는 중괄호를 만나면 스택 프레임이 하나 만들어지고, 닫는 중괄호 만나면 스택 프레임이 하나 소멸됨.
- main() 메서드 인자의 변수 공간을 스택 프레임 맨 밑(스택 영역)에 할당함
- main() 메서드 안의 명령문 실행하고, main() 메서드 끝을 나타내는 닫는 중괄호 만남
- main() 메서드의 스택 프레임이 스택 영역에서 소멸됨
- JRE가 JVM을 종료함. JRE도 사라짐.
5. 변수가 있는 main() 메서드를 실행하는 동안의 T 메모리 변화
- main() 메서드 스택 프레임 안의 밑에서부터 변수 공간을 마련함
- 선언 안 한 변수는 쓰레기 값(이전에 해당 공간의 메모리 사용한 타 프로그램이 두고 간 값)을 가짐
6. 블록이 있는 main() 메서드를 실행하는 동안의 T 메모리 변화 (블록 스택 프레임)
- main() 메서드 스택 프레임 안에 if 문의 블록 스택 프레임이 중첩되어 놓임
- m은 if(true) 스택 프레임 안의 밑에서부터 변수 공간이 할당됨
- k는 if 스택 프레임 밖에 있지만 연산에 참여시킴
- if 블록 종료하는 닫는 중괄호 만나면 if 블록 스택 프레임 사라짐. if 내부의 변수 저장공간도 사라짐
7. 변수
- T 메모리에서의 위치
- 지역 변수: 스택 영역의 스택 프레임 안
- 스택 프레임(지역) 소멸 시 함께 소멸
- 스택 프레임(지역) 안에서만 사용 가능. 외부에선 사용 불가.
- 클래스 멤버 변수: 스태틱 영역
- JVM(가상 기계) 가동될 때 생성되어, JVM 종료될 때 소멸
- ex) main() 메서드의 변수
- 객체 멤버 변수: 힙 영역
- 객체 생성자에 의해 객체 생성 시 생성되어, 힙 메모리 회수기(가비지 컬렉터)에 의해 객체 소멸 시 함께 소멸
- 외부 스택 프레임(블록)에서 내부 스택 프레임(블록)의 변수에 접근하는 것은 불가능하나,
내부 스택 프레임(블록)에서 외부 스택 프레임(블록)의 변수에 접근하는 것은 가능함.
예시
→ if 스택 프레임 안의 변수(지역변수)는 if문 블록이 끝나고 나면, 메모리에서 if 스택프레임과 함께 사라지기 때문에, if문 블록 바깥에선 이 변수에 접근 불가함.
→ if 스택 프레임 안의 변수(지역변수)는 if문 블록이 시작하기 전엔, 메모리에 존재하지 않기 때문에, if문 블록 바깥에선 이 변수에 접근 불가함.
→ if 스택 프레임 외부의 변수(main 스택 프레임 안의 지역변수)는 if 스택 프레임 존재 여부와는 상관 없이, 메모리 상에 존재하기 때문에, if문 블록 내부에서 이 변수에 접근 가능함.
8. 메서드 호출이 있는 main() 메서드를 실행하는 동안의 T 메모리 변화 (메서드 스택 프레임 2)
- square() 메서드 호출 → square() 메서드의 스택 프레임이 스택 영역에 생성됨
- square() 메서드 스택 프레임 내부 모습: 반환값, 인자, 메서드의 지역변수 순으로 아래부터 자리잡음
- 반환값: 메서드 종료시 반환해 줄 값을 갖고 있는 가상의 변수
- Call by Value(값에 의한 전달): square() 메서드의 인자 변수에 무슨 짓을 해도 main() 메서드에서 인자로 넘겨진 변수는 영향 받지 않음. 값을 복사해서 전달해줬기 때문임.
- 메서드의 블랙박스화: 인자와 반환값에 의해서만 메서드 사이에 값이 전달될 뿐, 서로 내부의 지역 변수를 볼 수 없음(접근 불가능)
- main() 메서드는 square()메서드의 지역변수에 접근 불가함.
- square() 메서드는 main() 메서드의 지역변수에 접근 불가함.
→ 이유: 호출문 실행 전엔 square() 메서드의 스택 프레임이 아직 존재하지 않고, 호출문 실행 후엔 square() 메서드의 스택 프레임이 사라진 상태이기 때문임.
→ 이유: 자바에서 금지함
→ 자바가 이를 금지한 이유: 자바엔 포인터가 없어서, 메서드는 서로의 고유 공간이라서
9. 전역 변수
→ 쓰지 말자
10. 멀티 스레드/멀티 프로세스
- 멀티 스레드
- 정의: 하나의 T 메모리만 사용하는데 스택 영역만 스레드 개수만큼 분할해서 사용하는 구조
- 장점: 하나의 T 메모리만 써서 메모리 적게 사용
- 단점: 스택 영역만 분할한 것이라 스태틱, 힙 영역은 공유해서 사용함 (안전성 떨어짐)
- 멀티 프로세스
- 정의: 각 프로세스마다 각자의 T 메모리가 있는 구조. 즉, 다수의 T 메모리를 사용하는 구조
- 장점: 하나의 프로세스가 다른 프로세스의 T 메모리 영역을 절대 침범할 수 없음 (안전함)
- 단점: 다수의 T 메모리를 써서 메모리 많이 사용
