7주차 과제. 자바의 패키지에 대해 학습하세요

Jiwon·2022년 8월 27일

목표

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

학습할 것

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


package 키워드

클래스를 모아둔 폴더

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

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

같은 패키지내에서는 같은 클래스명을 사용할 수 없지만
다른 패키지내에 있다면 클래스 선언이 가능하다.
왜? 클래스가 물리적으로 하나의 클래스파일(.class) 인 것과 같이 패키지도 마찬가지로 물리적으로 하나의 디렉토리로 정해져있기 때문.
-> 개별적인 패키지 체계를 만듦으로써 따로 개발된 클래스 라이브러리이더라도 이름이 충돌하는 것을 막아준다.

built-in package

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

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

custom package

개발자가 직접 만드는 package 를 통칭.

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

...
public class...

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

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

패키지 별로 기능이 분할되도록 네이밍을 잘 짓는 것이 중요.

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

import 키워드

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

하지만 다른 패키지에 있을 경우,

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

import의 도움이 없다면 패키지경로부터 클래스명까지 하나하나 다 입력을 해주어야 해당 클래스를 사용할 수 있다.
즉, 다른 패키지에 있는 클래스를 사용하기 위해서 클래스 내에서 선언하기 전에 미리 해당 패키지에서 클래스를 정의해두는 기능을 해준다.

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

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

단, import java.*; 와 같이는 사용할 수 없다.

static import

기존의 import 문을 보면

package week7;

import week7.exam.Exam2;

public class Exam1 {
	public static void main(String[] args_{
    	Exam2.examPrint();
    }
}

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

package week7;

import static week7.exam.Exam2.examPrint;

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

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

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

클래스패스

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

class파일을 실행시키기 위해서는 package 경로가 반드시 포함되어 있어야 한다.

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

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

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

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

CLASSPATH 환경변수

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

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

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

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

-classpath 옵션

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

-classpath <디렉토리 및 zip/jar 파일의 클래스 검색 경로>
	클래스 파일을 검색할 : ()로 구분된 디렉토리,
    JAR 아카이브 및 ZIP 아카이브 목록입니다.
-cp <디렉토리 및 zip/jar 파일의 클래스 검색 경로>

src폴더 경로를 명시해주면 된다.

접근지시자

public, protected, private, default

private 지시자

정보 은닉을 위해 사용.
자바에서 말하는 정보란 ? 클래스의 '인스턴스 변수'를 의미.

private 지시자를 이용하면 인스턴스 변수 혹은 인스턴스 메소드를 클래스 내부에서만 접근 가능
정보 은닉을 할 수 있고, 정보 은닉은 객체지향언어에서 굉장히 중요한 부분 중 하나.

public 지시자 / Default 지시자

public 지시자는 클래스 정의에서도 쓰이고, private 지시자와 마찬가지로 인스턴스 멤버인 인스턴스 변수와 인스턴스 메서드를 대상으로 사용할 수 있다.
default 지시자도 마찬가지로 클래스 정의 에서도 쓰이고, 인스턴스 멤버를 대상으로 사용할 수 있다.
default 지시자는 아무런 지시자도 없을 때, 기본적으로 자바 컴파일러가 default 지시자를 적용한다.

public 지시자를 이용해 클래스를 정의하면 같은 패키지가 아니더라도 어디서든 인스턴스 생성이 가능하다.
이와 반대로 default 지시자를 이용하면 같은 패키지 내에서만 인스턴스 생성이 가능하다.

protected 지시자

protected 지시자는 인스턴스 멤버를 대상으로만 선언이 가능하고 다음 두 가지 특징을 가진다.

  • protected 선언은 default 선언이 허용하는 접근을 모두 허용
  • protected 선언은 default 선언이 허용하지 않는 '한 영역'에서의 접근도 허용

protected 지시자를 이용하면 다른 패키지 내에서도 상속 관계라면 인스턴스 멤버에 접근이 가능하다!


참고사이트
https://jinyoungchoi95.tistory.com/18
https://travelbeeee.tistory.com/438

profile
과연 나는 ?

0개의 댓글