Java/자바의 신 VOL.1

09. 자바를 배우면 패키지와 접근 제어자는 꼭 알아야 해요

h2boom 2024. 6. 20. 18:37

패키지

패키지란?

  • 클래스들을 구분 짓는 폴더와 유사한 개념
    • 직접 만든 패키지와 이미 만들어져 있는 내장 패키지가 존재한다.
  • 개발 시 클래스들을 분류함으로 이름 중복, 클래스 역할 혼동 방지
  • 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



출처: 이상민, <자바의 신 VOL.1> 로드북