🥞 BE
home

2. 자바의 코드 구조

Date
2023/09/09
Category
Programming Language
Tag
Java
Detail
Java Basic

2.1 패키지(package)

패키지는 클래스가 위치하는 위계상의 위치를 점(., dot)으로 구분해서 표시한다. 이 점(.)은 파일시스템 상에서는 directory로 구분된다.
패키지는 코드를 만드는 회사나 조직 정보, 제품이나 서비스의 이름, 기능적인 이름 구분을 위계(hieararchy)로 표시한다.
관습적으로 회사나 조직 정보 . 제품이나 서비스의 이름 . 해당 제품이나 서비스 내에서 기능적이거나 기술적인 구분 순서로 온다.
ex) org.apache.commons.lang3.StringUtils

2.2 클래스(class)

자바의 코든 코드는 클래스 파일에 위치해야한다. 사용자가 작성하는 코드는 모두 클래스 블럭 내에 위치해야한다. 클래스 블럭 밖에는 클래스 상단에 위치하는 패키지 이름, import 문, 클래스에 달린 annotation 만 올 수 있다.
자바 파일 이름과 클래스 이름은 같아야 한다.
컴파일하면, 클래스 이름과 동일한 자바 파일 이름으로 .class 파일이 생성된다.
inner class의 경우, $표시가 붙은 뒤에 OuterClassName$InnerClassName.class 이렇게 파일이 생성된다.

2.3 클래스의 이름

JVM(Java Virtual Machine)은 클래스로더가 클래스를 로딩한다고 했다. 그렇다면 만약에 같은 이름의 클래스 파일을 로드하면 어떻게 될까?
되는 경우도 있고, 안되는 경우도 있다.
클래스로더가 클래스를 구분하는 방법은 package 이름을 포함한 클래스 이름이다. 실제로 코드로, MyClass.class.getClassName() 으로 조회할 수 있다.
그래서 package 이름을 정할 때, 위계(hieararchy)를 겹치지 않고도 클래스의 목적을 잘 표현하도록 지어야한다.
클래스 선언부에 있는 이름만 조회 하려면 MyClass.class.getSimpleName() 으로 확인할 수 있다.

2.4 클래스패스(Classpath)

2.4.1 클래스패스란?

JVM은 자신이 로드할 클래스를 클래스패스에서 찾는다. 따라서, JVM에게 클래스패스가 어디인지 파일시스템의 경로를 알려주어야 클래스를 찾을 수 있다.

2.4.2 클래스패스를 지정하는 방법

main함수가 jar 안에 위치해 있고 jar 명령어로 자바 프로그램을 실행시키는 경우(java jar ...) 해당 jar 파일은 기본적으로 Classpath에 포함되어 있다.
환경변수로 지정된 JAVA_HOME 하위의 lib 디렉토리는 지정하지 않아도 클래스패스에 포함된다.
java 명령어를 수행하는 현재 디렉토리도 지정하지 않아도 클래스패스에 포함된다.
클래스패스는 환경변수로 지정($CLASSPATH)할 수도 있고, java 파라미터(-cp 또는 -classapth)로 자바 프로그램을 실행시킬 때 전달할 수도 있다.
내가 여러가지 라이브러리를 사용하고, 제각기 위치한 디렉토리가 다르다면, 모두 CLASSPATH안에 구분자(Windows: ; 세미콜론, Unix계열: : 콜론)로 구분해서 경로를 넣어줘야 한다.

2.4.3 클래스패스 실습

1.
external 디렉토리를 만들고 이동한다. Callee.java 파일을 만든다.
class Callee { public void call(String arg) { System.out.println(arg); } }
Java
복사
2.
컴파일 해주고
javac Callee.java
Plain Text
복사
3.
main 디렉토리를 만들고 이동한다. 하위에 Hello.java 파일을 만든다.
class Hello { public static void main(String[] args) { System.out.println("hello"); Callee callee = new Callee(); callee.call("world"); } }
Java
복사
여기서 컴파일 하기위해 javac Hello.java를 치면, 다음과 같이 오류가 발생한다. Callee 클래스를 찾지 못하는 상황.
4.
Callee 클래스가 위치한 디렉토리를 classpath로 파라미터 세팅을 하고 Hello.java 파일을 컴파일 한다.
javac -cp ../external:. Hello.java
Plain Text
복사
5.
Callee 클래스가 위치한 디렉토리와 현재 디렉토리를 classpath로 파라미터 세팅을 하고 Hello.java 파일을 컴파일 한다.
javac -cp ../external:. Hello
Plain Text
복사
6.
결과
hello world
Plain Text
복사