09. 자바를 배우면 패키지와 접근 제어자는 꼭 알아야 해요
패키지
패키지란?
- 클래스들을 구분 짓는 폴더와 유사한 개념
- 직접 만든 패키지와 이미 만들어져 있는 내장 패키지가 존재한다.
- 개발 시 클래스들을 분류함으로 이름 중복, 클래스 역할 혼동 방지
- ex) javac c/javapackage/Package.java
java c/javapackage/Package
=> / 로 각 패키지를 구분한 후 자바 소스 이름을 지정하여 컴파일이 가능하고 컴파일된 클래스를 실행할 수 있다. - 자바는 해당 패키지의 가장 상위 디렉토리(root 디렉토리)에서 실행을 해야만 하는 약속이 있다.
- 윈도우에서는 / 말고 \로도 컴파일 및 실행이 가능하다.
- 상위 패키지와 하위 패키지의 상관관계는 전혀 없다.
패키지 선언
- 패키지 선언 제약사항
- 소스의 가장 첫 줄에 있어야 한다. (주석이나 공백은 상관 없음)
- 패키지 선언은 소스 하나에는 하나만 있어야 한다. (한 소스 파일이 두 개의 폴더에 한번에 존재할 수 없기에)
- 패캐지 이름과 위치한 폴더 이름이 같아야 한다.
- 패키지 이름이 java로 시작해서는 안된다.
- 패키지 명명규칙 : 꼭 지켜야하는 것은 아니지만 기본적으로 정해진 규칙이다.
- 패키지 이름은 모두 소문자로 지정한다.
- 자바의 예약어를 절대 사용하면 안된다.
- java~ : 자바 기본 패키지 (Java 벤더에서 개발)
- javax~ : 자바 확장 패키지 (Java 벤더에서 개발)
- org : 일반적으로 비 영리단체(오픈 소스) 패키지
- com : 일반적으로 영리단체(회사) 패키지
다른 패키지 접근
- 패키지가 있을 때, 같은 패키지에 있는 클래스들과 java.lang 패키지의 클래스만 찾을 수 있다.
- 만약 같은 패키지 내 관련 클래스의 Java 파일이 존재하면 그 클래스를 먼저 컴파일 후 호출하는 클래스를 컴파일한다.
- 다른 패키지에 있는 클래스를 찾지 못할 때 사용하는 키워드가 import 다.
- 패키지 선언 아래, 클래스 선언 위에 import 패키지이름.클래스이름을 명시한다.
- 컴파일러에게 그 패키지에 있는 클래스를 사용하겠다고 알려주는 역할.
- 기존 클래스 컴파일 시 import 한 패키지의 클래스도 자동으로 컴파일된다.
- import 패키지이름.*; 로 import 하면 해당 패키지로 선언한 클래스 전부를 import 할 수 있다.
- 해당 패키지의 하위 패키지로 선언한 클래스들은 import 할 수 없다.
package c.javapackage;
// Package 클래스는 c.javapackage 패키지에 존재
// Sub 클래스는 c.javapackage.sub 패키지에 존재하기 때문에 import 없이 사용 불가
import c.javapackage.sub.Sub; //Package 클래스 컴파일 시 Sub 클래스도 자동으로 컴파일된다.
import c.javapackage.sub.*; //c.javapackage.sub 패키지로 선언한 모든 클래스들 import
import c.*; //c 패키지로 선언한 클래스만 import 할 뿐 하위 패키지에 선언한 클래스들은 import 하지 않는다.
public class Package {
// 내용 생략
}
- static import는 static한 변수(클래스 변수)와 static 메소드를 사용하고자 할 때 용이하다.
package c.javapackage;
public class SubStatic {
public final static String CLASS_NAME = "SubStatic"; //static 변수 = 클래스 변수
public static void subStaticMethod(){} //static 메소드
}
=================================================================================
// ex) import static 이 안되는 경우
package c;
import c.javapackage.SubStatic;
public class Package {
public static void main(String [] args) {
SubStatic.subStaticMethod();
System.out.println(Substatic.CLASS_NAME);
}
}
// ex) import static 이 되는 경우
package c;
// import static c.javapackage.Substatic.*; 도 가능
import static c.javapackage.SubStatic.subStaticMethod;
import static c.javapackage.SubStatic.CLASS_NAME;
public class Package {
public static void main(String [] args) {
SubStatic.subStaticMethod();
System.out.println(Substatic.CLASS_NAME);
}
}
- import static 이 없는 경우 해당 클래스명.static메소드명(); / 클래스명.static변수명; 으로 사용해야한다.
- import static 을 사용하는 경우 static 메소드명 / static 변수명으로만 사용이 가능하다.
- 자신의 클래스의 static 변수 / 메소드와 import static의 변수 / 메소드 비교
- 자신의 클래스에 있는 static 변수 / 메소드가 우선이다.
접근 제어자
- 접근 제어자 종류는 총 네 가지가 있다.
- public : 누구나 접근할 수 있도록 할 때 사용한다.
- protected : 같은 패키지 내에 있거나 상속받은 경우에만 접근할 수 있다.
- package-private : 아무런 접근 제어자를 적어주지 않을 때, 같은 패키지 내에 있을 때만 접근 가능.
- private : 해당 클래스 내에서만 접근 가능.
- 접근 제어자는 클래스, 메소드, 인스턴스 / 클래스 변수를 선언할 때 사용된다.
- 접근 제어자 사용하는 경우
- 변수의 경우 - 직접 접근해서 변수를 변경 못하게 하기 위함, 변경이나 조회는 꼭 메소드를 통해서 할 수 있도록 함
- DTO의 경우 - 변수를 private으로 선언하고 생성자로만 선언할 수 있도록 하고 아무도 그 값을 변경할 수 없게 하고 값을 조회하는 메소드만 따로 만들어 놓는 방식.
- 접근 제어자를 클래스에 사용하는 경우
- 자바에서는 한 소스 내에 여러 클래스가 선언될 수 있다.
각 클래스마다 접근 제어자가 존재한다. - 한 소스 안에 여러 클래스가 존재하는 경우 public 클래스가 여러 개가 될 수 없다!!!
- public으로 선언된 클래스가 소스 내에 있다면 그 소스 파일의 이름은 public 클래스 이름과 동일해야한다
- 그렇기에 public 클래스가 한 소스파일 내 여러 개라면 에러가 발생한다.
- 실력이 되지 않을 때에는 한 소스 파일에 한 개의 클래스만 선언하자!!
- 자바에서는 한 소스 내에 여러 클래스가 선언될 수 있다.
간단 내용 정리
1. 패키지를 선언할 때 사용하는 예약어는 무엇인가요?
ㅡ> package
2. 패키지 선언은 클래스 소스 중 어디에 위치해야 하나요?
ㅡ> 소스 가장 위에 위치
3. 패키지를 선언할 때 가장 상위 패키지의 이름으로 절대 사용하면 안되는 단어는 무엇인가요?
ㅡ> java로 시작해서는 안된다.
4. 패키지 이름에 예약어가 포함되어도 되나요?
ㅡ> X, 중간에도 포함되면 안된다.
5. import는 클래스 내에 선언해도 되나요?
ㅡ> X, 클래스 선언 전 import 가 명시되어있어야 한다.
6. 같은 패키지에 있는 클래스를 사용할 때 import를 해야 하나요?
ㅡ> X, 같은 패키지 내 클래스 / java.lang 패키지는 import 할 필요 없다.
7. 특정 패키지에 있는 클래스들을 모두 import할 때 사용하는 기호는 무엇인가요?
ㅡ> * 기호
8. 클래스에 선언되어 있는 static한 메소드나 변수를 import하려면 어떻게 선언해야 하나요?
ㅡ> import static 패키지명.클래스명.*;
9. 접근 제어자 중 가장 접근 권한이 넓은 (어떤 클래스에서도 접근할 수 있는) 것은 무엇인가요?
ㅡ> public
10. 접근 제어자 중 가장 접근 권한이 좁은 (다른 클래스에서는 접근할 수 없는) 것은 무엇인가요?
ㅡ> private
11. 접근 제어자 중 같은 패키지와 상속관계에 있는 클래스만 접근할 수 있도록 제한하는 것은 무엇인가요?
ㅡ> protected
12. Calculate.java라는 자바 소스가 있을 경우, 그 소스 내에는 Calculate라는 클래스외에는 ( )으로 선언된 클래스가 있으면 안된다. 여기서 괄호 안에 들어가야 하는 것은 무엇인가요?
ㅡ> public