[백기선님과 함께하는 Live-Study] 7주차 - 패키지

JoonYoung Maeng·2020년 12월 28일
0
post-thumbnail

✔️ 목표

자바의 패키지에 대해 학습하세요.

✔️ 학습할 것 (필수)

  • package 키워드
  • import 키워드
  • 클래스패스
  • CLASSPATH 환경변수
  • classpath 옵션
  • 접근지시자

💡 Package 키워드

image

Package의 단어 정의를 보면 "An object or group of objects wrapped in ~ "라고 정의되어 있다. 어떤 것으로 오브젝트 혹은 그룹을 감싸는 것이다. 이를 자바에 대입해보면 "object or group of object"class가 된다.

즉, 자바의 Package는 하나 이상의 클래스를 묶어놓은 묶음으로 하나의 디렉토리(폴더)이다. 일반적으로 특징이나 비슷한 기능을 가진 클래스들을 하나의 패키지로 묶어 사용한다.

✔️ 이름 공간 (Namespace)

네임스페이스개체를 구분할 수 있는 범위를 말하며, 하나의 개체는 하나의 네임스페이스에서는 하나의 이름을 가진다. 자바의 패키지네임스페이스 역할을 한다. 따라서, 동일한 이름의 클래스가 존재하더라도 다른 패키지에 해당 클래스들이 존재한다면 다른 공간으로 인식해 문제가 되지 않는다.

image

👉🏻 A 패키지에 동일한 이름의 클래스인 Phone을 두개 생성하면 에러가 나는 것을 확인할 수 있다.

image

👉🏻 서로 다른 이름을 가진 패키지A와 B에 동일한 이름의 클래스인 Phone을 각각 생성하면 에러 없이 생성됨을 확인할 수 있다.

image

✏️ 패키지 선언

패키지내의 클래스에서 자신이 속한 패키지를 코드의 첫 번째 자신이 속한 패키지 명을 명시해야한다.

package com.livestudy.sixth;
public class Car {...}

✏️ 패키지 명명 규칙

  • 자바의 키워드를 패키지 명으로 사용할 수 없다.
  • 보통 도메인 이름을 거꾸로 적은 후, 그 뒤에 프로젝트 이름을 붙여서 만든다.
  • 명칭은 소문자로 작성한다.
  • 소스 파일들을 구분하기위해 .으로 구분한다 ex) com.livestudy.sixth;

image


💡 Import 키워드

어떤 클래스에서 다른 클래스를 가져와 사용하고 싶을 때 사용하는 키워드이다.

같은 패키지내의 private으로 선언된 클래스를 제외한 모든 클래스, 다른 패키지의 public으로 선언된 클래스를 import 키워드를 통해 가져와 사용할 수 있다.

단순 한개의 클래스를 가져오고 싶다면 import 패키지명.클래스명;형식으로 가져올 수 있고, 만약 해당 패키지의 접근 가능한 모든 클래스를 가져오고 싶다면, 클래스명에 와일드카드 문자(*)를사용해 import 패키지명.*; 형식으로 가져올 수 있다.

✔️ static import

static import는 jdk 1.5부터 정적 메소드를 보다 쉽게 사용하기 위해 지원하기 시작하였다.

예를 들어, AssertJ의 assertThat 메소드의 경우 Assertions 클래스의 static 메소드이기 때문에 Assertions.assertThat()형식으로 사용한다.

import org.assertj.core.api.Assertions;
Assertions.assertThat(member).isEqualTo(findMember);

하지만 import static으로 AssertJ의 Assertions를 선언해 사용한다면 assertThat()으로 사용이 가능하다.

import static org.assertj.core.api.Assertions;
assertThat(member).isEqualTo(findMember);

import static을 사용할 때 동일한 이름의 메소드를 클래스 내부에 생성되어 있다면, 클래스 자신의 메소드가 우선순위를 가진다.


💡 클래스패스

java 소스 파일(.java)을 자바 컴파일러가 컴파일에 성공하면 JVM이 읽을 수 있는 java 바이트 코드(.class)로 변환된다.

image

JVM이 runtime 시에 Java 바이트 코드를 클래스 로더에 로딩하기 위해선 해당 파일이 있는 위치를 찾아야하는데 여기서 해당 파일의 위치를 찾는 기준이 되는 경로를 클래스패스라 한다.

