전산학/Java

[Java] 1. 터미널에서 Java로 "Hello, World!" 출력하기 (JDK 설치, java, javac)

이신선 2022. 4. 26. 22:14
728x90

 

사람들이 새로운 언어를 배울 때 보통 IDE를 사용해서 개발을 시작한다. IDE를 사용하면 빌드, 컴파일이 버튼 하나로 되고, 디버깅도 손쉽게 가능해 편하긴 하지만, '그런데 내 코드가 어떻게 실행되는 거지?'라는 의문을 가지기 쉽상이다.나는 그랬음 그래서 이번 포스팅에서는 java 소스 코드를 터미널에서 실행해보며 그 과정을 정리해보려고 한다.

 


 

0. Java 설치하기

 

Java 코드를 실행하기 위해서는 컴파일러, 라이브러리, 툴 등 Java를 실행시키기 위한 JDK(Java Development Kit)라는 것이 설치되어 있어야 한다. 보통 Oracle에서 배포하는 JDK를 사용한다. (물론 다른 벤더에서 제공하는 JDK를 사용해도 된다) 참고로 JDK에 있는 JVM이 OS에 종속적이기 때문에, OS 마다 설치 파일이 다르다. 아래 링크에서 자신이 사용하는 OS에 맞게 설치 파일을 다운로드하여 JDK를 설치해준다. (Oracle 계정 생성이 필요하다.)

 

https://www.oracle.com/java/technologies/downloads/#java8

 

본 포스팅에서는 Java 8 버전을 사용하였고, 다른 버전 JDK 설치 후 JAVA_HOME 환경 변수 값을 바꿔주는 것으로 언제든지 다른 버전으로 변경 가능하다.

 

JDK 내 binary 파일들을 터미널 어디에서든지 실행할 수 있도록, JAVA_HOME과 PATH 환경 변수를 추가/수정해준다.

 

(base) [21:21:32] sinseon:~ $ /usr/libexec/java_home -V
Matching Java Virtual Machines (5):
    11.0.8 (x86_64) "Oracle Corporation" - "Java SE 11.0.8" /Library/Java/JavaVirtualMachines/jdk-11.0.8.jdk/Contents/Home
    1.8.331.09 (x86_64) "Oracle Corporation" - "Java" /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home
    1.8.0_331 (x86_64) "Oracle Corporation" - "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_331.jdk/Contents/Home
    1.8.0_261 (x86_64) "Oracle Corporation" - "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_261.jdk/Contents/Home
    1.8.0_202 (x86_64) "Oracle Corporation" - "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home
/Library/Java/JavaVirtualMachines/jdk-11.0.8.jdk/Contents/Home

 

나는 총 5개 버전의 JDK가 설치되어있다. 새로 설치한 1.8.0_331 버전의 Home 경로를 JAVA_HOME에 넣어주고, JAVA_HOME/bin을 PATH에 추가해준다.

~/.bash_profile을 수정하면 되고, 3, 4번 줄을 참고하면 된다.

 

환경 변수를 바로 적용하기 위해 source ~/.bash_profile 명령어를 실행해주고, java와 javac 버전 확인을 통해 JDK 설치 및 환경 변수 설정이 잘 되었는지 확인한다.

 

(base) [21:38:59] sinseon:~ $ source ~/.bash_profile
(base) [21:39:04] sinseon:~ $ java -version
java version "1.8.0_331"
Java(TM) SE Runtime Environment (build 1.8.0_331-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.331-b09, mixed mode)
(base) [21:39:08] sinseon:~ $ javac -version
javac 1.8.0_331

 

JDK 버전에 맞춰 java와 javac의 버전 정보가 잘 출력되는 것을 확인할 수 있다. MacOS를 기준으로 작성했지만, Windows의 경우도 방식이 조금 다르겠지만 같은 과정을 진행해주면 된다.

 

 

1. Java 소스 코드 실행 과정

 

java 파일이 실행되는 과정

 

.java 파일이 실행되는 과정은 위와 같다. 우선 우리에게 익숙한 java 파일(Hello.java)을 작성해준다. 그리고 javac(java compiler)을 이용해 바이트코드라 불리는 class 파일(Hello.class)을 생성한다(Compile). 그리고 마지막으로 java를 이용해 class파일 내 class를 실행시켜준다.

 

IDE를 사용해 Java 코드를 실행하더라도 위와 같은 과정이 이루어진다고 생각하면 된다. 물론 JDK 내부적으로 더 복잡한 과정이 진행되는데, 이후 포스팅에서 다뤄보려고 한다.

 

 

2. 실제로 실행해보기

 

우선 "Hello, World!"를 출력하는 Hello.java 파일을 작성해보자.

 

(base) [21:53:44] sinseon:Java $ vi Hello.java

 

public class Hello {

    public static void main(String[] args) {

        System.out.println("Hello, World!");
    }
}

 

그리고 javac 명령어로 class 파일을 생성해준다.

 

(base) [21:58:13] sinseon:Java $ javac Hello.java
(base) [21:58:25] sinseon:Java $ ls -l
total 16
-rw-r--r--  1 sinseon  staff  417 Apr 26 21:58 Hello.class
-rw-r--r--  1 sinseon  staff  121 Apr 26 21:56 Hello.java

 

Hello.java라는 Java 소스 코드를 컴파일한 결과인 Hello.class라는 바이트코드가 생성되었음을 확인할 수 있다. Hello.class 파일을 열어보면 알아볼 수 없는 문자들로 되어있을 텐데 assemble 된 code로 바뀌어버렸기 때문이다. javap -c 명령어를 이용하면 disassembled code 형태로 출력이 가능해 우리가 알아볼 수 있는 형태가 된다.

 

(base) [21:59:55] sinseon:Java $ javap -c Hello
Compiled from "Hello.java"
public class Hello {
  public Hello();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
       3: ldc           #3                  // String Hello, World!
       5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: return
}

 

마지막으로 java 명령어로 Hello class를 실행시켜준다.

 

(base) [22:03:00] sinseon:Java $ java Hello
Hello, World!

 

 처음 작성했던 코드의 내용대로 "Hello, World!"가 정상적으로 출력되었음을 확인할 수 있다.

 


 

이번 포스팅에서는 Java 코드 실행을 위한 JDK를 설치하고, Java 코드를 실행해봤다. 그러면 여기서 'JDK는 정확히 뭐지?', 'class 파일은 어떻게 생성되는거지?'와 같은 의문들이 생길 수 있다. 그래서 다음 포스팅에서는 Java 개발 환경 구성에 대하여 조금 더 자세하게 다뤄보려고 한다.

 

728x90