JAVA/자바의 신

2장. Hello God Of Java

hyunsb 2024. 1. 3. 20:00
💡 해당 글은 『자바의 신 3판』을 복습하며 도서의 내용과 본인의 생각을 정리한 글입니다.

☁️ 내용정리

 

터미널에서 자바 프로그램 작성하고 실행하기

% java [-options] class [args...]        // .class 파일 실행
% java [-options] jar jarfile [args...]  // .jar 파일 실행

JAR? Runnable JAR?

터미널에서 JAR파일 생성하기

% vi GodOfJava.java

커맨드에서 java파일을 생성하고 아래와 같이 작성한다.

public class GodOfJava {
     public void main(String[] args) {
        System.out.println(String.join(", ", args));
    }
}

javac 명령어를 사용하여 .java 파일을 컴파일하면
바이트 코드로 구성된 .class 파일이 생성되는 것을 확인할 수 있다.

% javac GodOfJava.java 
% ls
GodOfJava.class    GodOfJava.java

이제 실행시켜보자.

% java GodOfJava Hello god of java
Hello, god, of, java

여기까지가 커맨드에서 자바 파일을 생성하고 컴파일 후 실행하는 과정이다.

 

정리해보면

  1. 소스코드를 작성하고 자바 파일로 저장한다.
  2. javac(자바 컴파일러)가 .java 파일을 컴파일하여 .class 바이트 코드 파일을 생성한다.
  3. java 명령어를 사용하여 .class 파일을 실행하면,
    JVM에 의해 기계어로 해석되거나 JIT 컴파일러에 의헤 플랫폼에 맞는 기계어로 해석된다.

 

Path

java 명령어는 어느 위치에서나 실행시킬 수 있다.

JDK를 설치한 bin 디렉터리를 path로 등록해놨기 때문이다.

mac에선 아래와 같이 path로 등록되어 있는 bin 디렉터리를 확인할 수 있다.

% echo $PATH | tr ':' '\n'

/usr/local/bin
/usr/local/sbin
...

 

 

주석

// 한 줄 주석이다

/* 여러 줄을 위한 주석이다 */

/** 
* 문서용 주석이다
*/

주석은 컴파일 시 컴파일러에 의해 삭제된다.

.class 바이트코드를 디컴파일해보면 주석이 삭제된 모습을 볼 수 있다.

 

 

☁️ 의문

바이트 코드는 javap 명령어를 통해 disassemble하여 해석할 수 있고, 예전에 분석도 해본적이 있다.

그런데 cat 명령어로 바이트 코드를 열어보면 어떻게 될까?

 

오잉? 깨질 것 이라고 생각은 했는데, 생각한 것과는 좀 다르게 깨진다.

hyunsb@HyunsbMac godofjava % cat GodOfJava.class
?????

java/lang/Object<init>()V    

java/lang/SystemoutLjava/io/PrintStreamHello God Of Java!

java/io/PrintStreamprintln(Ljava/lang/String;)V    GodOfJavaCodeLineNumberTablemain([Ljava/lang/String;)V

 

바이트 코드와 바이너리 코드

바이트 코드: 가상머신이 이핼할 수 있는 언어

바이너리 코드: CPU가 이해할 수 있는 언어

즉, javac를 통해 컴파일한 코드는 JVM이 읽을 수 있는 바이트 코드이고, JVM이 바이트 코드를 읽어들여 기계어로 환시키면 그게 바이너리 코드이다.

 

메인 메서드의 매개변수 args

메인 메서드의 스트링타입 배열 매개변수 args는 자바 프로그램 실행 시 입력한 문자열이 들어온다.

만약 메인 메서드에서 매개변수를 빼버린다면 아래처럼 컴파일 시 오류를 발생시킨다.

오류: GodOfJava 클래스에서 기본 메소드를 찾을 수 없습니다. 다음 형식으로 기본 메소드를 정의하십시오.
public static void main(String[] args)
또는 JavaFX 애플리케이션 클래스는 javafx.application.Application을(를) 확장해야 합니다.

 

☁️ 질문

  • 커맨드에서 자바 파일을 컴파일할 때 사용하는 명령어는?
    더보기
    javac 라는 명령어를 통해 .java파일을 컴파일하여 .class 바이트코드를 생성한다.
  • 커맨드에서 클래스 파일을 실행하기 위해 사용하는 명령어는?
    더보기
    java 명령어를 사용하여 .class 파일을 실행한다. 여기서 확장자는 입력하지 않는다.
  • 자바 코드를 작성하고 실행하기까지의 순서는?
    더보기
    .java 파일을 생성하고 소스 코드를 작성한다. 자바 파일을 자바 컴파일러를 통해 JVM이 해석할 수 있는 바이트코드를 생성한다. 클래스 파일을 분석하여 각 메모리 공간에 실행에 필요한 데이터를 배치하고 excute engine에 의해 프로그램이 실행된다. java 명령어를 통해 JVM이 바이트코드를 읽으며 기계어로 컴파일하거나 상황에 따라 JIT에 의해 운영 환경에 맞는 기계어로 변경한다.
  • 바이트 코드란 무엇인가?
    더보기
    바이트 코드는 가상 머신에서 읽을 수 있는 이진 표현법이다.
  • 바이너리 코드란 무엇인가?
    더보기
    바이너리 코드는 CPU가 읽을 수 있는 이진 표현법이다.

reference

바이트코드와 바이너리 코드의 차이는 무엇일까?