📌 클래스패스를 지정해주는 방법

👉🏻 CLASSPATH 환경변수

클래스패스를 지정해주는 첫번째 방법은 CLASSPATH 환경변수를 사용하는 것이다.

JVM의 클래스로더(System Class Loader)는 런타임 시에 $CLASSPATH 환경변수를 호출해 해당 디렉토리에 정의된 클래스들을 로딩한다.

image

출처 : https://www.ibm.com/developerworks/library/j-dclp1/index.html

The system class loader (also known as the application class loader) is the class loader responsible for loading code from the path specified by the CLASSPATH environment variable. By default, this class loader is the parent of any class loader created by the user.

👉🏻 -classpath 옵션

클래스패스를 지정해주는 두번째 방법은 -classpath 옵션을 사용하는 것이다.

-classpath 옵션은 자바 컴파일러가 컴파일 하기 위해서 필요로 하는 참조할 클래스 파일들을 찾기 위해 컴파일 시에 파일 경로를 지정해주는 옵션이다.

즉, 다른 클래스에 의존하는 클래스의 소스 파일을 컴파일 하기 위해서 다른 클래스가 위치하는 경로를 나타내주는 것이다.


💡 접근 지시자

자바에서는 외부 클래스에서 접근하는 범위를 접근 지시자를 통해 제한할 수 있다.

접근 지시자는 public, protected, default, private 네 가지가 있다.

ClassAccessModifier에 각각 4개의 접근지시자로 메소드를 생성하였다. 같은 패키지 같은 클래스 내에서는 모두 컴파일 에러없이 메소드가 호출된다.

package com.livestudy.seventh;

public class ClassAccessModifier {
    public void publicTest() {
        System.out.println("public method test");
    }

    protected  void protectedTest() {
        System.out.println("protected method test");
    }

    void defaultTest() {
        System.out.println("default method test");
    }

    private  void privateTest() {
        System.out.println("private method test");
    }

    public static void main(String[] args) {
        ClassAccessModifier classAccessModifier = new ClassAccessModifier();
        classAccessModifier.publicTest();
        classAccessModifier.protectedTest();
        classAccessModifier.defaultTest();
        classAccessModifier.privateTest();
    }
}

동일한 패키지에서 다른 클래스인 AccessModifier에서 ClassAccessModifier를 생성해 해당 메소드들을 호출하면 private 접근 지시자로 생성된 메소드의 경우 메소드를 호출할 수 없다는 에러메세지가 출력된다.

package com.livestudy.seventh;

public class AccessModifier {
    public static void main(String[] args) {
        ClassAccessModifier classAccessModifier = new ClassAccessModifier();
        classAccessModifier.privateTest();  //같은 패키지지만 private 지시자
        classAccessModifier.publicTest();
        classAccessModifier.protectedTest();
        classAccessModifier.defaultTest();
    }
}

image

다른 패캐지에서 ClassAccessModifier를 생성해 해당 메소드들을 호출하면 public 접근 지시자로 생성된 메소드 이외의 모든 메소드들이 컴파일 에러를 발생시키는 것을 확인할 수 있다.

package com.livestudy.sixth;

import com.livestudy.seventh.ClassAccessModifier;

public class AccessModifierInSixth {
    public static void main(String[] args) {
        ClassAccessModifier classAccessModifier = new ClassAccessModifier();
        classAccessModifier.publicTest();
        classAccessModifier.protectedTest();  //다른 패키지 protected
        classAccessModifier.defaultTest();    //다른 패키지 default
        classAccessModifier.privateTest();    //다른 패키지 private
    }
}

image

이를 통해 자바의 접근 지시자는 아래 표와 같은 범위로 접근을 제한함을 확인할 수 있다.

접근지정자클래스 내부동일 패키지하위 클래스그 외 영역
publicOOOO
protectedOOOX
default(기본, 생략가능)OOXX
privateOXXX

📃 Reference

패키지 : https://imasoftwareengineer.tistory.com/71

CLASSPATH : https://www.ibm.com/developerworks/library/j-dclp1/index.html

CLASSPATH : https://effectivesquid.tistory.com/entry/자바-클래스패스classpath란

-classpath 옵션 : https://payoff.tistory.com/401

profile
백엔드 개발자 지망생입니다!

0개의 댓글