도도한 개발자

[Java] #09. 패키지와 접근 제어자 본문

Backend/Java

[Java] #09. 패키지와 접근 제어자

Kiara Kim 2022. 3. 14. 21:29

* 패키지

 

자바 애플리케이션을 개발할 때 클래스들을 분류하지 않으면 이름이 중복되거나, 어떤 클래스가 어떤 일을 하는지 혼동되는 일이 발생한다. 그래서 '패키지'라는 것이 존재한다.

 

 

** 패키지 선언을 할 때 꼭 지켜야 하는 제약사항이 있다.

 

- 소스의 가장 첫 줄에 있어야 한다.

   package 선언 위에 주석이나 공백이 있는 것은 상관없으나 다른 자바 문장이 하나라도 있으면 컴파일이 제대로 되지 않는다.

- 패키지 선언은 소스 하나에 하나만 있어야 한다.

   한 소스 파일이 두개의 폴더에 한번에 존재할 수 없기 때문이다.

- 패키지 이름과 위한 폴더 이름이 같아야 한다.

   자바 파일을 만들어 놓은 폴더의 이름과 여기에 선언된 패키지 이름이 다를 경우, javac로 컴파일하려고 하면 파일을 찾지 못하여 컴파일이 되지 않는다. 

 

 

* import를 이용하여 다른 패키지 접근

 

다른 패키지에 있는 클래스를 사용하고자 할 때 import 예약어를 이용한다. import 단어 뒤에 "패키지이름.클래스이름"을 명시해주면 그 패키지에 있는 클래스를 사용하겠다는 것을 컴파일러에게 알려준다. 

 

import static으로 static한 변수나 메소드를 지정하면 굳이 클래스 이름을 지정하지 않아도 현재 클래스에 선언된 것처럼 사용할 수 있다. 또한 여러 줄로 import하기 번거롭다면 클래스 이름 대신 *를 사용해도 무방하다.

 

 

* 자바의 접근 제어자

 

자바의 접근 제어자는 4개가 있다. 이는 클래스, 메소드, 인스턴스 및 클래스 변수를 선언할 때 사용된다. public, protected, package-private(접근 제어자 없음), private가 잇는데 각 접근 제어자의 의미는 다음과 같다.

 

- public

   누구나 접근할 수 있도록 할 때 사용한다.

- protected

   같은 패키지 내에 있거나 상속받은 경우에만 접근할 수 있다.

- package-private

   아무런 접근 제어자를 적어주지 않을 때이며, package-private라고도 불린다. 같은 패키지 내에 있을 때만 접근할 수 있다.

- private

   해당 클래스 내에서만 접근 가능하다.

 

 

** 클래스 접근 제어자 선언 시 유의사항

 

클래스를 선언할 때에는 반드시 파일 이름에 해당하는 클래스가 존재해야 한다. 그러나 만약 A.java라는 소스코드에 A라는 클래스를 public으로 선언하지 않고 같은 소스에 public으로 선언된 다른 클래스가 있다면 이 소스는 컴파일이 되지 않는다. 

 

package sample;

class A {
	public static void main(String[] args) {
    }
}
class B {
}

 

이렇게 선언하거나

 

package sample;

public class A {
	public static void main(String[] args) {
    }
}
class B {
}

 

이렇게 선언하는 것은 컴파일이 정상적으로 된다. 그러나 아래와 같이 선언하면 안 된다.

 

package sample;

class A {
	public static void main(String[] args) {
    }
}
public class B {
}

 

 

* 정리

 

패키지를 선언할 때 사용하는 예약어는 무엇인가요?
패키지 선언할 때 사용하는 예약어는 package 이다.

패키지 선언은 클래스 소스 중 어디에 위치해야 하나요?
패키지 선언은 소스의 가장 위에 위치해야만 한다.

패키지를 선언할 때 가장 상위 패키지의 이름으로 절대 사용하면 안되는 단어는 무엇인가요?
패키지의 이름은 java로 시작하면 안된다. 

패키지 이름에 예약어가 포함되어도 되나요? 
중간에라도 예약어가 패키지의 이름으로 선언되어도 안된다.

import는 클래스 내에 선언해도 되나요?
import는 클래스 선언 전에 명시되어 있어야만 한다.

같은 패키지에 있는 클래스를 사용할 때 import를 해야 하나요?
같은 패키지 내의 클래스와 java.lang 패키지에 있는 클래스는 별도로 import할 필요가 없다.

특정 패키지에 있는 클래스들을 모두 import할 때 사용하는 기호는 무엇인가요? 
 * 기호를 사용하면 해당 패키지에 있는 모든 클래스를 import한다. 예를 들어 java.util패키지에 있는 모든 클래스를 import하려면
import java.util.*;
로 선언하면 된다. 하지만, 이렇게 사용할 경우 import되는 클래스 이름들이 중복될 수 있으므로, 되도록이면 명시적으로 지정하는 것이 좋다. 


클래스에 선언되어 있는 static한 메소드나 변수를 import하려면 어떻게 선언해야 하나요?
import static 을 사용하면 static한 변수를 쉽게 import할 수 있다. 

접근 제어자 중 가장 접근 권한이 넓은 (어떤 클래스에서도 접근할 수 있는) 것은 무엇인가요?
public 접근 제어자의 범위가 가장 넓으며, 어떤 클래스에서도 해당 클래스나 변수, 메소드에 접근 가능하다.

접근 제어자 중 가장 접근 권한이 좁은 (다른 클래스에서는 접근할 수 없는) 것은 무엇인가요?
private로 선언할 경우에는 해당 클래스에서만 접근 가능하다. 

접근 제어자 중 같은 패키지와 상속관계에 있는 클래스만 접근할 수 있도록 제한하는 것은 무엇인가요
protected로 선언한 경우에는 상속받은 클래스만 접근 가능하다.

Calculate.java라는 자바 소스가 있을 경우, 그 소스 내에는 Calculate라는 클래스외에는 ( )으로 선언된 클래스가 있으면 안된다. 여기서 괄호 안에 들어가야 하는 것은 무엇인가요? 

자바 소스에는 파일명과 동일한 public으로 선언한 클래스가 존재해야만 한다.

 

그럼 이만.

'Backend > Java' 카테고리의 다른 글

[Java] #11. API  (0) 2022.03.15
[Java] #10. 상속  (0) 2022.03.14
[Java] #08. 참조 자료형  (0) 2022.03.14
[Java] #07. 배열의 모든 것  (0) 2022.03.13
[Java] #06. 자바의 제어문 (키워드 : 조건)  (0) 2022.03.10