스터디/LiveStudy

7주차 과제: 패키지

TheWing 2020. 12. 30. 01:36

패키지

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

Package 패키지

  • 자바에서 패키지란 클래스와 인터페이스등의 집합(폴더)을 의미한다.

  • 파일들을 묶음으로써 파일을 효율적으로 관리할 수 있게 한다.

  • 협업 시 서로 작업한 클래스 사이에서 발생할 수 있는 이름 충돌 문제까지도 패키지를 이용하면 피할 수 있다

    • ex)
      • me.thewing.livestudy._4week 패키지의 test.java
      • me.thewing.livestudy._5week 패키지의 test.java
  • 자바에서 패키지는 물리적으로 하나의 디렉토리를 의미한다 따라서 하나의 패키지에 속한 클래스나 인터페이스 파일은 모두 해당 패키지 이름의 디렉터리에 포함되어 있다

  • 디렉터리의 계층구조는 점(.) 으로 구분된다

  • 소스코드 첫번째 줄에 있어야하고 하나만 있어야 한다.

  • 패키지의 이름과 디렉터리 구조가 같아야 한다.

예제

자바에서 가장 많이 사용되는 패키지 중 하나인 String 클래스의 패키지 이름이다

java.lang.String

위의 예제에서 자바 String 클래스는 java.lang 패키지에 속한 클래스이다

선언

package 패키지이름;
package me.thewing
  • 위와 같은 명령문을 클래스나 인터페이스의 소스 파일에 추가하면된다
  • 패키지 이름에는 패키지의 경로까지 포함한 풀 네임을 명시해야한다

규칙

  • 패키지 이름은 모두 소문자
  • 자바의 예악어를 사용하면 안된다

이름 없는 패키지(unnamed package)

  • 자바의 모든 클래스는 반드시 하나 이상의 패키지에 포함되어야한다
  • 자바 컴파일러는 소스 파일에 어떠한 패키지의 선언도 포함되지 않으면, 기본적으로 이름 없는 패키지에 포함해 컴파일한다
  • 패키지를 명시하지 않은 모든 클래스와 인터페이스는 모두 같은 패키지에 포함된다

import 키워드

  • 위와 같이 선언한 패키지에 속한 클래스를 다른 파일에서 사용하기 위해서는 클래스 이름 앞에 패키지의 경로까지 포함한 풀 네임을 명시해서 사용해야한다
  • 클래스를 사용할 때마다 매번 이렇게 긴 이름을 사용하는 것은 비효율적이므로 import키워드가 존재한다
  • import는 자바 컴파일러에 코드에서 사용할 클래스의 패키지에 대한 정보를 미리 제공하는 역할을한다
  • import문을 사용하면 다른 패키지에 속한 클래스를 패키지 이름을 제외한 클래스 이름만으로 사용할 수 있게 된다

선언

import 패키지이름.클래스이름; // 첫 번쨰 방법
import 패키지이름.*; // 두 번째 방법

import me.thewing._6week.test;
import me.thewing._6week.*;
  • 패키지 이름에는 패키지의 경로까지 포함한 풀 네임을 명시해야한다
  • 첫 번째 방법은 해당 패키지의 특정 클래스만을 사용해야할때 사용한다
  • 두 번째 방법은 해당 패키지의 모든 클래스를 클래스 이름만으로 사용하고 싶을 때 사용한다
  • 알고리즘 문제 풀면서 util클래스를 자주 사용했는데 import를 import java.util.*; 이렇게 사용했었다. Clean Code(서적) 에서 이렇게 사용하지 말라해서 사용안하고 있다..

클래스패스

  • 클래스를 찾기 위한 경로
  • JVM이 프로그램을 실행할 때 클래스 파일을 찾는데 기준이 되는 파일의 경로이다.
  • 소스 코드(.java로 끝나는 파일)를 컴파일하면 소스 코드가 바이트 코드로 변환된다. java runtime(java 또는 jre)으로 이 .class 파일에 포함된 명령을 실행하려면, 이 파일을 찾을 수 있어야 한다. 이때 .class 파일을 찾을 때 classpath에 지정된 경로를 사용한다. classpath는 .class 파일이 포함된 디렉토리와 파일을 콜론으로 구분한 목록이다. java runtime은 이 classpath에 지정된 경로를 모두 검색해서 특정 클래스에 대한 코드가 포함된 .class 파일을 찾는다. 찾으려는 클래스 코드가 포함된 .class 파일을 찾으면 첫 번째로 찾은 파일을 사용한다.

classpath를 지정할 수 있는 두 가지 방법

  • 환경 변수 CLASSPATH를 사용하는 방법
  • java runtime에 -classpath 플래그를 사용하는 방법

CLASSPATH 환경변수

  • 시스템 환경 변수 편집으로 지정이 가능하다

  • 경로 지정해주면된다

classpath 옵션

  • 사용방법
    • javac <options> <souce files>
  • classpath(cp) path(파일 절대 경로)
    • 컴파일러가 컴파일 하기 위해서 필요로 하는 참조할 클래스 파일들을 찾기 위해서 컴파일시 파일 경로를 지정해주는 옵션. 예를 들어, Hello.java파일이 C:Java 디렉터리에 존재하고, 필요한 클래스 파일들이 C:JavaEngclasses에 위치한다면, javac -classpath C:JavaEngclasses C:JavaHello.java 로 해주면 된다. 만약 참조할 클래스 파일들이 C:JavaEngclasses외의 다른 디렉터리에도 존재한다면, C:JavaKorclasses 일경우,
      javac -classpath C:JavaEngclasses;C;JavaKorclasses C:JavaHello.java 그리고, 현재 디렉터리역시 포함하고 싶다면,
      javac -classpath .;C:JavaEngclasses;C;JavaKorclasses C:JavaHello.java
      기본적으로, dos에서는 .는 현재 디렉터리를 의미하고, ..는 현재 디렉터리의 상위디렉터리를 의미한다. 또한 classpath 대신 단축어인 cp를 사용해도 된다.
      javac -cp C:JavaEngclasses C:JavaHello.java

접근제어자(Access modifier)

public class AccessModifier {
    public void publicMethod() {
    }
    protected void protectedMethod() {
    }
    void packagePrivateMethod() {
    }
    private void privateMethod(){
    }
}
  • public

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

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

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

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


      예시

      package me.thewing.godofjava;
      
      public class AccessModifier {
        public void publicMethod() {
        }
        protected void protectedMethod() {
        }
        void packagePrivateMethod() {
        }
        private void privateMethod(){
        }
      }
      package test.sub.AccessModifier;
      
      import test.sub.AccessModifier;
      
      public class AccessCall {
        public static void main(String[] args) {
            AccessModifier accessModifier = new AccessModifier();
            accessModifier.publicMethod();
            accessModifier.protectedMethod(); //에러 : 같은 패키지 내이거나 상속받을 경우만 가능
            accessModifier.packagePrivateMethod(); //에러 : 같은 패키지 내에서만 가능 
            accessModifier.privateMethod(); //에러 : 해당 클래스에서만 가능
        }
      }

      Reference

    • 자바의신

    • http://www.tcpschool.com/java

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

    • https://payoff.tistory.com/401

 

'스터디 > LiveStudy' 카테고리의 다른 글

9주차 과제: 예외 처리  (0) 2021.01.11
8주차 과제: 인터페이스  (0) 2021.01.04
6주차 과제: 상속  (0) 2020.12.21
5주차 과제: 클래스  (0) 2020.12.19
4주차 과제: 제어문  (0) 2020.12.09