소스파일과 컴파일 결과 파일을 분리하기
메이븐(Maven)과 그레이들(Gradle) 빌드 도구에서 사용하는 자바 표준 디렉토리 구조로 소스를 관리한다.
메이븐(60%)과 그레이들(19%)이 전세계 빌드 시장의 80% 정도 점유하고 있을 정도로 현업에서 많이 사용한다.
(Snyk & Java Magazine의 ‘JVM Ecosystem Report 2018’)
개발 도구에 상관없이 동일한 디텍토리 구조로 프로젝트 산출물을 관리하기 때문에 유지보수에 좋다.
대부분의 자바 오픈 소스 프로젝트들도 이 디렉토리 구조를 따르고 있다.
폴더구조

폴더 구조
실습
소스 디렉토리 생성
/src/main/java 폴더를 생성한다.
소스파일 생성
/src/main/java 폴더에 Hello2.java 파일을 작성한다.
컴파일 하기1
프로젝트 폴더에서 컴파일 할 때
javac src/main/java/Hello2.java
클래스 파일은 소스 파일이 있는 폴더에 생성된다
/src/main/java/Hello.class
컴파일 하기2
컴파일러가 생성한 파일을 소스 파일과 분리하여 관리하기
프로젝트 폴더에서 컴파일 할때
javac -d [컴파일 결과 파일을 둘 디렉토리 경로] [소스파일]
예)javac -d src/main src/main/java/Hello.java
클래스 파일은 컴파일 할 때 지정한 폴더에 생성한다
/bin/main/Hello2.class
실행하기
프로젝트 폴더에서 실행 할 때
java -classpath [클래스가 있는 디렉토리 경로] 클래스이름
java -cp [클래스가 있는 디렉토리 경로] 클래스이름
예)java -cp bin/main Hello2
패키지와 클래스
여러 개발자가 같은 이름의 클래스를 만들 수 있다.
같은 이름의 클래스를 함께 사용할 경우가 있는데,이런 경우 이름이 같아서 구분하지 못하는 문제가 발생한다.
이를 회피하기 위해 만든 문법이 ‘패키지’이다.
패키지이란?
클래스의 이름 충돌을 방지하는 문법이다.
클래스가 소속된 폴더를 가리키는 용어이다.
패키지는 폴더로 표현한다.
클래스를 관리하기 쉽게 서로 밀접하게 관련된 클래스 클래스를 그룹으로 분류하는 문법이다.
문법
소스 파일의 첫 번째 문장으로 선언해야 한다.
package 패키지명.패키지명.패키지명;
예)package com.eomcs.basic;
소스 파일의 위치
소스 파일 찾고 관리하기 쉽도록 패키지와 일치하는 폴더에 둔다.
/src/main/java/패키지명/패키지명/패키지명/소스파일
예)/src/main/java/com/eomcs/basic/Hello3.java
클래스 파일(.class)의 위치
컴파일러가 생성한 .class 파일은 무조건 패키지 이름과 같은 폴더에 있어야 한다.
/bin/main/java/com/eomcs/basic/Hello3.class
결론!
소스 파일도 자신이 소속된 패키지 폴더에 놓아야한다
그래야 소스 파일을 관리하기 쉽다.
패키지는 디렉토리로 표현한다.
실습
소스 디렉토리 생성
/src/main/java/com/eomcs/basic 폴더를 생성한다
소스 파일 생성
Hello3.java 파일을 작성한다.
컴파일 하기
프로젝트 폴더에서 실행 할 때
예)javac -d bin/main src/main/java/com/eomcs/basic/Hello3.java
클래스 파일은 패키지 폴더에 생성된다.
예)/bin/main/com/eomcs/basic/Hello3.class
실행하기
프로젝트 폴더에서 실행 할 때
| java [-classpath | -cp] [루트 패키지가 있는 디렉토리 경로] [패키지 이름을 포함한 클래스 이름] |
예)java -cp bin/main com.eomcs.basic.Hello3
다음과 같이 . 대신에 /를 사용해도 된다.
예)java -cp bin/main com/eomcs/basic/Hello3
주의!
패키지에 소속된 클래스를 실행할 때는 반드시 패키지명과 클래스명을 함께 지정해야 한다.
다음과 같이 -cp에 패키지 경로를 지정한 후 클래스 이름으로 실행할 수 없다.
예)java -cp bin/main/eomcs/basic Hello3 실행오류!
패키지 무소속 클래스
특정 패키지에 소속이 되지 않은 클래스이다.
문법
package 키워드를 붙이지 않는다.
소스 파일의 위치
소스 파일 찾고 관리하기 쉽도록 루트 소스 폴더에 둔다.
/src/main/java/Hello4.java
예)/src/main/java/Hello.java
일반 패키지 폴더에 무소속 클래스를 둔다면?
패키지 소숙 클래스이든 무소속 클래스이든 소스 파일의 위치는 상관없다.
예) /src/main/com/eomcs/basic/Hello4.java
보통 소스 파일의 관리가 쉽도록 패키지에 해당하는 디렉토리에 둔다.
클래스 파일(.class)의 위치
컴파일러는 패키지 무소속 클래스를 컴파일 할 때 소스 파일의 위치에 상관없이 클래스 파일에 두는 폴더(/bin/main)의 루트 디렉토리에 생성한다,
/bin/main/클래스파일
예) /bin/main/Hello4.class
실습
컴파일하기
프로젝트 폴더에서 실행 할 때:
예) $ javac -d bin/main src/main/java/com/eomcs/basic/Hello4.java
클래스 파일은 클래스 파일을 두는 폴더의 루트에 생성된다.
예) /bin/main/Hello4.class
실행하기
패키지에 소속된 클래스가 아니기 때문에 패키지 지정없이 클래스 이름만 지정해야 한다.
java [-classpath | -cp] [루트 패키지가 있는 디렉토리 경로] [패키지 이름을 포함한 클래스 이름]
예) $ java -cp bin/main Hello4
주의!
소스 파일이 있는 위치를 패키지로 간주하고 다음과 같이 패키지를 지정한다면 컴파일 오류가 발생한다.
예) $ java -cp bin/main com.eomcs.basic.Hello