-
.java 파일의 컴파일과 실행언어/자바 2024. 10. 22. 18:30
자바는 컴파일 언어이기 때문에 기본적으로 작성된 소스코드를 컴파일 하는 과정이 필요합니다.
많은 것들을 IDE 가 제공하기 때문에 별 생각없이 사용하는데, 실제로 어떤 과정으로 동작하는지 살펴보겠습니다.
아래는 간단한 Main 코드 입니다.
우선 컴파일을 하여 .class 파일로 바꿔줍니다.
저는 -d 옵션을 사용해서 out/classes 에 결과물이 생성되도록 하였습니다.
$ javac -d out/classes src/java/org/study/Main.java
제가 지정한 경로에 .class 파일이 생성된걸 볼 수 있습니다.
이제 java 명령어로 Main.class 파일을 실행해줍니다.
-cp (ClassPath) 옵션은 jvm이 실행시킬 대상을 찾는 경로를 설정해주는 옵션입니다.
$ java -cp out/classes org.study.Main
이번에는 파일을 하나 더 추가해보겠습니다.
우리의 소스 코드는 한 개의 파일로 끝나지 않으니까요간단하게 Service라는 패키지에 Service라는 클래스를 추가해봅니다.
사용측에도 간단히 적용하고,
앞에서 했던 것과 동일하게 컴파일을 해봅니다.
$ javac -d out/classes src/java/org/study/Main.java
바로 에러가 나네요?
필요한 파일을 찾아서 같이 컴파일 해줄 것이라 생각했는데새로 추가한 Service 클래스를 찾지 못해서 발생하는 것 같습니다.
이번에는 모든 파일을 포함해서, 다시 컴파일 해줍니다.
$ javac -d out/classes src/java/org/study/Main.java src/java/org/study/service/Service.java
문제 없이 잘 동작하네요.
실행도 변경해야될까요? 먼저 동일하게 Main을 찾아서 실행해봅니다.
$ java -cp out/classes org.study.Main
실행같은 경우는 문제 없이 동작하네요.
왜 이런 차이가 있을까요??
컴파일 시에는 모든 의존성이 제대로 있는지 확인해야하기 때문에 모든 파일을 포함해줘야하고,
실행시에는 필요한 클래스만 동적으로 로드해서 사용하기 때문에 진입점만 적어주면 되는 듯 합니다.
( 더 자세히는 컴파일 시에 이미 링킹으로 필요한 의존성들이 연결되어있는 상태라 그런 것이 아닐까합니다 )필요한 클래스만 동적으로 로드 한다는 것이 동적 링킹이라는 소리군요 .. ㅎㅎ
그러면 파일이 여러 개라면 하나씩 다 입력해야할까요?
이렇게 명령어 작성해주면, 해당 경로 내의 .java 파일을 모두 찾아주네요.
이후에 동일하게 실행명령어로 실행해주면, 잘 실행되는 것을 볼 수 있습니다.
$ javac -d out/classes $(find src/java -name "*.java")
지금까지 IDE에서 실행하기 버튼을 누르면 일어나는 일들을 뜯어봤습니다
'언어 > 자바' 카테고리의 다른 글
List.of와 NullPointExecption (0) 2024.03.27 List 정렬에 대하여 (1) 2024.01.12 Java IO <7 - Writer> (0) 2023.12.25 Java I/O <6 - Reader>통계 (1) 2023.12.25 Java I/O <5 - Buffered Stream> (0) 2023.12.25