본문 바로가기

코딩공부/JAVA

[12] JAVA 직접 컴파일하기(2) - 컴파일과 실행 동작원리

컴파일과 실행

 

[참고] JAVA 실행 - 코드, 컴파일, 실행

 

1. 순수하게 내가 만든 파일로 컴파일하여 실행

Program.java 파일을 컴파일하여 실행가능한 Program.class 파일로 만든 후, 'java'를 이용해서 프로그램을 실행

 

(1) Program.java 파일이 있는 디렉토리 경로로 이동

파인더에서 하단에 '경로 이름 복사' 를 한 뒤, 터미널에서 디렉토리 이동

Program.java 파일이 있고, 이전에 만들어진 Program.class 파일은 삭제한다.

 

(2) 컴파일 - javac 명령(프로그램)을 이용해서 .java 파일을 컴파일하여 .class 실행파일을 생성

javac 컴파일할파일.java

(* error 메시지가 나온다면, javac -cp "." Program.java 명령어로 해보자)

-cp : class path 옵션

"." : 현재 디렉토리

 

(3) 실행파일(.class) 을 실행

java 명령이 VM(Virtual Machine)이라고 할 수 있다. 

java 프로그램명 or java -cp "." 프로그램명

( *주의 : java 명령으로 실행시 프로그램명 뒤에 .class 확장자를 쓰지 않는다. )

 

프로그램이 잘 실행되어 결과가 출력되는 것을 확인할 수 있다.

 

※ 동작원리

자바에게 Program.class 파일을 실행하도록 하면, Program.class 파일에서 클래스 파일의 이름과 같은 클래스를 찾고, 그 클래스 내에서 main() 메소드를 찾는다. 그리고, main(){ ... code ...} main의 {} 안에 있는 코드를 순차적으로 실행하고 종료하도록 약속되어있다.

 

 


2. 라이브러리를 이용한 코드를 컴파일하여 실행

다른 사람이 만든 라이브러리를 이용하고 있다면 조금 더 복잡해진다. OkJavaGoInHome.java 파일을 컴파일하여 실행해보자 

 

Elevator 클래스는 코드 내에 있지 않고, [org>opentutorials>iot] 디렉토리 하위에 존재하는 Elevator 클래스를 불러와서(import) 사용중이다. 따라서 OkJavaGoInHome.java 를 실행시키기 위해서는 org.opentutorials.iot 의 Elevator.java 파일을 '로딩'해야 실행할 수 있다.

 

// OkJavaGoInHome.java

import org.opentutorials.iot.Elevator;
import org.opentutorials.iot.Lighting;
import org.opentutorials.iot.Security;

public class OkJavaGoInHome {

	public static void main(String[] args) {
		String id = "JAVA APT 507"; 
        
        // Elevator call 
        Elevator myElevator = new Elevator(id);
        myElevator.callForUp(1);
         
        // Security off 
        Security mySecurity = new Security(id);
        mySecurity.off();
         
        // Light on
        Lighting hallLamp = new Lighting(id+" / Hall Lamp");
        hallLamp.on();
         
        Lighting floorLamp = new Lighting(id+" / floorLamp");
        floorLamp.on();

	}
}

 

org.opentutorials.iot 를 "패키지"라고 한다. "작은 프로그램들이 모여있는 패키지"

 

Elevator.java 코드를 컴파일하여 생긴 Elevator.class 파일을 로딩하는 import 코드

import 되었기 때문에 "Elevator" 통해서 Elevator.class 파일을 이용할 수 있게된다.

import org.opentutorials.iot.Elevator;

 

(1) OkJavaGoInHome.java 파일을 컴파일

javac OkJavaGoInHome.java 에러메시지가 출력되지 않는다면 성공적으로 class 파일이 생성된 것이다.

 

이 소스코드는 내부적으로 패키지 안에 있는 여러 파일들을 다 필요로하기 때문에 자바 컴파일러가 패키지(org.opentutorials.iot) 안에 있는 파일들도 컴파일을 시켜준 것이다.

 

※ 패키지 경로가 변경된 경우

lib 디렉토리를 생성한 뒤, org.opentutorials.iot 패키지를 이동시켜보자

 

