기타/개발일기

[TIL] JVM과 기본 문법

hu6r1s 2023. 12. 29. 18:18

오늘의 키워드

  • JVM
  • 자바 기본 문법

JVM

JVM은 `Java Virtual Machine`의 약자로 자바 가상 머신이다.

JVM 이해도

간단하게 JVM 동작을 이해할 수 있는 그림이다.

대충 이야기하자면 자바 컴파일러로 변환된 바이트 코드를 클래스 로더를 통해 메모리에 보내준다.

인터프리터는 바이트 코드를 가져와 기계어로 번역을 하고, JIT 컴파일러가 이를 보조하여 도와준다.

또 메모리에서 안쓰는 데이터를 처리해주는 Garbage Collector가 있다.

더 자세하게 JVM에 대해 공부할 수 있도록 글을 따로 정리해두었다.

2023.12.21 - [Language/Java] - JVM

 

JVM

JDK, JRE, JVM JDK, JRE, JVM에 대한 용어를 정리하자면 JDK : Java Development Kit / 자바 개발 도구 JRE : Java Runtime Environment / 자바 실행 환경 JVM : Java Virtual Machine / 자바 가상 기계 Java의 호환성 Java와 C언어의

hu-bris.tistory.com

JDK와 JRE

JVM이 나왔으니 JDK와 JRE도 간단하게 복기해보자.

JDK는 `Java Development Kit`의 약자로 자바 개발 도구이다.

JDK의 기능은 Java Compiler(javac)를 통해 `.java`파일을 `.class`파일로 변환하여 운영체제가 읽을 수 있도록 해준다.

또 다른 기능은 디버깅(JDB) 기능이다. JDK는 JRE와 JVM을 포함하고 있다.

 

JRE는 `Java Runtime Environment`의 약자로 자바 실행 환경이다.

이 JRE(JVM)만 있다면 자바 프로그램을 실행시킬 수 있다.

JRE는 `.class`파일만 실행할 수 있다.

기본 문법

사실 기본 문법에 대해서는 학습할 것이 지금까지는 따로 없었다.

그래서 그냥 과제를 한 것에 대해서 작성해보려고 한다.

과제는 그냥 단순한 입출력을 이용한 `요리 레시피 메모장 만들기`였다.

요리 레시피를 한 문장씩 10개를 입력받아야 하기 때문에 Scanner를 10개 사용하여 할 수는 있지만 귀찮고 보기 안 좋아 반복문을 통해 입력을 받고 반복문을 통해 출력시켜줬다.

그런데 문제점이 레시피를 입력받는데 첫 번째에 공백이 출력되는 것을 확인했다.

문제점을 찾아보고 해결했다.

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String title = sc.nextLine();
        float rating = sc.nextFloat();
        sc.nextLine();
        int rate = (int) rating;
        List<String> recipes = new ArrayList<String>(10);

        for (int i = 0; i<10; i++) {
            String recipe = sc.nextLine();
            recipes.add(recipe);
        }

        System.out.println("[ " + title + " ]");
        System.out.println("별점 : " + rate + " (" + rate / 5.0 * 100 + "%)");
        for (int i = 0; i<recipes.size(); i++) {
            System.out.printf("%d. %s%n", i+1, recipes.get(i));
        }
    }
}

문제는 nextFloat 메서드에서 발생했다.

nextFloat는 개행문자를 제외하고 데이터를 가져오기 때문이다.

만약 rating을 4.5로 입력했을 때 버퍼에는 4.5\n가 존재한다. nextFloat는 개행을 제외하고 4.5를 가져오고 버퍼에는 아직 \n이 남아있고, 이후 데이터를 입력하면 개행과 공백을 포함하는 nextLine을 했을때 먼저 들어가있는 개행을 가져오게 된다.

이를 해결하기 위해서 두가지 방법이 있다.

첫 번째로는 nextFloat 밑에 Scanner.nextLine() 추가하는 것이고, 두 번째는 Scanner.nextLine()으로 입력받고 Integer.parseInt()로 변환하는 것이다.

회고

우테코 프리코스에서 자바를 이용해서 과제를 수행한 경험이 있지만 문법에 대해서 제대로 알지 못하는 상태로 했다.

이번 기회로 자바 공부를 각 잡고 열심히 해서 좋은 개발자가 되도록 노력하자.