반응형
* 변수의 종류 (매우 중요)
클래스 안에 포함된 스태틱 필드, 논스태틱 필드 (인스턴스 필드) 가 있고 그 아래에
void mian() 안에 포함된 로컬 변수 int c;, exa,100 obj; obj = new exam100(); 등이 있다.
exam100() 안에는 v1,v2라는 인스턴스 변수가 있다.
Method Area: 클래스 로딩 및 정적(static) 필드 (Static 변수)
JVM Stack: 메서드 호출 및 로컬 변수 (로컬 변수)
Heap: 인스턴스 생성 및 인스턴스 필드 (인스턴스 변수)
1.클래스 로딩 (Method Area)
2.static 필드 생성 (Method Area)
3.main() 호출 (JVM Stack)
4.main()이 사용할 로컬 변수 생성 (JVM Stack)
5.인스턴스 생성 (Heap)
6.exam100 설계도에 따라 인스턴스 필드 생성 (Heap)
7.인스턴스 주소 저장 (JVM Stack)
// ## 클래스 로딩 과정
// $ java com.eomcs.oop.ex03.Exam0130
// 1) 클래스 파일 'Exam0130.class'을 찾는다.
// - JDK에서 제공하는 기본 라이브러리에서 찾는다.
// - JVM을 실행할 때 -classpath(또는 -cp) 지정한 CLASSPATH 디렉토리에서 찾는다.
// - CLASSPATH에 없으면 JVM을 실행하는 현재 폴더에서 찾는다.
// - 그래도 없으면 오류를 띄운다.
// 2) 바이트코드 검증(Verify)
// - 클래스의 바이트코드 유효성을 검사한다.
// 3) Exam0130.class를 "Method Area 영역"에 로딩한다.
// - 즉 클래스를 외부 저장소(HDD)에서 내부 저장소(RAM)로 로딩한다.
// - bytecode를 분석하여 코드(생성자, 메서드)와 상수를 따로 분리하여 보관한다.
// 4) 스태틱 필드 및 메서드 테이블 준비(Prepare)
// - Method Area 에 스태틱 필드 생성한다.
// - 클래스 내부에서 사용하는 이름(변수명, 메서드명, 클래스명 등) 목록을 준비한다.
// 5) 참조하는 외부 클래스나 인터페이스 검사(Resolve)
// - 로딩된 클래스가 참조하는 외부 클래스나 인터페이스의 유효성을 검사한다.
// 6) 클래스 초기화시키기
// - 스태틱 블록(static initializers)을 실행한다.
// 7) main() 메서드를 호출한다.
// - 클래스를 실행하는 것이라면 main() 메서드를 찾아 실행한다.
// ## Exam0130의 main() 메서드 호출
// 1) main() 메서드에 선언된 로컬 변수를 "JVM 스택 영역"에 생성한다.
// - args 변수를 스택 영역에 생성한다.
// 2) main()의 코드를 실행한다.
// - A.v1 = 100;
// => A.class 를 "Method Area"에 로딩한다.
// => A의 클래스(스태틱) 필드를 "Method Area"에 생성한다.
// => `A.v1 = 100` 문장을 실행한다.
// - A.v2 = true;
// => A 클래스가 이미 로딩되었기 때문에 다시 로딩하지 않는다.
// => `A.v2 = true` 문장을 실행한다.
// - Syste m.out.printf() 를 실행한다.
//
// ## JVM이 관리하는 메모리 영역
// 1) Heap
// - new 명령으로 생성한 인스턴스 변수가 놓인다.
// - 즉 인스턴스 필드가 이 영역에 생성된다.
// - 메서드는 생성하지 않는다!
// - 가비지 컬렉터는 이 메모리의 가비지들을 관리한다.
// 2) JVM Stack
// - 각 스레드가 개인적으로 관리하는 메모리 영역이다.
// - 스레드에서 메서드를 호출할 때 메서드의 로컬 변수를 이 영역에 만든다.
// - 메서드가 호출될 때 그 메서드가 사용하는 로컬 변수를 프레임에 담아 만든다.
// - 메서드 호출이 끝나면 그 메서드가 소유한 프레임이 삭제된다.
// 3) Method Area
// - JVM이 실행하는 바이트코드(.class 파일)를 두는 메모리 영역이다.
// - 바이트코드를 그대로 메모리에 두는 것이 아니라, 멤버의 종류에 따라 적절하게 분류한다.
// - 즉 클래스 코드가 이 영역에 놓이는 것이다.
// - JVM은 코드를 실행할 때 이 영역에 놓은 명령어를 실행하는 것이다.
// - 개발자가 작성한 클래스, 메서드 등 이런 코드들이 이 영역에 놓이는 것이다.
// - 스태틱 필드를 이 영역에 생성한다.
// - 주의!
// Heap에는 개발자가 작성한 명령어가 없다.
스태틱 메소드는 this 를 쓸 수가 없다.
논스태틱 (인스턴스) 메소드는 this 가 없어도 자동으로 생성된다.
객체 A obj = new.A();
를 생성하면. 해당 obj (레퍼런스,객체)는 스태틱 변수가 아니라 인스턴스 변수만 참조할 수 있다.
* 자바 CRUD 프로젝트 - Datetime 적용하기
public static void printBoards() {
System.out.println("---------------------------------------");
System.out.println("번호, 제목, 작성자, 조회수, 작성일");
System.out.println("---------------------------------------");
for (int i = 0; i < length; i++) {
Board board = boards[i];
System.out.printf("%d, %s, %s, %d, %tY-%5$tm-%5$td-%5$tH:%5$tM\n", board.getNo(),
board.getTitle(), board.getWriter(), board.getViewCount(), board.getCreatedDate());
}
}
반응형