[Java] 커맨드로 컴파일하기(cannot find symbol문제 해결하기)
1️⃣ java 컴파일(커맨드 이용)
(1) 파일 한개 컴파일
< main.java위치 >
< main.java코드내용 >
- 패키지내부(first.second)에서 컴파일을 진행하였습니다.
java 파일(.java)
로 정상적으로hello!
가 출력되었습니다.
(2) 메인파일 두개 컴파일
< main.java와 test.java위치 >
< main.java코드내용 >
< test.java코드내용 >
- 기존의
main.java
파일과 같은 위치에test.java
파일을 만들었습니다. 자바프로그램을 컴파일하기 위해서는 다음과 같은
main메소드
가 필요합니다.(없을시에 컴파일 오류)public static void main(String[] argc) { /* 코드생략 */ }
- 그렇다면
main메소드
를 각각 포함한 파일 두개를 동시에 컴파일하면 어떻게 될까요? 위처럼
main메소드
를 포함한test.java
파일을 만들었습니다.- 결과적으로 먼저 작성된 파일의
main메소드
만을 컴파일했으며 컴파일오류가 일어나지 않았습니다.
2️⃣ 서로연관된 파일 컴파일하는 법(커맨드 사용)
(1) 테스트용 파일 세팅
< main.java코드내용 >
< test.java코드내용 >
main.java
파일과test.java
파일은first.second
페키지에 위치하고 있습니다.main.java
파일에서test.java
파일에 위치한 메소드를 사용하기 위해서는import first.second.test
를 이용해서 어디서 가져온 메소드인지 가르쳐줘야 합니다.- 하지만
같은 페키지에 위치한 파일일 경우 자동으로import
를 해주기 때문에 작성할 필요가 없습니다.
(2) 테스트용 파일 컴파일
- C언어에서는
헤더파일(.h)
안에 파일간에 공유한 함수를 선언해주었습니다. - 자바는
import
가 그런역할을 할 것으로 기대하고 단순한 방식으로 컴파일을 진행해보았습니다.
[1] 오류케이스1
main.java
파일과test.java
파일 두개를java
명령어를 이용하여 동시에 컴파일해보았습니다.- 하지만 심볼을 찾지못해서 컴파일이 되지않았습니다.
[2] 오류케이스2
import
는 페키지명을 포함하여 되어있는데 페키지안에서 컴파일 했기때문에 위치를 못찾은 것이 원인이지 않을까하고 생각이 들었습니다.- 최상위페키지폴더
first
가 위치한 곳에서 다시 컴파일을 진행하였습니다. - 하지만 여전히 심볼을 찾지 못하였습니다.
(3) 올바르게 컴파일하기
- 파일이 한개를 단독으로 컴파일할때는
java
명령어 하나로도 가능했습니다. 하지만 패키지를 연동하여 사용하는 여러파일을 컴파일할때는 오류가 났습니다. - 사실
java
는 실행 명령어입니다. C언어의 gcc와 같은 컴파일러를 사용하는자바컴파일러 명령어 는javac
명령어 입니다. javac
명령어를 사용하여 컴파일을 성공하면.class파일
(바이트코드)을 생성해 줍니다.(C언어의 object파일(.o)와 비슷하지만 class파일은 기계어가아닌바이트코드 로 이루어져 있습니다.)-d
옵션을 사용하여 생성위치의 디렉토리를 설정할 수 있고 생략할경우.java
파일과 동일한 위치에 생성이 됩니다.- 그렇다면 위의 테스트파일을 올바르게 컴파일 해보겠습니다.
< 생성된 .class파일 >
* .java파일이 위치한 곳에 정상적으로 .class파일들이 각각 생성되었습니다.
< 클래스폴더에서 컴파일진행 >
< 외부에서 컴파일진행 >
-classpath 클래스파일위치
를 지정해주어야하지만 클래스폴더에서 컴파일을 진행하면 생략할 수 있습니다.(-cp
로도 사용가능)- class파일의 확장명
.class
는 생략하여 작성해야 합니다. 하지만
패키지 내부에서 컴파일을 할경우 에도 다음과 같이-classpath
로 위치를 정확히 지정해주어야합니다. (패키지개념을 처음접한입장에서 경로를 설정하는 것이 익숙하지 않았습니다)import
는.java
파일을 참고하지않습니다. 그렇기 때문에 참고할test.class
파일이 없다면test.java
파일이 있더라도 다음과 같이 실행이 안됩니다.
3️⃣ 깔끔하게 파일 정리하기
클래스파일 은 클래스파일끼리소스파일 은 소스파일끼리 묶어두는 것이 깔끔합니다.