Java의 정석_기초편
package와 import
DJDU
2022. 10. 7. 11:15
패키지(package)
- 서로 관련된 클래스의 묶음
- 클래스는 클래스 파일(*.class), 패키지는 디렉토리. 하위 패키지는 서브 디렉토리
- 클래스의 실제 이름(full-name)은 패키지를 포함한다(java.lang.String)
더보기

서로 관련된 클래스의 묶음
- Java 8 기준 약 4000개 클래스
클래스는 클래스 파일(*.class), 패키지는 폴더. 하위 패키지는 하위 폴더

클래스의 실제 이름(full-name)은 패키지를 포함한다(java.lang.String)
- String클래스의 실제 이름 : java.lang.String
- java.lang.String - java.lang패키지에 속한 String클래스
- java : 디렉토리(패키지)
- lang : 서브 디렉토리(하위 패키지)
- rt.jar는 자바 프로그램을 실행하는데 필요한 클래스들을 압축한 파일(JDK설치경로\jre\lib에 위치)
- jar : 클래스 파일 묶어놓은 것
- Java9부터 rt.jar파일 없어짐
- 모듈 개념 도입 - rt.jar파일의 크기가 너무 커서 작은 모듈로 쪼개놓음
패키지의 선언
- 패키지는 소스파일의 첫 번째 문장으로 단 한번 선언
- 같은 소스 파일의 클래스들은 모두 같은 패키지에 속하게 된다.
- 패키지 선언이 없으면 이름 없는 패키지에 속하게 된다.(default package) - 이클립스 기준
더보기
패키지는 소스파일의 첫 번째 문장으로 단 한번 선언
package 패키지명;
같은 소스 파일의 클래스들은 모두 같은 패키지에 속하게 된다.
package com.codechobo.book; // PackageTest.java
public class PackageTest {
public static void main(String[] args) {
System.out.println("Hello, world!");
}
}
class PackageTest2 {}
C:\jdk1.8\work>java com.codechobo.book.PackageTest
Hello World!
예제7-5
더보기

소스파일 위치 탐색 : 파일 우클릭 > Show In > System Explorer

PackageTest


[테스트] PackageTest클래스파일을 IDE 도움 없이 직접 실행해보기
- bin폴더 : 컴파일된 클래스파일(*class)이 있는 곳
- src폴더 : 소스파일(*.java)이 있는 곳
- 패키지 루트 : 패키지 시작 폴더의 상위 폴더
C:\Users\djdu4>java com.codechobo.book.PackageTest
Error: Could not find or load main class com.codechobo.book.PackageTest
- 오류 : 기본 클래스 com.codechobo.book.PackageTest을(를) 찾거나 로드할 수 없습니다.
컴퓨터의 디스크 용량이 1TB일 때, 그 넓은 공간에서 클래스 파일을 찾을 수 없다.
그래서 클래스 파일이 있는 위치로 이동해야 한다. 그 위치를 '패키지 루트'라 한다.

여기로 이동을 해야 PackageTest.class 파일을 찾을 수 있다.
C:\Users\djdu4>cd C:\Users\djdu4\eclipse-workspace\ch07\bin
C:\Users\djdu4\eclipse-workspace\ch07\bin>java com.codechobo.book.PackageTest
Hello, world
매번 이렇게 패키지루트로 이동해야 한다면 매우 불편할 것이다. 이 불편함을 해소해주는 것이 클래스 패스(classpath)이다. 클래스패스에 패키지루트를 저장을 해 놓으면, 매번 이렇게 이동하지 않아도 클래스 파일을 실행할 수 있다.
클래스 패스(classpath)
- 클래스 파일(*.class)의 위치를 알려주는 경로(path)
- 환경변수 classpath로 관리하며, 경로간의 구분자는 ‘;’를 사용
- classpath(환경변수)에 패키지 루트를 등록해야 함
- set classpath : 환경변수 확인 명령어
- set classpath=경로 : 환경변수 설정 명령어
더보기

환경 변수 설정을 완료했으면, cmd창을 재시작해야 변경 내용이 적용된다.


환경변수 classpath로 관리하며, 경로간의 구분자는 ‘;’를 사용
- 환경변수 : OS 레벨에서 관리하는 변수
classpath(환경변수)에 패키지 루트를 등록해야 함
1. 윈도우즈

