패키지
- package 키워드
- import 키워드
- 클래스패스
- CLASSPATH 환경변수
- classpath 옵션
- 접근지시자
Package 패키지
-
자바에서 패키지란 클래스와 인터페이스등의 집합(폴더)을 의미한다.
-
파일들을 묶음으로써 파일을 효율적으로 관리할 수 있게 한다.
-
협업 시 서로 작업한 클래스 사이에서 발생할 수 있는 이름 충돌 문제까지도 패키지를 이용하면 피할 수 있다
- ex)
me.thewing.livestudy._4week
패키지의test.java
me.thewing.livestudy._5week
패키지의test.java
- ex)
-
자바에서 패키지는 물리적으로 하나의 디렉토리를 의미한다 따라서 하나의 패키지에 속한 클래스나 인터페이스 파일은 모두 해당 패키지 이름의 디렉터리에 포함되어 있다
-
디렉터리의 계층구조는 점(.) 으로 구분된다
-
소스코드 첫번째 줄에 있어야하고 하나만 있어야 한다.
-
패키지의 이름과 디렉터리 구조가 같아야 한다.
예제
자바에서 가장 많이 사용되는 패키지 중 하나인 String
클래스의 패키지 이름이다
java.lang.String
위의 예제에서 자바 String
클래스는 java.lang
패키지에 속한 클래스이다
선언
package 패키지이름;
package me.thewing
- 위와 같은 명령문을 클래스나 인터페이스의 소스 파일에 추가하면된다
- 패키지 이름에는 패키지의 경로까지 포함한 풀 네임을 명시해야한다
규칙
- 패키지 이름은 모두 소문자
- 자바의 예악어를 사용하면 안된다
이름 없는 패키지(unnamed package)
- 자바의 모든 클래스는 반드시 하나 이상의 패키지에 포함되어야한다
- 자바 컴파일러는 소스 파일에 어떠한 패키지의 선언도 포함되지 않으면, 기본적으로 이름 없는 패키지에 포함해 컴파일한다
- 패키지를 명시하지 않은 모든 클래스와 인터페이스는 모두 같은 패키지에 포함된다
import 키워드
- 위와 같이 선언한 패키지에 속한 클래스를 다른 파일에서 사용하기 위해서는 클래스 이름 앞에 패키지의 경로까지 포함한 풀 네임을 명시해서 사용해야한다
- 클래스를 사용할 때마다 매번 이렇게 긴 이름을 사용하는 것은 비효율적이므로 import키워드가 존재한다
- import는 자바 컴파일러에 코드에서 사용할 클래스의 패키지에 대한 정보를 미리 제공하는 역할을한다
- import문을 사용하면 다른 패키지에 속한 클래스를 패키지 이름을 제외한 클래스 이름만으로 사용할 수 있게 된다
선언
import 패키지이름.클래스이름; // 첫 번쨰 방법
import 패키지이름.*; // 두 번째 방법
import me.thewing._6week.test;
import me.thewing._6week.*;
- 패키지 이름에는 패키지의 경로까지 포함한 풀 네임을 명시해야한다
- 첫 번째 방법은 해당 패키지의 특정 클래스만을 사용해야할때 사용한다
- 두 번째 방법은 해당 패키지의 모든 클래스를 클래스 이름만으로 사용하고 싶을 때 사용한다
- 알고리즘 문제 풀면서 util클래스를 자주 사용했는데 import를
import java.util.*;
이렇게 사용했었다. Clean Code(서적) 에서 이렇게 사용하지 말라해서 사용안하고 있다..
클래스패스
- 클래스를 찾기 위한 경로
- JVM이 프로그램을 실행할 때 클래스 파일을 찾는데 기준이 되는 파일의 경로이다.
- 소스 코드(.java로 끝나는 파일)를 컴파일하면 소스 코드가 바이트 코드로 변환된다. java runtime(java 또는 jre)으로 이 .class 파일에 포함된 명령을 실행하려면, 이 파일을 찾을 수 있어야 한다. 이때 .class 파일을 찾을 때 classpath에 지정된 경로를 사용한다. classpath는 .class 파일이 포함된 디렉토리와 파일을 콜론으로 구분한 목록이다. java runtime은 이 classpath에 지정된 경로를 모두 검색해서 특정 클래스에 대한 코드가 포함된 .class 파일을 찾는다. 찾으려는 클래스 코드가 포함된 .class 파일을 찾으면 첫 번째로 찾은 파일을 사용한다.
classpath를 지정할 수 있는 두 가지 방법
- 환경 변수 CLASSPATH를 사용하는 방법
- java runtime에 -classpath 플래그를 사용하는 방법
CLASSPATH 환경변수
- 시스템 환경 변수 편집으로 지정이 가능하다
- 경로 지정해주면된다
classpath 옵션
- 사용방법
javac <options> <souce files>
- classpath(cp) path(파일 절대 경로)
- 컴파일러가 컴파일 하기 위해서 필요로 하는 참조할 클래스 파일들을 찾기 위해서 컴파일시 파일 경로를 지정해주는 옵션. 예를 들어, Hello.java파일이 C:Java 디렉터리에 존재하고, 필요한 클래스 파일들이 C:JavaEngclasses에 위치한다면, javac -classpath C:JavaEngclasses C:JavaHello.java 로 해주면 된다. 만약 참조할 클래스 파일들이 C:JavaEngclasses외의 다른 디렉터리에도 존재한다면, C:JavaKorclasses 일경우,
javac -classpath C:JavaEngclasses;C;JavaKorclasses C:JavaHello.java 그리고, 현재 디렉터리역시 포함하고 싶다면,
javac -classpath .;C:JavaEngclasses;C;JavaKorclasses C:JavaHello.java
기본적으로, dos에서는 .는 현재 디렉터리를 의미하고, ..는 현재 디렉터리의 상위디렉터리를 의미한다. 또한 classpath 대신 단축어인 cp를 사용해도 된다.
javac -cp C:JavaEngclasses C:JavaHello.java
- 컴파일러가 컴파일 하기 위해서 필요로 하는 참조할 클래스 파일들을 찾기 위해서 컴파일시 파일 경로를 지정해주는 옵션. 예를 들어, Hello.java파일이 C:Java 디렉터리에 존재하고, 필요한 클래스 파일들이 C:JavaEngclasses에 위치한다면, javac -classpath C:JavaEngclasses C:JavaHello.java 로 해주면 된다. 만약 참조할 클래스 파일들이 C:JavaEngclasses외의 다른 디렉터리에도 존재한다면, C:JavaKorclasses 일경우,
접근제어자(Access modifier)
public class AccessModifier {
public void publicMethod() {
}
protected void protectedMethod() {
}
void packagePrivateMethod() {
}
private void privateMethod(){
}
}
-
public
- 누구나 접근할 수 있도록 할 때 사용한다.
-
protected
- 같은 패키지 내에 있거나 상속받은 경우에만 접근할 수 있다.
-
package-private
- 아무런 제어자를 적어주지 않을 때이며, package-private라고 불린다. 같은 패키지 내에 있을 때만 접근할 수 있다.
-
private
-
해당 클래스 내에서만 접근 가능하다.
예시
package me.thewing.godofjava; public class AccessModifier { public void publicMethod() { } protected void protectedMethod() { } void packagePrivateMethod() { } private void privateMethod(){ } }
package test.sub.AccessModifier; import test.sub.AccessModifier; public class AccessCall { public static void main(String[] args) { AccessModifier accessModifier = new AccessModifier(); accessModifier.publicMethod(); accessModifier.protectedMethod(); //에러 : 같은 패키지 내이거나 상속받을 경우만 가능 accessModifier.packagePrivateMethod(); //에러 : 같은 패키지 내에서만 가능 accessModifier.privateMethod(); //에러 : 해당 클래스에서만 가능 } }
Reference
-
자바의신
-
'스터디 > LiveStudy' 카테고리의 다른 글
9주차 과제: 예외 처리 (0) | 2021.01.11 |
---|---|
8주차 과제: 인터페이스 (0) | 2021.01.04 |
6주차 과제: 상속 (0) | 2020.12.21 |
5주차 과제: 클래스 (0) | 2020.12.19 |
4주차 과제: 제어문 (0) | 2020.12.09 |