이동시킨 후, 다시 컴파일을 하면? error가 발생한다.

org.opentutorials.iot 패키지를 찾을 수 없어서 발생한 오류이다.

 

javac 사용법을 확인해보자

--class-path 옵션으로 컴파일하려는 클래스 파일이 존재하는 경로를 알려준다.

자바컴파일러(javac)에게 "내가 지금 컴파일하려고 하는 이 프로그램은 ~~~에 있는 클래스들이 필요하니깐, ~이 경로에서 찾아라" 라고 알려주는 옵션이다.

 

javac -cp ".:lib" OkJavaGoInHome.java

-cp ".:lib" 현재디렉토리(.) 와 lib 디렉토리에서 클래스 파일을 찾으라는 의미이다. * MacOS, Linux 는 구분자로 콜론( : )을 사용한다.

( * Windows 는 구분자로 세미콜론( ; )을 사용한다.  javac -cp ".;lib" OkJavaGoInHome.java )

 

OkJavaGoInHome.java 파일이 컴파일되어 OkJavaGoInHome.class 파일이 생성되고, 이 파일에서 필요로하는 클래스 파일 Elevator.class 파일도 자동으로 컴파일해서 만들어 준다.

01

(2) OkJavaGoInHome.class 파일 실행

java OkJavaGoInHome 실행하면 error가 발생한다. 

why ?

'Elevator' 클래스를 찾을 수 없어서 발생한 에러이다. org 패키지가 OkJavaGoInHome.class 파일과 같은 위치에 있었다면 정상적으로 실행되었겠지만, lib 디렉토리 하위에 org 패키지가 위치하기 때문에 경로를 찾지 못한 것이다.

 

명시적으로 "lib" 디렉토리 하위에 존재한다고 알려줄 수 있다.

java -cp "lib" OkJavaGoInHome

 

하지만 문제는 ?

기본적으로 자바는 우리가 자바를 실행시키는 디렉토리에 있는 OkJavaGoInHome.class 파일을 찾도록 약속되어있는데, 명시적으로 "lib"이라고 해놓으면 "lib"에서만 찾게되고, 같은 디렉토리에서는 찾지 않게 된다.

 

따라서 현재 디렉토리(.) 에서도 클래스를 찾을 수 있도록 -cp 옵션의 값을 ".:lib" 이라고 입력하면 정상적으로 프로그램이 실행된다.

java -cp ".:lib" OkJavaGoInHome

 

 

 


3. Arguments 로 값을 입력을 받는 코드를 컴파일하여 실행

OkJavaGoInHomeInput.java 파일을 컴파일하여 실행

args 라는 변수를 이용해 사용자가 입력한 정보를 가져와서 출력해주고 있다. 즉, 실행할 때 어떻게 입력값을 받을 수 있는지 알아보자

 

// OkJavaGoInHomeInput.java

import javax.swing.JOptionPane;
import org.opentutorials.iot.DimmingLights;
import org.opentutorials.iot.Elevator;
import org.opentutorials.iot.Lighting;
import org.opentutorials.iot.Security;

public class OkJavaGoInHomeInput {

	public static void main(String[] args) {
          // paramter, 매개변수
          String id = args[0];
          String bright = args[1];

          // Elevator call 
          Elevator myElevator = new Elevator(id);
          myElevator.callForUp(1);

          // Security off 
          Security mySecurity = new Security(id);
          mySecurity.off();

          // Light on
          Lighting hallLamp = new Lighting(id+" / Hall Lamp");
          hallLamp.on();

          Lighting floorLamp = new Lighting(id+" / floorLamp");
          floorLamp.on();

          DimmingLights moodLamp = new DimmingLights(id+" moodLamp");
          moodLamp.setBright(Double.parseDouble(bright));
          moodLamp.on();

	}

}

 

 

tree . 디렉토리에 있는 파일 목록들 출력

 

 

강의 > https://youtu.be/KMFJ7AZQSeI

 

(1) 컴파일

javac OkJavaGoInHomeInput.java 

 

(2) Argument 값을 입력하여 실행

java OkJavaGoInHomeInput "Java APT 507" 15.0