[Java]패키지

정석용·2023년 4월 10일
0

Java

목록 보기
7/15

package

클래스를 체계적으로 관리하기 위찬 도구 / 클래스들을 구분 짓는 폴더

패키지의 물리적인 형태는 파일 시스템의 폴더
단순히 파일 시스템의 폴더 기능만 하는것이 아니라 클래스의 일부분

  • 클래스를 유일하게 만들어주는 식별자
    클래스 이름이 동일해도 패키지가 다르면 다른 클래스로 인식한다. 또한 패키지 내부에 패키지를 둘 수도 있다.
  • 패키지와 클래스는 도트(.)를 사용해서 표시
상위패키지.하위패키지.클래스
ex.
package example.하위패키지;
public class Classname{
}

패키지 이름 규칙

  • 숫자로 시작하거나,'_'과 '$'를 제외한 특수 문자를 사용 금지
  • java로 시작하는 패키지 금지(자바 표준API에서만 사용)
  • int,static 등 자바 예약어 금지
  • 모두 소문자로 작성하는 것이 관례

패키지의 존재 이유
클래스를 체계적으로 관리하지 않으면 수십, 수백 개의 클래스 간의 관계가 뒤엉켜 복잡해질 수 있다.

Import

같은 패키지에 속하는 클래스들은 아무런 조건 없이 다른 클래스를 사용할 수 있지만, 다른 패키지에 속하는 클래스를 사용하려면 두 가지 방법 중 하나를 선책해야한다.

