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