[F-Lab 모각코 챌린지 2일차] TIL

JeongheeKim·2023년 6월 2일

TIL

목록 보기
2/66

학습계획

  • 자바의 신 2장 읽고 연습문제 풀기
  • 클래스 로더와 클래스 로딩
  • 바이트코드를 컴파일하는 AOT, JIT 컴파일러
  • 어제 공부한 자바 동작방식 보완

연습문제

직접해 봅시다.

  1. 여러분의 이름을 출력할 Profile 클래스를 만들고, 그 클래스에 main()메소드를 만들어보자.

    public class Profile {
    	public static void main(String[] args) {
    		System.out.println("jeong hee kim");
    	}
    }
  2. Profile클래스의 main() 메서드에 “My name is OOO”이라는 값을 출력해주는 코드를 작성해 보자.

public class Profile {
	public static void main(String[] args) {
		String name = "jeong hee kim";
		System.out.println("My name is " + name);
	}
}
  1. Profile클래스의 main() 메서드에 “My age is OOO”이라는 값을 출력해주는 코드를 작성해 보자.

    public class Profile {
    	public static void main(String[] args) {
    		int age = 31;
    		System.out.println("My age is " + age);
    	}
    }

정리해봅시다.

  • main() 메소드의 메소드 이름 앞에는 어떤 예약어들이 들어 가나요? (순서대로 쓰세요)*

    public class Profile {
    	public static void main(String[] args) {
    	//접근제한자 + 예약어 //리턴타입
    	}
    }
  • main() 메소드의 매개변수에는 어떤 값이 들어가나요?

    메인메소드에 전달되는 매개변수는 String배열이어야한다. 매개변수에는 java-command-line parameter가 들어간다.

    → 예를들어 java Profile one two 이렇게 command line으로 실행하면 args배열 요소로 one, two가 들어간다. 이러한 부분이 실제로 어떻게 쓸 수 있는지 잘 모르겠다..

  • 만약 여러분들이 만든 클래스에 main() 메소드가 없다면, java 명령어로 그 클래스를 수행할 수 있나요?

    • 없습니다. Exception in thread “main” java.lang.NoSuchMehotdError : main 에러를 볼 수 있는데 main 메서드는 자바프로그램 실행의 엔트리 포인트이기 때문에 반드시 하나 존재해야한다.
      오류: Profile 클래스에서 기본 메소드를 찾을 수 없습니다. 다음 형식으로 기본 메소드를 정의하십시오.
         public static void main(String[] args)
  • System.out.println() 메소드는 어떤 용도로 사용하나요?

    console화면에 데이터를 출력하는 기능을 한다.

  • System.out.print() 메소드는 System.out.println() 메소드와 어떤 차이가 있나요?

    println() : 괄호안의 내용을 출력한다.

    println() : 괄호안의 내용을 출력하고 다음라인으로 넘긴다.

  • // 는 무엇을 하는데 사용하는 기호인가요?

    라인 한줄을 주석처리한다.

  • / 로 시작하고, /로 끝나는 사이에 있는 소스들을 어떻게 되나요?

    • 여러줄이 한꺼번에 주석 처리된다.
  • 메소드를 선언할 때 반드시 꼭 있어야 하는 세가지는 무엇인가요?

    • 메소드 명, 리턴 타입, 매개변수

Java 동작 방식

  1. 프로그래머가 자바 .java파일 을 작성한다.

  2. javac compiler에 의해 .java.class 파일로 컴파일 된다. .class파일은 JVM이 이해할 수 있는 바이트 코드로 구성되어있다. 바이트 코드로만은 실행이 불가하다.

  3. JVM에서 인터프리터에 의해 머신코드(기계가 이해할 수 있는 언어)로 해석된다.

    1. Class Loader를 통해 바이트코드를 JVM으로 로딩
  4. 컴파일 된 다음 자바 launcher가 .class파일을 실행 시킨다. = 로딩된 바이트 코드는 Execution Engine을 통해 해석된다.

  5. 해석된 바이트 코드는 Runtime Data Areas에 배치되어 실행됨

    1. 실행 시 GC같은 작업수행

    .class파일 JVM에서 실행되므로 OS에 구속되지 않고 어느 운영체제에서 실행 가능하다.

Java Platform

Java Platform은 소프트웨어로만 구성되어있다.

  • Java API
    • API는 이미 유용한 기능을 모아놓은 기능이다.
  • JVM JVM 구성
    • Class Loader
    • Execution Engine
      • Interpreter
      • JIT Compiler
      • Garbage Collector
    • Runtime Data Area

클래스 로더와 클래스 로딩

클래스 로더는 컴파일된 바이트 코드(.class)파일을 아래 세단계를 거쳐 거쳐 Runtime Data Area에 저장된다.

  1. Loading
    1. JVM으로 바이트 코드(.class)파일을 로드
  2. Linking
    1. 링크를 통해 배치하는 작업을 수행
  3. Initialization
    1. 클래스 파일을 메모리에 올리는 기능. 한번에 올리지 않고 호출된 부분만 동적으로 메모리에 올린다.

바이트코드를 컴파일하는 AOT, JIT 컴파일러

AOT(Ahead-Of-Time)

  • 빌드하는 동안 미리 컴파일하여 속도가 상대적으로 빠르다.
  • CPU에 부하가 적다.

JIT(Just-In-Time)

  • 빌드 될때 컴파일되는것이 아닌 런타임 시 컴파일 된다.
  • 한번에 모든 코드가 컴파일 되는건 아니고 프로그램 시작 시 필요한 부분만 컴파일 된다.
  • CPU사용량이 AOT에 비해 높다

JVM과 메모리 구조

Runtime Data Area는 자바 어플리케이션 실행 시 사용되는 OS에서 할당받은 메모리 공간

  • Method Area
    • 클래스 멤버변수, 데이터 타입, 접근제어자 등의 필드 정보
    • 메소드의 이름, 리턴타입, 파라미터등의 메소드 정보
    • Class, Interface여부, Super class 이름 등 타입정보
    • Method Constant Pool
      • 상수 자료형을 저장하여 참조하는 역할
      • GC의 관리 대상
class Person {
    int id;
    String name;

    public Person(int id, String name) {
        this.id = id;
        this.name = name;
    }
}

public class PersonBuilder {
    private static Person buildPerson(int id, String name) {
        return new Person(id, name);
    }

    public static void main(String[] args) {
        int id = 23;
        String name = "John";
        Person person = null;
        person = buildPerson(id, name);
    }
}
  New generation = Eden + S0(Survival0), S1(Survival1) , old generation

  - 새로운 객체 Eden영역에 생성. Eden영역의 메모리가 차면 GC 동작 시작

  이때 발생하는 GC를 Minor GC라 함.

  GC가 동작하면서 Mark, Sweap 동작이 발생하며, Eden에서 살아남은 객체는 S0으로 이동

  - new 키워드로 생성된 객체가 저장되는 위치
  - GC의 관리 대상
  • Stack Area
    • heap영역에 생성된 object타입의 데이터의 참조값 할당 → 메인메소드 끝나면 stack영역 날아감
    • 변수 및 파라미터 등 연산에 사용되는 값이 임시 저장되는 영역
  • PC Register
    • Thread가 생성될 떄 마다 생성되는 영역
  • Native Stack Area
    • 자바로 작성된 네이티브 코드를 위한 메모리 영역

0개의 댓글