티스토리 뷰

JAVA/whiteship-livestudy

패키지

최진영 2021. 4. 9. 20:21

package 키워드

클래스를 모아둔 폴더

 자바에서 패키지는 비슷한 성격을 가진 자바 클래스들을 한군데 모아놓은 디렉토리의 개념으로 사용된다. 단, 자바 클래스를 모아놓은 디렉토리이지 일반 디렉토리와는 다른 기능을 제공한다.

  • 같은 이름의 클래스를 선언하더라도 구분지어서 사용할 수 있다.
  • 비슷한 기능의 클래스를 묶어서 보관하여 편리하게 관리할 수 있다.

 같은 패키지내에서는 같은 클래스명을 사용할 수 없지만 다른 패키지내에 있다면 클래스 선언이 가능하다.

Exam1 둘 다 사용 가능하다.

 바뀐건 경로뿐인거 같은데 구분이 되는 이유는 클래스가 물리적으로 하나의 클래스파일(.class)인 것과 같이 패키지도 마찬가지로 물리적으로 하나의 디렉토리로 정해져있기 때문이다. 따라서 개별적인 패키지 체계를 만듦으로써 따로 개발된 클래스 라이브러리이더라도 이름이 충돌하는 것을 막아준다.

 패키지는 크게 built-in package와 custom package로 구분지을 수 있다.

built-in package

 자바는 개발자들에게 많은 패키지 클래스들을 제공한다. Java.util, java.lang 패키지가 대표적인 클래스이다. util이야 필요할때 마다 import해서 사용했었지만 lang 패키지는 import 한적이 없다. lang 패키지는 자바에서 알아서 import하여 사용하기 때문이다. 따라서 String이나 System 같은 클래스를 마음편하게 사용할 수 있었던 것이다.

System도 패키지 내에 들어가있다.

  • lang : 기본적인 자바 기능 관련(String, StringBuffer, System, Integer ...)
  • io : 시스템 입출력 관련(BufferedReader, InputStream ...)
  • util : Collection, Calender, Date 등 자주 쓰이는 유틸 클래스 (ArrayList, LinkedList, HashMap ...)
  • applet
  • awt : 유저 인터페이스, 그래픽 등 GUI를 구현하기 위한 클래스 관련
  • net : 네트워킹 기능 지원 관련

 

custom package

 기본으로 제공되는 built-in package말고도 개발자가 직접 만드는 package를 통칭한다.

 패키지 선언은 다음과 같은 방식으로 진행할 수 있다.

package 상위패키지.~.하위패키지;

...

public class ...

 단 클래스에서 네이밍 컨벤션이 있는 것처럼 패키지에도 네이밍 컨벤션이 존재한다.

  • 모두 소문자로 작성한다.
  • 자바 예악어(int, long ...)는 사용하면 안된다.
  • org.~ : 비영리 단체에서 만든 패키지
  • com.~ : 기업에서 만든 패키지

 무엇보다 중요한 것은 패키지 별로 기능이 분할되도록 네이밍을 잘 짓는것...!

 검색하다가 알게된 사실인데 도메인 이름으로 패키지 네이밍을 지을 경우 도메인이름 역순으로 이름을 짓고 마지막에 프로젝트 명을 짓는다고 한다(ex com.example.projectname). 처음 스프링 프로젝트를 생성하였을 때 com.example로 네이밍을 지었던 것이 결국 이것과 연결되는 것이다.

 custom package를 사용할 때는 가장 상단에 단 하나의 package 선언만하여 사용해야 한다.

 

import 키워드

 같은 패키지내에 있는 클래스는 패키지명을 굳이 포함하지 않더라도 같은 패키지가 import되어 있기 때문에 패키지명을 굳이 써주지않아도 된다.

 하지만 다른 패키지에 있을 경우 불러오려면 어떻게 해야할까? exam 패키지 안에 안에 있는 Exam2 클래스를 exam 패키지 밖에 있는(다른 패키지에 있는) Exam1 클래스에서 불러오는 코드를 보자.

package week7.exam;

public class Exam2 {
    public static void examPrint() {
        System.out.println("Exam2");
    }
}
package week7;

public class Exam1 {
    public static void main(String[] args) {
        week7.exam.Exam2.examPrint();
    }
}
//    [출력]
//    Exam2

 항상 IDE에서 자동으로 import 해주었지만 직접 패키지 경로를 작성해서 객체를 선언해보았다. 어색하지만 import의 도움이 없다면 패키지경로부터 클래스명까지 하나하나 다 입력을 해주어야 해당 클래스를 사용할 수 있다. 즉, 다른 패키지에 있는 클래스를 사용하기 위해서 클래스 내에서 선언하기 전에 미리 해당 패키지에서 클래스를 정의해두는 기능을 해준다.

 

import 상위패키지.~.하위패키지.클래스명;
import 상위패키지.~.하위패키지.*;

 import문에서 경로를 지정하여 클래스 하나만 지정하여서 해당 클래스만 받아서 사용할 수도 있고, * 키워드를 사용하여 해당 패키지 내에 있는 모든 클래스를 import 해두어 사용할 수도 있다. 실행 시 성능상의 차이는 전혀 없으니 편한 방법을 사용하면 될 것 같다. 단, import java.*;와 같이는 사용할 수 없다.

 

static import

 import도 다른 여타 키워드와 마찬가지로 static을 사용할 수 있다. 기존의 import 문을 먼저 보면

