컴파일과 실행
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 파일도 자동으로 컴파일해서 만들어 준다.
(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
'코딩공부 > JAVA' 카테고리의 다른 글
[14] JAVA 나의 앱 만들기 (0) | 2019.10.23 |
---|---|
[13] 자바 문서 보는 법 & 자바의 구조 (클래스, 인스턴스, 상속) (0) | 2019.10.21 |
[11] JAVA 직접 컴파일하기(1) - 실습소개, 실행환경(javac, 환경변수) (0) | 2019.10.18 |
[10] 입력과 출력 (0) | 2019.10.18 |
[9] 디버거 (0) | 2019.10.17 |