https://github.com/whiteship/live-study/issues/7
목차
1. package 키워드
2. import 키워드
3. 클래스패스
4. CLASSPATH 환경변수
5. -classpath 옵션
6. 접근지시자
1. package 키워드
패키지는 클래스를 쉽게 구분하기 위한 폴더이다.
package 장점
- package를 보면 type이 어떤 관계에 있는지 쉽게 짐작할 수 있다.
- 어떤 package를 사용해야 원하는 클래스를 사용할 수 있을지 짐작할 수 있다.
- 다른 package에 있다면 이름이 같아도 충돌이 일어나지 않는다.
- 같은 package인지 여부에 따라 접근 제한을 다양하게 둘 수 있다.
package 키워드
소스코드 맨 앞줄에 사용하면 패키지에 포함시킬 수 있다.
package graphics;
public interface Draggable {
/*내용 생략*/
}
package를 붙이지 않으면 default package에 포함된다.
Naming conventions은 다음과 같다.
- 클래스명과 충돌을 피하기 위해 소문자를 사용한다. (formValidator 등 불가)
- 회사라면 인터넷 도메인을 뒤집어서 사용할 것
- 자바의 키워드를 사용하지 말 것
built-in package
사용자가 정의한 package이외에 자바에서도 여러 패키지 및 클래스를 제공하는데, 예를 들면 Object, String 등 자주 쓰이는 기본적인 클래스를 제공하는 java.lang과 , 입출력과 관련된 java.io를 제공한다. 특히 lang은 자동으로 import되기 때문에 System, System은 따로 import할 필요 없다.
2. import 키워드
import는 Package의 멤버를 사용하기 위해 사용한다.
import를 사용하지 않는다면 fully qualified name을 사용해서 사용할 수 있다.
만약 graphics라는 package를 만들고 그 안에 Rectangle이라는 클래스를 만든다면
rectangle의 fully qualified name은 graphics.rectangle이 된다.
Rectangle myRectangle = new graphics.Rectangle();
만약 Rectangle을 한번만 사용한다면 위와같이 Rectangle을 만들 수 있겠지만, 만약 반복적으로 사용한다면 import문을 사용하는 것이 좋다.
import graphics.*;
import graphics.Rectangle;
graphics의 전체 클래스를 사용하고 싶으면 첫째줄처럼 *를 사용하면 되고 Rectangle만을 사용하고 싶으면 Rectangle만 import하면 된다. 하지만 graphics 내의 다른 하위 패키지의 클래스는 import 되지 않는다.
import graphics.*;
import graphics.circles.* // circle의 클래스를 사용하기 위해
graphics 안에 circles 패키지가 있다고 하자. 만약 패키지 안에 하위 패키지가 있을 때 graphics를 import하면 그 하위 패키지의 circles의 클래스는 import할 수 없다. 만약 사용하고싶으면 import graphics.*; 과 import graphics.circles.*;을 함께 사용해야 한다.
그리고 다음과 같이 같은 이름의 클래스를 import할 수 없다.
import graphics.Line
import graphics.circles.Line
이 경우에는 하나만 import하고 다른 클래스는 fully qualified name으로 선언해야 한다.
java compiler는 편의성을 위해 java.lang package와 현재 파일의 package는 자동으로 import 한다.
3-5. 클래스패스, CLASSPATH 환경변수, -classpath 옵션
6. 접근지시자
접근제어자의 범위를 간략히 설명할 수 있는 표
Acess Modifier | The same Class | The same Package | Descendants | Everywhere |
public | o | o | o | o |
protected | o | o | o | |
default | o | o | ||
private | o |
Private Access
- Private variable은 변수명으로 바로 접근할 수 없다.
- derived class에서도 접근할 수 없다.
Package Access
- default access라고 사용된다. 접근제어자를 붙이지 않으면 Package access이다.
- 같은 패키지에서 사용할 수 있다.
- Protected access보다 더 제한적이다.
- 다른 패키지라면 dervied class에서도 접근할 수 없다.
Protected
- derived class에서 자유롭게 사용할 수 있다.
- 같은 패키지에서 사용할 수 있다.
- 다른 패키지여도 derived class라면 접근할 수 있다.
예제
Protected Access와 Package Access를 이해하기 위한 예제이다.
다음은 package1에 있는 Parent 클래스이다.
package package1;
public class Parent {
public String publicVariable;
protected String protectedVariable;;
String defaultVariable;;
}
그리고 다음은 package2에 있는 Child 클래스인데 package1의 Parent 클래스를 상속받았다.
package package2;
import package1.*;
public class Child extends Parent{
public void callProtected() {
System.out.println(protectedVariable);
}
public void callDefault() {
System.out.println(defaultVariable);
}
public void useParentObject() {
Parent parent = new Parent();
System.out.println(parent.publicVariable);
System.out.println(parent.protectedVariable);
}
}
2곳에서 컴파일에러가 난다.
1. callDefault()의 defaultVariable
패키지 변수는 부모 클래스의 변수에 접근할 수 있지만, Parent 클래스와 다른 패키지에 있기 때문에 컴파일 에러가 발생한다.
2. useParentObject의 protectedVariable이다.
callProtected() 메서드와 같이 상속받은 변수를 package2의 object에서 사용하는 것은 허용되지만
useParentObject() 메서드와 같이 package1의 object를 직접 생성 후 사용하는 것은 허용되지 않기 때문에 컴파일에러가 났다.
Reference
1. 자바의 정석
2. 자바 오라클 튜토리얼
1. classpath 옵션은 javac, java 명령어 모두 사용 가능하다.
2. 인텔리제이에서 클래스패스를 생성하는 방법을 추가하자
3. 클래스로더의 계층 구조를 공부하자.
'자바 > 백기선 자바스터디' 카테고리의 다른 글
[백기선 자바스터디] 예외 처리 (0) | 2022.09.21 |
---|---|
[백기선 자바스터디] 인터페이스 (0) | 2022.08.10 |
[백기선 자바스터디] 상속 (0) | 2022.07.14 |
[백기선 자바스터디] 클래스 (0) | 2022.07.06 |
[백기선 자바스터디] 연산자 : instanceof, shift 연산자 (0) | 2022.07.02 |