package
- 클래스와 인터페이스의 리스트를 포함한다. 다음의 종류가 있다.
- Interfaces
- Classes
- Enums
- Exceptions
- Errors
- Annotation Types
package 키워드
파일의 위치를 나타낸다. “.” 을 구분자로 사용한다.
아래와 같이 표현될 수 있다. me 라는 package 밑에 skrew 라는 패키지 밑에 javademostudy 패키지 밑에 이 JavaDemoStudyApplication 클래스 파일이 존재한다는 것을 나타낸다.
일반적인 파일 시스템처럼 클래스 파일의 위치를 나타내는 역할을 한다.
package me.skrew.javademostudy;
public class JavaDemoStudyApplication {}
package 키워드를 사용함으로써, 다른 패키지에서 쓰고 있는 클래스 이름을 사용할 수 있고, 다른 개발자와 각각으로 개발할 수 있다(?)
package 선언이 없으면, 자바는 default package 로 인식한다. 그러면 다른 패키지에 있는 클래스를 import 할 수 없다.
같은 default package 면 가능하다.
규칙
한 클래스 파일에서 한 번만 선언되어야 한다.
패키지 이름으로 자바 예약어를 사용할 수 없다.
실제 위치와 package 에 선언된 이름이 같아야 한다.
보통 이런건 똑똑한 ide 가 다 잡아준다.
빌트 인 패키지
Jdk 안에 기본적으로 포함이되어있어서 import 문없이 바로 사용할 수 있는 패키지를 말한다.
java.lang 같은 패키지가 빌트 인 패키지이다. 그래서, String, Integer, System 등을 import 없이 사용할 수 있다.
import 키워드
다른 패키지에 있는 클래스를 호출하여 사용할 때에, fqcn 으로 선언해야 된다. 하지만, 매번 그러기 귀찮기 때문에 파일 윗 부분에 import 키워드를 사용하면, 간단하게 선언 및 사용할 수 있다.
...
public static void main(String[] args) {
// import 문을 사용하지 않았을 때
me.screw.javademostudy.datastructure.binarytree.BinaryTree binaryTree = new me.screw.javademostudy.datastructure.binarytree.BinaryTree();
}
import me.screw.javademostudy.datastructure.binarytree.BinaryTree;
..
public static void main(String[] args) {
// import 문을 사용할 때
BinaryTree binaryTree = new BinaryTree();
}
기능
*(아스타) 키워드를 사용하여 특정 패키지 밑에 있는 모든 클래스를 import 할 수 있다.
import static 키워드를 사용하여 static method 도 import 할 수 있다.
주의
import 문으로 선언하는 클래스가 현재 패키지내의 클래스 이름과 같으면 코드는 구분하지 못 하여 컴파일 에러가 난다.
import me.screw.javademostudy.datastructure.binarytree.Child;
//'me.screw.javademostudy.datastructure.binarytree.Child' is already defined in a single-type import 에러 발생
import me.screw.javademostudy.datastructure.linkedlist.Child;
클래스패스
jvm 이 파일을 실행할 때, 클래스 파일들을 찾는 과정에서 기준이 되는 파일 경로
classpath 옵션
classpath 옵션을 주지 않는 다면, 실행되는 현재 파일 위치를 클래스패스로 본다. 즉, 실행되는 파일에서 필요한 클래스 파일들을 현재 위치 기준으로 찾는다.
다음과 같이 사용하면, 클래스 패스를 설정할 수 있고, 주어진 클래스 패스를 기준으로 필요한 클래스 파일들을 찾아 실행한다.
mac 같은 경우에는 : 으로 구분자로써 사용한다. classpath 절대 경로에는 실행파일도 찾을 수 있는 path 도 포함되어야 한다.
java -classpath {CLASSPATH 절대경로} {실행파일}
public class Hello {
public static void main(String args[]) {
No no = new No();
System.out.println(no);
}
}
// /Users/mac 위치
~
❯ ls
Applications Library dev_pg_TeamInfo.csv
Desktop Movies ideaIU-2021.2.4.dmg
Documents Music java_error_in_idea.hprof
Downloads No.java jwp-basic-custom.h2.db
Hello.class Pictures jwp-basic-custom.mv.db
Hello.java Postman jwp-basic-custom.trace.db
IdeaProjects Public kafka-docker
// No.class 는 ./Pictures 폴더 하위에 있다.
~
❯ java -cp "/Users/mac:/Users/mac/Pictures" Hello // Hello 가 있는 위치, No 가 있는 위치를 구분자로써 모두 적어줬을 때 성공적으로 클래스를 읽어온다.
No@515f550a
~
❯ java -cp "/Users/mac/Pictures" Hello // No 는 있지만, Hello 가 없어서 실패한다.
오류: 기본 클래스 Hello을(를) 찾거나 로드할 수 없습니다.
원인: java.lang.ClassNotFoundException: Hello
~
❯ java -cp "/Users/mac:/Pictures" Hello // Hello 는 있지만 No 가 없어서 실패한다.
Exception in thread "main" java.lang.NoClassDefFoundError: No
at Hello.main(Hello.java:3)
Caused by: java.lang.ClassNotFoundException: No
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
... 1 more
++ 실행파일이 특정 package 밑에 있다면 fcqn 을 적어주며 실행해줘야 한다.
package me.screw.javademostudy;
public class JavaDemoStudyApplication {
public static void main(String[] args) {
System.out.println("Hello Main");
}
}
이런 실행파일이 있다고 한다면, 아무리 me/screw/javademostudy 로 들어가 java 로 실행해도 실패한다.
~/IdeaProjects/java-study/build/classes/java/main/me/screw/javademostudy
❯ java JavaDemoStudyApplication
오류: 기본 클래스 JavaDemoStudyApplication을(를) 찾거나 로드할 수 없습니다.
원인: java.lang.NoClassDefFoundError: me/screw/javademostudy/JavaDemoStudyApplication (wrong name: JavaDemoStudyApplication)
패키지명과 같이 실행시켜줘야 성공한다.
~/IdeaProjects/java-study/build/classes/java/main
❯ java me.screw.javademostudy.JavaDemoStudyApplication
Hello Main
javac 에서도 classpath 옵션을 줄 수 있다. 인텔리제이같은 툴들은 그래들로 선언한 라이브러리들을 로컬에 다운로드받고, 그 자르들을 클래스패스에 위치시킨다. 그래서 컴파일할 때에 아무런 문제없이 컴파일한다.
접근지시자
private: 클래스 내부에서 접근 가능
default: 같은 패키지 내부에서 접근 가능
protected: 같은 패키지 내부 혹은 상속받은 클래스에서 접근 가능
public: 모든 클래스에서 접근 가능
ref
https://docs.oracle.com/en/java/javase/11/docs/api/help-doc.html
'자바' 카테고리의 다른 글
멀티쓰레드 프로그래밍 (0) | 2024.02.24 |
---|---|
예외처리 (1) | 2024.01.18 |
자바 인터페이스 (1) | 2023.11.13 |
자바 상속 (1) | 2023.10.23 |
자바 소스 파일(.java)을 JVM으로 실행하는 과정 이해하기 (0) | 2023.08.14 |