7주차
package
정의
관련된 클래스 혹은 인터페이스들의 묶음이다. 파일 디렉토리의 폴더라고 생각하면 된다.
사용 이유
name confilcts
피함 → 클래스명의 고유성 보장- 코드의 더 나은
유지보수
를 위해
com.example과 같은 패키지명 형태
-
com.example
과 같은 최상위 패키지명을 사용하는 이유?패키지 이름의
고유성을 보장
하기 위해 인터넷 도메인 주소를 거꾸로 사용하기도 한다. 인터넷 도메인은 이미 고유성을 가지고 있기 때문에, 다른 충돌을 걱정할 필요가 없다.
종류
Built-in Packages
Java API는 Java Development Environment에 포함된, 미리 작성된 클래스 라이브러리이다. math, util, i/o와 같은 기본 패키지들이 내장되어있다.
IntelliJ에서 프로젝트를 생성하면, External Libraries
에서 built-in
패키지와 그에 속한 클래스들을 볼 수 있다.
라이브러리는 packages
와 classes
로 나뉜다. 즉 단일 클래스(메소드와 속성을 포함하는)를 가져오거나 특정 패키지에 속하는 모든 클래스를 포함하는 패키지를 가져올 수 있다.
User-Defined-Package
사용자가 클래스와 인터페이스를 카테고리화하여 사용자 정의 자바 패키지를 생성할 수 있다.
생성하기 위해서, 우선 프로젝트에 디렉토리를 만든 뒤, package 폴더명;
을 써준다.
import
다른 클래스 사용하는 방법
패키지 주소 전체를 이용하기
java.util.Date today = new java.util.Date();
java.util.Date yesterday = new java.util.Date();
이 사용법은 클래스 사용시마다 매번 주소를 입력해야하므로 번거롭다.
import 키워드 사용
import java.util.*;
import java.math.BigInteger;
*
를 이용하여 패키지의 모든 하위 클래스에도 적용이 가능하다.- 만약 서로 다른 패키지가 같은 이름을 가진 클래스를 가지고 있다면, 이는 컴파일 에러로 이어진다.
- 따라서 이를 피하기 위해 특정 클래스의 주소를 import 하는 방식으로 사용해야 한다.
import java.util.*;
import java.sql.*;
// ERROR
public class Test {
public static void main(String[] args) {
Date newDate = new Date();
}
}
Date
클래스는 java.util
과 java.sql
패키지 모두에 존재하기 때문에 컴파일 에러가 발생한다.
이런 경우에는
java.util.Date utilDate = new java.util.Date();
java.sql.Date sqlDate = new java.sql.Date(0);
와 같이 패키지의 전체 주소를 이용하는 방식을 사용해야한다.
static
import
는 static 클래스, 메소드, 데이터 필드에도 적용가능하다.
import static java.lang.System.out;
public class example {
public static void main(String... args){
out.println("EXAMPLE");
}
}
이와같이 자주 사용하게 되는 System.out
객체는 static 클래스인 System
을 import하거나, System.out
을 import하여 간소화할 수 있다.
클래스패스
정의
말 그대로 클래스를 찾기위한 경로이다. JVM
이 프로그램을 실행할 때, 클래스파일
을 찾는 데 기준이 되는 파일 경로를 말한다. JVM
은 컴파일된 소스코드(.java)인 바이트코드(.class)
를 classpath에 지정된 경로를 통해 찾아야한다.
클래스패스는 디렉토리와 파일을 콜론
으로 구분하는데, 실행하고자 하는 바이트코드
를 찾는 과정은 다음과 같다.
1️⃣ Java Runtime시에, 클래스패스에 지정된 경로를 모두 검색한다.
2️⃣ 특정 class에 대한 코드가 포함된 .class파일을 찾은 뒤, 첫 번째로 찾은 파일을 사용한다.
한편 클래스패스를 지정하는 방법에는 두 가지가 있다. 환경변수 CLASSPATH
를 사용하는 방법과, Java Runtime시에 -classpath
플래그를 사용하는 방법이 있다.
환경변수 CLASSPATH
환경변수를 설정하지 않아도 자바를 컴파일 할 수 있는데 왜 환경변수를 설정하는 것일까? 이유는 cmd에서 직접 자바를 컴파일하기 위해서이다. 어디에서든 cmd(혹은 터미널)을 이용하여 소스코드를 컴파일 및 실행하고자 할 때, jdk
가 설치된 디렉토리를 환경변수로 지정해주면 된다.
IntelliJ
에서는 자동으로 환경변수에 JDK 경로를 지정하기 때문에 별다른 설정이 필요없다.
Mac에서의 환경변수 설정
-
mac에서의 환경변수 설정
JDK
설치 후cd /Library/Java/JavaVirtualMachines
ls -la
을 통해
jdk
가 설치된 디렉토리로 이동한다.cd /Library/Java/JavaVirtualMachines/jdk{jdk버전}.jdk/Contents/Home
으로 이동한 뒤,
JAVA_HOME
경로를 설정해주어야한다.export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk{jdk버전}.jdk/Contents/Home
를 실행한 뒤
vi를 통해
/etc/paths
를 열고,export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk{jdk버전}.jdk/Contents/Home
를 가장 아래줄에 삽입한다.그 다음
/etc/profile
을 연 뒤,export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk{jdk버전}.jdk/Contents/Home
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar
을 입력한 뒤 저장한다.
-classpath 플래그
환경변수 CLASSPATH를 시스템에 설정하지 않고도 클래스패스를 런타임시에 지정하는 것이 가능한데, 이는 javac, java를 이용하여 실행할 때 -classpath(cp)를 사용하면 가능하다.
java -classpath "경로";. 클래스명
접근 지시자
Modifier | Class | Package | Subclass | World |
---|---|---|---|---|
public | Y | Y | Y | Y |
protected | Y | Y | Y | N |
default | Y | Y | N | N |
private | Y | N | N | N |
- 접근 범위 :
private
<default
<protected
<public
- 클래스가 지시자 없이 선언된다면(default, package-private 클래스), 그 클래스는 오직 그 자신의 패키지에서만 볼 수 있다.
대상 | 사용가능한 접근 제어자 |
---|---|
클래스 | public, (default) |
메서드, 멤버변수 | public, (default), protected, private |
지역변수 | 없음 |
대상 | 사용가능한 접근 제어자 |
---|---|
클래스 | public, (default), final, abstract |
메서드 | 모든 접근 제어자, final, abstract, static |
멤버변수 | 모든 접근 제어자, final, static |
지역변수 | final |
-
메소드에
static
과abstract
를 함께 사용할 수 없다.→ static 메소드는 몸통이 있는 메소드에서만 사용할 수 있음
-
클래스에 abstract와 final을 동시에 사용할 수 없다.
→ 클래스에서 사용되는
final
은 클래스를 확장할 수 없다는 의미이고,abstract
는 상속을 통해 완성되어야 하는 클래스이므로, 서로 모순된다. -
abstact
메소드의 접근 제어자는private
이 될 수 없다.→ abstract 메소드는 자손 클래스에서 구현하기 위해 접근해야하기 때문이다.
-
메소드에
private
과final
을 같이 사용할 필요는 없다.→
private
인 메소드는 오버라이딩 될 수 없기 때문에 둘중 하나만 사용해도 의미가 충분하다. -
출처
https://www.studytonight.com/java/package-in-java.php
https://muckycode.blogspot.com/search/label/Java