package week7;

import week7.exam.Exam2;

public class Exam1 {
    public static void main(String[] args) {
        Exam2.examPrint();
    }
}
//    [출력]
//    Exam2

 import를 하더라도 해당 클래스명을 명시해주어야 했다. 하지만 static import를 사용하면 해당 클래스명을 생략하더라도 사용할 수 있다.

package week7;

import static week7.exam.Exam2.examPrint;

public class Exam1 {
    public static void main(String[] args) {
        examPrint();
    }
}
//    [출력]
//    Exam2

 메소드를 사용할 때 굳이 클래스명을 명시하지 않아도 사용할 수 있다.

 짧고 간결하게 사용할 수 있지만 막무가내로 사용했을 경우 메소드 명이 중복되었을 경우 어떤 클래스에서 가져온지 확인할 수 없기 때문에 꼭 주의해서 사용해야한다.

 

클래스패스

 컴파일러(javac)나 JVM 등이 Java 클래스의 위치를 찾는데 사용되는 경로이다. JVM이 class 파일을 실행할 때 ClassLoader가 class 파일을 찾아야하는데 이때, 클래스패스에 지정된 경로를 사용한다.

 

 1주차에 했던 이야기지만 java 파일을 컴파일하고 실행하는 과정을 다시알아보자.


 week7 패키지 내에 있는 Exam7을 javac 컴파일러를 이용해 class파일로 만들었고 해당 폴더내에서 java Exam2를 실행했지만 클래스를 찾거나 로드할 수 없다고 한다. 단 src 폴더로 넘어와서 class 파일의 패키지에 대한 경로까지 넣어줬을 때는 제대로 동작함을 확인할 수 있다. 즉, .class 파일을 실행시키기 위해서는 package 경로가 반드시 포함되어있어야 한다.

 

 만약 이 class 파일을 다른 폴더에 옮겨놓고 실행하면 실행될까? 클래스 로드가 되지 않는다. class 파일을 하나 다른 곳에서 사용을 한다고 해도 이 class 파일은 패키지에 종속되어 동작하기 때문에 돌아가지 않는 것이다.

 따라서 지금 현재 위치에서 존재하지 않는 class를 불러와서 사용해야할 경우 클래스패스를 통해 JVM이 접근할 수 있도록 길을 열어주는 것이다.

 

 이렇게 지정해주어야하는 클래스패스를 사용자가 임의로 지정하는 방법은 두 가지가 있다.

  • CLASSPATH 환경변수 사용
  • Java runtime 시점에 -classpath 옵션 사용

 

CLASSPATH 환경변수

 윈도우에서 자바를 설치할 때 가장 먼저 하는 것이 있다. 환경변수 설정.

 자바를 설치하면 JAVA_HOME을 JDK 폴더로 지정하는 것 처럼 CLASSPATH 또한 시스템 환경 변수로써 지정할 수 있다.

변수 이름 : CLASSPATH
변수 값 : %JAVA_HOME%\lib;

 물론 다음과 같이 설정하게되면 운영체제 내의 모든 위치에서 해당 CLASSPATH를 받게 되는 것이기 때문에 변경, 추가 시 주의해서 사용해야한다.

 

-classpath 옵션

 .class 파일, .java 파일을 컴파일 혹은 실행하기 전 해당 파일이 필요한 클래스들이 존재하는 경로를 검색해주는 옵션이다.

java 명령어 List
javac 명령어 List

위는 java의 명령어, 아래는 javac의 명령어로 컴파일할 때나 런타임일 때나 모두 사용가능한 옵션이다. 어떤 역할을 해주는지 컴파일했던 .class 파일을 일단 다른경로로 두고 확인해보자.


찾을 수 없다고 한다. 분명 처음에 week7폴더에서 패키지 경로 없이 Exam2를 실행했을 때와 같은 오류가 발생했다. Exam2.class 파일은 생성한 자바프로젝트의 src 폴더에 필요한 클래스들이 존재하고 있기 때문에 다른 폴더에 갔을 때는 그 클래스들의 영향을 받지 못해서 찾거나 로드할 수 없다.

이때 -cp 혹은 -classpath 명령어를 통해서 src 폴더를 명시해주게되면 우리는 src 폴더에서 받고 있던 필요한 클래스들의 경로를 획득하여 다음과 같이 .class 파일을 실행할 수 있게 된다.


 

IDE에서의 클래스패스

지금까지는 터미널에서 이를 classpath에 대한 내용을 다루어보았다. 하지만 우리는 IDE라는 좋은 툴을 통해 이러한 과정을 진행하지 않고 도움을 받고 있다. 그럼 Intellij에서 classpath는 어떻게 지정되어있을까?


Project Structure 설정의 Modules에서 Content Root라는 이름으로 ClassPath를 자기가 알아서 지정하고 있음을 확인할 수 있다. 사실 앞서서 이야기했던 첫번째 방법은 운영체제에 있는 모든 ClassPath를 지정하는 일이기 떄문에 최대한 지양하고 다음과같이 IDE를 사용하여서 클래스패스를 설정해야한다고 한다.

 

 

'JAVA > whiteship-livestudy' 카테고리의 다른 글

예외 처리  (0) 2021.08.26
인터페이스  (0) 2021.04.14
상속  (0) 2021.03.28
클래스  (0) 2021.03.24
제어문  (0) 2021.03.17
댓글
최근에 올라온 글
Total
Today
Yesterday