Microsoft Windows [Version 10.0.19044.2075]
(c) Microsoft Corporation. All rights reserved.
C:\Users\djdu4>set classpath=C:\jdk-11.0.2\lib;C:\Users\djdu4\eclipse-workspace\ch07\bin
C:\Users\djdu4>set classpath
classpath=C:\jdk-11.0.2\lib;C:\Users\djdu4\eclipse-workspace\ch07\bin
2. macOS
- macOS에서 경로간의 구분자는 ‘;’가 아닌 ':'를 사용
jiwoo@Jiwooui-MacBookPro ~ open ~/.zshrc
- 쉘 열기 명령어


import문
- import문을 선언하면 클래스를 사용할 때 패키지이름을 생략할 수 있다.
- 컴파일러에게 클래스가 속한 패키지를 알려준다.
- 기본 패키지인 java.lang패키지의 클래스는 import하지 않고도 사용할 수 있다.
더보기

java.lang패키지의 클래스는 import하지 않고도 사용할 수 있다.
import문을 선언하면 클래스를 사용할 때 패키지이름을 생략할 수 있다.
- 컴파일러에게 클래스가 속한 패키지를 알려준다.
- 이클립스 단축키 : Ctrl + Shift + o

java.lang패키지의 클래스는 import하지 않고도 사용할 수 있다.
- java.lang패키지 : 기본 패키지, 생략 가능
- (String, Object, System, Thread, …)
import java.lang.*; // * - 모든 클래스(생략 가능)
class ImportTest2 {
public static void main(String[] args) { // java.lang패키지의 String클래스
System.out.println("Hello World!"); // java.lang패키지의 System클래스
}
}
public static void main(java.lang.String[] args) { // 생략이 안 된다면
java.lang.System.out.println("Hello World!");
}
import문의 선언
- import문을 선언하는 방법은 다음과 같다.
- import문은 패키지문과 클래스 선언의 사이에 선언한다(이클립스 단축키로 자동 선언하면 된다)
- import문은 컴파일 시에 처리되므로 프로그램 실행 시 성능상의 차이는 전혀 없다.
- 다음의 두 코드는 서로 의미가 다르다.
- 이름이 같은 클래스가 속한 두 패키지를 import할 때는 클래스 앞에 패키지명을 명시해야 한다.
더보기


import문을 선언하는 방법은 다음과 같다.
import 패키지명.클래스명;
// 또는
import 패키지명.*; // 패키지에 속한 모든 클래스
import문은 패키지문과 클래스 선언의 사이에 선언한다
- 이클립스 단축키로 자동 선언하면 된다
import문은 컴파일 시에 처리되므로 프로그램 실행 시 성능상의 차이는 전혀 없다.

package com.codechobo.book; // 1. 패키지 선언
import java.text.SimpleDateFormat; // 2. import문
import java.util.*; // 2. import문
public class PackageTest { // 3. 클래스 정의
public static void main(String args[]) {
Date today = new Date(); // java.util.Date today = new java.util.Date();
SimpleDateFormat date = new SimpleDateFormat("yyyy/mm/dd");
}
} // import문은 패키지문과 클래스 선언의 사이에 선언한다.
다음의 두 코드는 서로 의미가 다르다.

이름이 같은 클래스가 속한 두 패키지를 import할 때는 클래스 앞에 패키지명을 명시해야 한다.
import java.sql.*; // java.sql.Date
import java.util.*; // java.util.Date - 클래스 이름 동일
public class ImportTest {
public static void main(String args[]) {
java.util.Date today = new java.util.Date();
}
}
static import문
- static멤버를 사용할 때 클래스 이름을 생략할 수 있게 해준다.
더보기
static멤버를 사용할 때 클래스 이름을 생략할 수 있게 해준다.
import static java.lang.Integer.*; // Integer클래스의 모든 static멤버(cv, cm)
import static java.lang.Math.random; // Math클래스의 random메서드, 괄호() 안 붙임
import static java.lang.System.out; // System.out을 out만으로 참조 가능
// out - static변수
// 사용 x
System.out.println(Math.random());
// static import문 사용 o
out.println(random());
예제 7-6
더보기
import static java.lang.System.out; // out - System클래스의 static변수
import static java.lang.Math.*; // * - Math클래스의 모든 static멤버(cv, cm)
class Ex7_6 {
public static void main(String[] args) {
// System.out.println(Math.random());
out.println(random());
// System.out.println("Math.PI : " + Math.PI);
out.println("Math.PI : " + PI); // PI - static상수
}
}
클래스이름이 있으면 명확히 알아보기 좋기 때문에, static import문은 웬만하면 쓰지 말고, 꼭 필요할 때만 사용하자.
🍪
📄 - 객체지향개념 암기노트 바로가기