[스프링 입문을 위한 자바 객체 지향의 원리와 이해] Chapter 1, 2정리

구범모·2023년 7월 13일
0

개구리책

목록 보기
1/6
post-thumbnail

Chap 1

이해한 내용

자바와 특히 스프링은, 객체지향의 꽃이다. 따라서 이책에서 객체지향을 알아가야 한다.

Chap 2

이해한 내용

자바의 메모리 구조

  1. 코드 실행 영역
  2. 데이터 저장 영역

이렇게 두가지로 나뉘는데, 데이터 저장 영역은 다시 세가지로 나뉘어

2-1. 스태틱 영역 (클래스들이 위치)

2-2. 스택 영역 (메서드들이 위치)

2-3. 힙 영역 (객체(아마 레퍼런스 변수)들이 위치)

으로 나뉘게 된다.

추가적으로 데이터 저장 영역을 T메모리 구조라고도 부른다. 또한 코드 실행 영역은 low level을 공부할 거면 굳이 깊게 학습할 필요가 없다.

프로그램 실행 과정

public class MyClass {
	public static void main(String[] args) {
		System.out.println("Hello Wolrd");
	}
}

위 프로그램의 실행 과정을 살펴보자.

  1. JRE가 프로그램 내의 main()함수를 살펴본다. (여기서 MyClass뿐만이 아닌, 전체 자바 파일을 살피는 건가?)
  2. main()을 찾은 이후 JVM을 부팅시킨다.
  3. 부팅된 JVM은 오브젝트 파일을 받아 해당 파일을 실행시킨다.
  4. JVM은 전처리(preprocessing)를 제일 먼저 한다.
    1. java.lang 패키지를 스태틱 영역에 위치시킨다.(이 덕에 sout 사용 가능.)
    2. 다음으로 import된 패키지들과 클래스(현재 예시에선 MyClass)들 역시 스태틱 영역에 위치시킨다.
  5. 제일 먼저 main을 만나게 되어 main의 스택 프레임이 할당되고, 해당 스택프레임에 파라미터인 String[] args를 push한다. 이후, (한 줄씩 절차적으로 이동하면서) 클래스 내부의 모든 메서드들을 스택영역에 할당한다.
  6. 메서드가 스택영역에 push되는 경우는 여는 중괄호를 만날 때이고, pop되는 경우는 닫는 중괄호를 만날 때이다. 이때 main의 닫는 중괄호를 만나게 되면 JRE가 JVM을 종료한 이후 JRE또한 OS상의 메모리에서 사라진다.

1,2번이 JRE가 하는 일이고, 3, 4, 5번이 JVM이 하는 일이다.

알게 된 내용

  1. 자바에서 const는 사용하지 않고, final이 상수의 역할을 대신 하는듯 하다.
  2. if()문을 만나면, 스택 영역에 따로 if문에 대한(if문을 위한) 스택프레임이 할당된다. → 만약 컴파일 시에 if문의 참거짓을 판단 못하면, if, else 분기문 둘다 각각 스택프레임이 할당되나 ?
  3. 스태틱 영역 내에 있는것들의 생명주기는 JVM의 생명주기와 같다.(프로그램이 끝날 때 까지)
  4. 메서드 내에서에서 메서드를 만나면, 기존 메서드의 스택 프레임 위에 ****새로운 스택 프레임이 할당되고,

하나의 메소드 안에서 분기문을 만나게 되면, 그냥 그 메소드의 스택프레임안에 분기문의 스택 프레임이 새로 하나 할당된다.

  1. 메서드의 스택 프레임에는 순서대로 1. 리턴값, 2. 파라미터, 3. 지역변수가 push된다.
  2. 멀티스레드는 같은 T메모리를 사용하고, 스택 영역만 스레드 개수만큼 분할해서 쓰는 것이다. 따라서 스레드끼리 스태틱, 힙영역은 공유하기 때문에 해당 영역들의 변수 또한 공유된다.
public class StaticPractice {
    static int test1;

    public static void main(String[] args) {
        int test2;
        System.out.println(test1); // 0
//        System.out.println(test2); // 컴파일 에러.
    }
}

위 코드처럼 static은 초기화를 안해도 각 타입의 디폴트값으로 초기화가 돼있는 반면, 지역변수는 초기화가 안 돼있다.

profile
우상향 하는 개발자

0개의 댓글