1.패키지와 클래스를 모두 기술(FQCM(Fully Qualified Class Name)이라고 함
2.import 문을 사용

  1. EX.
public class Main {
    
    public static void main(String[] args){
        상위패키지.하위패키지.Ship ship = new 상위패키지.하위패키지.Ship();
    }
    
}

패키지 이름이 길거나, 사용해야 할 클래스가 수가 많다면 코드가 난잡해 보인다.
따라서 import 문을 주로 사용

  • 첫 번째 방법이 꼭 필요한 상황
    서로 다른 패키지에 동일한 클래스 이름이 존재하거, 두 패키지가 모두 import되어 있을 경우
    자바 컴파일러가 어떤 패키지에서 클래스를 로딩할지 결정할 수 없어 컴파일 에러가 발생한다.때문에 첫 번쨰 방법을 사용.
  1. EX.
import week7.하위패키지2.*;

public class ...

패키지 선언과 클래스 선언 사이에 작성
패키지의 포함된 다수의 클래스를 사용해야 한다면 클래스 이름을 생략하고 대신 (*)를 사용.

빌트 인 패키지(Built in Package)

자바에서 개발자들이 사용할수 있도록 제공하는 패키지. 이중에서 자주 사용하는 패키지는 import를 하지 않아도 사용할 수 있다. 예를 들어 java.lang 패키지는 import 없이 사용 가능하다.

static import

일반적인 import와 다르게 메소드와 변수를 패키지, 클래스명 없이 접근 가능

장점: one is 1 과 같이 영어 문장 읽듯이 코드를 읽을 수 있어서, 코드의 의도를 한 눈에 볼수 있다는 점이다. 이러한 장점은 코드가 길어지고, 많은 메소드와 필드를 사용할 때 더 빛을 발한다.

클래스에 import한 동일한 이름의 static 변수나 static메소드가 자신의 클래스에 있다면 import static으로 가져온 것보다 자신의 클래스에 있는 static 변수나 메소드가 우선된다.

클래스패스

JVM이나 Java 컴파일러에 클래스와 패키지의 위치를 지정해주는 파라미터이다. 즉, 자바에서 클래스를 찾을 때 사용하는 경로다. 클래스패스를 지정해주지 않으면 기본적으로 현재 디렉토리가 클래스 패스로 지정된다.

클래스 패스를 사용하가 위한 방법으로는 -classpath 옵션, CLASSPATH 환경변수 두 가지가 있다.

classpath 옵션
예를들면 Main 파일에 있는 소스 코드를 컴파일 하려할 때 소스 코드를 다른 디렉토리로 옮겼다고 가정을 해보자.
그러면 java 명령어 실행시, main사용하는 클래스를 찾지 못해 에러가 발생한다.
이때 프로그램 실행을 위한 클래스 경로를 JVM에게 알려주는 역할을 하는 것이 클래스패스이다.

java -classpath ".:디렉토리명" Main

코드 사용시 정상적으로 프로그램이 사용된다.

CLASSPATH 환경변수

운영체제에 지정하는 변수. JVM과 같은 애플리케이션들은 환경변수의 값을 참고해 동작한다. 자바는 위에서 설명한 클래스패스로 CLASSPATH 환경변수를 사용한다.

CLASSPATH 환경변수는
export CLASSPATH=/경로 또는 exportCLASSPATH=경로1;경로2;
CLASSPATH 환경변수는 콜론으로 구분하여 클래스경로를 여러개로 등록할 수 있다.
classpath 옵션을 생략하고, 자바 프로그램을 실행해도 정상적으로 작동한다.

접근지시자

클래스를 설계할 때 외부클래스에서 접근할 수 있는 멤버와 접근할 수 없는 멤버로 구분해서 필드, 생성자, 메소드를 설계하는 것이 바람직하다. 그 이유로 다음과 같은 상황이 있을 수 있기 때문이다.

  • 특정 객체 생성을 막기 위한 생성자 호출 제한
  • 객체의 특정 데이터를 보호하기 위한 필드에 접근 제한
  • 특정 메소드 호출을 막기 위해

접근 제한자의 종류에는 Public, protected, default(package-private),private 가 있다.

Public : 누구나 접근 가능

Protected : 같은 패키지 or 상속받은 경우 접근

Default(package-private) : 같은 패키지만 접근

Private : 해당 클래스 내에서만 접근

클래스의 접근 제한
고려사항: 같은 패키지 내에서만 사용, 다른 패키지에서도 사용
public default

주의사항
A.java 라는 소스 코드에 A라는 클래스를 제외한 다른 클래스가 public으로 선언되어 있으면 컴파일 불가

생성자의 접근 제한
적용 가능 접근 제한:public, protected, default, privated

public
모든 패키지에서 아무런 제한 없이 생성자를 호출 가능 생성자가 public 접근 제한을 가진다면 클래스도 public 접근 제한을 가져야 한다. 클래스가 default 접근 제한을 가지면 클래스 사용이 같은 패키지로 한정되므로 같은 패키지에서만 생성자를 호출할 수 있기 때문이다.

protected
같은 패키지에 속하는 클래스 or 다른 패키지에 속한 클래스가 해당 클래스의 자식 클래스라면 생성자를 호출 가능

default
같은 패키지에서만 생성자를 호출 가능

private
생성자를 호출하지 못하도록 제한
클래스 외부에서 new 연산자로 객체를 만들 수 없다. 오로지 클래스 내부에서만 생성자를 호출하여 객체를 만들 수 있다. 프로그램에서 클래스의 객체를 단 하나만 갖는 싱글톤 패턴 등에 사용될 수 있다.

필드와 메소드릐 접근 제한
적용 가능한 접근 제한: public, protected, default, private

package 접근제한자.package1;

public class A{
    public int field1;
    int field2;
    private int field3;
    
    public void method1(){}
    void method2(){}
    private void method3(){}
    
}
package 접근제한자.package1;

public class B{
    public B(){
        A a = new A();
        a.field1 = 1; // 접근가능 o
        a.field2 = 1; // 접근가능 o
        a.field3 = 1; // 접근불가 x - private 필드 접근 불가 (컴파일 에러)
        
        a.method1();// 접근가능 o
        a.method2();// 접근가능 o
        a.method3();// 접근불가 x - private 필드 접근 불가 (컴파일 에러)
    }
}
package 접근제한자.package2;

import 접근제한자.package1.A;

public class C {
    
    public C(){
        A a = new A();
        a.field1 = 1; // 접근가능 o
        a.field2 = 1; // 접근불가 x - default 필드 접근 불가 (컴파일 에러)
        a.field3 = 1; // 접근불가 x - private 필드 접근 불가 (컴파일 에러)
        
        a.method1();// 접근가능 o
        a.method2();// 접근불가 x - default 필드 접근 불가 (컴파일 에러)
        a.method3();// 접근불가 x - private 필드 접근 불가 (컴파일 에러)
    }
}

래퍼런스

https://scshim.tistory.com/221
https://scshim.tistory.com/202

profile
오늘도 성장중

0개의 댓글