보근은 참고 있다
7주차 과제: 패키지 본문
- package 키워드
- import 키워드
- 클래스패스
- CLASSPATH 환경변수
- -classpath 옵션
- 접근 지시자
클래스의 이름
클래스의 이름은 두 가지가 있다. 클래스 파일 자체의 이름과 패키지+클래스의 이름인 FQCN(Fully Qualified Class Name)이 있다.
String 클래스를 예시로 들어보면 java.lang.String이 FQCN이다.
같은 이름을 가진 서로 다른 클래스가 있다면, 이렇게 사용해야 한다.
import mypackage.MyClass;
class Main {
public static void main(String[] args) {
MyCalss m1 = new MyClass(); // mypackage.MyClass
yourpackage.MyClass m2 = new yourpackage.MyClass(); // yourpackage.MyClass
}
}
package 키워드
- 패키지란, 클래스나 인터페이스 같은 (파일의 디렉토리처럼)참조 타입의 묶음 단위이다.
- 패키지로 관련 클래스를 그룹화한다. (java.util, java.lang처럼)
- 패키지는 같은 이름의 클래스들을 헷갈리지 않도록 해준다.
- 패키지 하위에 존재하는 패키지를 서브 패키지(sub package)라고 한다. (java.util은 java의 서브 패키지)
- package 키워드는 해당 클래스의 패키지를 명명하는 키워드이다.
- package는 소스 코드의 최상단에 기입해야 한다.
- 패키지의 가장 최상단인 default package는 이름이 없으며, package 키워드로 명시하지 않아도 된다. (하지만 이름이 같은 클래스 등이 헷갈릴 수 있으므로 사용하지 않는 걸 추천한다.)
- 패키지에 기입된 것과 실제 클래스들의 디렉토리 구조가 같아야 한다.
package mypackage.my; // A 클래스는 mypackage의 서브 패키지인 my에 위치.
// 실제 디렉토리 구조도 이렇게 되어야 한다.
class A {
}
import 키워드
- 패키지로 구분된 클래스나 인터페이스들을 다른 패키지의 클래스에서 사용하기 위해선 해당 클래스의 패키지 정보를 알아야 한다.
- 그 패키지 정보는 import 키워드를 통해 기입한다.
- import 키워드는 package 키워드와 클래스 정의 사이에 기입해야 한다.
- import 키워드에는 원하는 클래스나 인터페이스, 원하는 패키지의 모든 클래스와 인터페이스, 원하는 클래스의 스태틱 멤버들을 기입할 수 있다.
- java.lang 패키지의 경우 따로 import 해주지 않아도 된다.
import my.*; // my의 모든 클래스들을 import
import your.C; // your.C your의 C 클래스만 import
import static static.Static.staticMethod; // static.Static 클래스의 staticMethod()만 import
class Main {
public static void main(String[] args) {
A a = new A(); // my.A
B b = new B(); // my.B
C c = new C();
D d = new D(); // 기본 패키지의 클래스라 import X
String s = "hello" // java.lang의 클래스들은 자동으로 import
staticMethod(s);
}
}
클래스패스
- 클래스패스란, JVM이나 컴파일러가 클래스를 사용할 수 있도록 위치, 경로를 알려주는 매개 변수이다.
- 세부적인 경로는 각각의 클래스에서 import 키워드로 알려주기 때문에, 클래스패스는 가장 최상단의 디렉토리나 zip, jar 파일을 지정한다.
- JVM이 지정된 클래스패스를 바탕으로 import에 기입된 세부적인 경로를 통해 클래스를 찾는다.
- 클래스패스를 지정하는 방법에는 두 가지가 있는데, 하나는 시스템 환경 변수로 설정하는 것과 -classpath(-cp) 옵션을 사용하는 것이다.
CLASSPATH 환경 변수
-classpath 옵션
- -classpath 또는 -cp으로 줄여서 사용할 수 있다.
- java -cp <경로> <소스파일>의 모양으로 사용한다.
ex)
Main 클래스
import my.*;
import your.C;
class Main {
public static void main(String[] args) {
A a = new A();
B b = new B();
C c = new C();
D d = new D();
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);
}
}
접근 지시자
- 자바의 객체 지향 언어로써의 정보 은닉을 위한 기능이다.
- 클래스와 멤버 필드나 메서드의 접근을 제어한다.
- 그 종류는 4가지가 있다. (public, protected, default, private)
접근 지시자의 종류
- public - 모든 곳에서 접근이 가능하다.
- protected - 클래스, 같은 패키지 내에서, 서브 클래스에서 접근이 가능하다.
- default(package-private) - 따로 기입하지 않는다. 클래스, 같은 패키지 내에서만 접근이 가능하다.
- private - 같은 클래스 내에서만 접근이 가능하다.
같은 클래스 내 | 같은 패키지 내 | 서브 클래스 | 다른 패키지 | |
public | O | O | O | O |
protected | O | O | O | X |
default (package-private) |
O | O | X | X |
private | O | X | X | X |
참고 : ko.wikipedia.org/wiki/%ED%81%B4%EB%9E%98%EC%8A%A4%ED%8C%A8%EC%8A%A4, idratherbewriting.com/java-access-modifiers/#quick-summary, stackoverflow.com/questions/2396493/what-is-a-classpath-and-how-do-i-set-it
'Language > 자바 정리 할래' 카테고리의 다른 글
6주차 과제: 상속 (0) | 2020.12.21 |
---|---|
5주차 과제: 클래스 (0) | 2020.12.19 |
4주차 과제: 제어문 (0) | 2020.12.12 |
3주차 과제: 연산자 (0) | 2020.11.24 |
2주차 과제: 자바 데이터 타입, 변수 그리고 배열 (0) | 2020.11.18 |
Comments