ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [live-study] 7: 패키지
    개발/Java 2021. 1. 8. 20:33

     

    목표

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

    학습할 것 (필수)

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

    package 키워드

    패키지란? 특징

    • 패키지란 하나의 디렉토리와 같은 것이다.

    • 패키지명은 파일 구조와 동일해야 한다.

    • 서로 관련 타입들을 그룹화하고 네임스페이스를 정의한다.

    • 패키지와 타입(class, interface, enum..)의 이름을 합쳐야 FQCN(Fully Qualified Class Name)이 된다.
      예를 들어 String 클래스의 패키지는 java.lang이고, FQCN은 java.lang.String이 된다.

      String str = "class name";
      java.lang.String fqcn = "Fully Qualified Class Name)";

    패키지를 사용해서 얻는 이점

    • 쉽게 어떤 타입들이 모여있는지 알 수 있다.

    • 필요한 기능을 하는 타입들이 어디에 있는지 쉽게 찾을 수 있다.

    • 다른 역할을 가진 동일한 이름의 타입들이 충돌하지 않고 구분될 수 있다. (같은 이름의 다른 타입은 새로운 namespace를 생성한다.)

    • 패키지로 묶었을 때, 같은 패키지 내에서는 서로 접근가능하고 다른 패키지에서는 접근할 수 없도록 제한할 수 있다.

      타입은 클래스, 인터페이스, enum 등을 말한다.

    자바에서 package 키워드의 사용

    • 패키지에 들어있는 소스파일(.java파일)의 첫 줄에 package 선언을 추가해주어야 한다.

    • package 선언을 하지 않을 수도 있지만, 보통 작거나 임시로 사용하는 규모의 앱 또는 초기 단계에서만 그렇게 한다.

    • 만약 소스파일에 여러 타입이 있는 경우, 소스파일 이름과 똑같은 타입 하나만 public 을 사용할 수 있다.

    package test_package;
    
    public class Test {
        public static int THIS_IS_STATIC = 1;
    }
    

    package 네이밍 컨벤션

    • lower case(소문자)로 정의한다. (충돌을 피하기 위해)
    • 회사들은 예약된 인터넷 도메인 이름을 사용한다.
      • 개발자 이름이 soongjamm이고 회사 도메인이 example.com이라면 com.example.soongjamm
    • 회사 안에서 충돌이 나는 경우, 회사 이름 다음에 지역을 추가하는 등의 방식으로 처리한다.
      • com.example.soongajmm -> com.example.seoul.soongjamm
    • 도메인 네임이 자바 네이밍 규칙에 어긋나는 경우, _(underscore)를 추가한다.
      • int.33domain.com -> com.33domain.int

    import 키워드

    패키지 멤버는 위에서 계속 타입이라고 지칭했던 Class나 Interface등을 말한다.

    패키지 멤버에 접근하는 방법은 다음 3가지가 있다.

    • FQCN을 참조한다.
    • 패키지 멤버를 import 한다.
    • 패키지 전체를 import 한다.

    이 중 FQCN은 위에서 살펴보았다. (**java.lang.String** str = "Fully Qualified Class Name."같은 방식)

    자바에서 import 키워드의 사용

    • 패키지나 패키지 멤버를 import 하기 위해선 import 키워드를 사용하면 된다.

    • import 키워드는 package선언을 제외한 모든 선언 전에 쓰면 된다.

    • 패키지 멤버 하나만 import할 땐 import 패캐지명.패키지멤버로 한다.

    import java.util.ArrayList;
    
    public class Test {  
        ArrayList list = new ArrayList<>();  
    }
    • 패키지 전체를 import 할 땐 패키지명.* 로 한다. (*는 전체를 의미하는 와일드카드다.)
    import java.util.\*;
    
    public class Test {  
        ArrayList list = new ArrayList<>();  
        LinkedList list2 = new LinkedList<>();  
    }
    • 정적(static) 멤버도 import할 수 있다.
    import static test\_package.Test.THIS\_IS\_STATIC;  
    public class Study {  
        static int studyClass() {  
            int a = THIS\_IS\_STATIC;  
        }  
    }
    

    클래스패스

    클래스패스는 클래스나 패키지를 찾을 때 사용되는 경로로, JVM과 컴파일러에서 사용하는 파라미터다.
    자바는 .class 파일들을 다루기 위해 계층적 파일 시스템에 의존하지만, 자바가 요구하진 않는다. 그것이 클래스패스 덕분이다.

     

    예를들어 한 소스파일(rectangle.java)가 ...../graphics/ 에 위치한다고 하자.
    만약 컨벤션에 따라 패키지를 회사 도메인으로 했다면(도메인이 example.com인 경우) com.example.graphics가 패키지다.


    rectangle.java의 현재 경로는 com/example/graphics/rectangle.java 이다.
    컴파일을 하게되면 .class 파일이 생성되는데, 그럼 클래스 파일의 경로는 com/example/graphics/rectangle.class일 것이다.


    그러나 .class파일은 .java와 같은 곳에 위치할 필요가 없다.

     

    .javasrc/com/example/graphics/rectangle.java
    .classclasses/com/example/graphics/rectangle.java

     

    위와 같이 두 파일의 경로를 다르게 설정할 수 있다. 여기서 classes/클래스패스이다.

    이렇게 해서 class 디렉토리를 다른 프로그래머에게 주면, 소스코드를 넘겨주지 않아도 된다.
    클래스 파일의 경로를 JVM과 컴파일러에 파라미터로 설정해주면 알아서 필요한 자원을 찾는다.

    CLASSPATH 환경변수

    위에서 설명한 클래스패스를 환경변수를 통해 설정할 수 있다.

    Setting the CLASSPATH System Variable  
    To display the current CLASSPATH variable, use these commands in Windows and UNIX (Bourne shell):
    
    In Windows: C:> set CLASSPATH  
    In UNIX: % echo $CLASSPATH  
    To delete the current contents of the CLASSPATH variable, use these commands:
    
    In Windows: C:> set CLASSPATH=  
    In UNIX: % unset CLASSPATH; export CLASSPATH  
    To set the CLASSPATH variable, use these commands (for example):
    
    In Windows: C:> set CLASSPATH=C:\\users\\george\\java\\classes  
    In UNIX: % CLASSPATH=/home/george/java/classes; export CLASSPATH
    
    [출처 : 오라클](https://docs.oracle.com/javase/tutorial/java/package/managingfiles.html)

    환경변수를 잘못 설정해놓으면 JVM에서 .class파일을 찾지 못해서 실행하지 못한다.

    -classpath 옵션

    java 명령어로 실행할 때, -classpath-cp 옵션으로 클래스패스를 지정할 수도 있다.

    접근지시자

    main() 메소드를 가지지 않는 대부분의 클래스는 외부 클래스에서 사용할 목적으로 설계된 라이브러리 클래스이다.
    이러한 라이브러리 클래스에 접근할 수 있는 멤버나 접근할 수 없는 멤버를 구분해서 특정 데이터를 보호할 필요가 있다.

    그래서 접근 지시자를 통해 그 접근 가능한 범위를 지정한다.

    접근 제한 적용 대상 접근할 수 없는 클래스
    public 클래스, 필드, 생성자, 메소드 없음
    protected 필드, 생성자, 메소드 다른 패키지에 있고 서브클래스가 아닌 클래스
    default (명시하지 않음) 클래스, 필드, 생성자, 메소드 다른 패키지의 클래스
    private 필드, 생성자, 메소드 모든 외부 클래스

    참고

    https://docs.oracle.com/javase/tutorial/java/package/packages.html
    https://blog.baesangwoo.dev/posts/java-livestudy-7week/
    https://kils-log-of-develop.tistory.com/430

    댓글

Designed by Tistory.