ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • .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
Designed by Tistory.