package, import, classpath

2020-12-26
  • Java

7주차

package

정의

관련된 클래스 혹은 인터페이스들의 묶음이다. 파일 디렉토리의 폴더라고 생각하면 된다.

사용 이유

  • name confilcts 피함 → 클래스명의 고유성 보장
  • 코드의 더 나은 유지보수를 위해

com.example과 같은 패키지명 형태

  • com.example 과 같은 최상위 패키지명을 사용하는 이유?

    패키지 이름의 고유성을 보장하기 위해 인터넷 도메인 주소를 거꾸로 사용하기도 한다. 인터넷 도메인은 이미 고유성을 가지고 있기 때문에, 다른 충돌을 걱정할 필요가 없다.

종류

Built-in Packages

https://www.studytonight.com/java/images/package-in-java.jpg

Java API는 Java Development Environment에 포함된, 미리 작성된 클래스 라이브러리이다. math, util, i/o와 같은 기본 패키지들이 내장되어있다.

https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fuf4y9%2FbtqRTRLf0Za%2FhoyQVor5PTG1TKwwSyecZk%2Fimg.png

https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq5dbd%2FbtqRTSQXIrB%2FtSPxs5931CcCGHxDUR69CK%2Fimg.png

IntelliJ에서 프로젝트를 생성하면, External Libraries 에서 built-in 패키지와 그에 속한 클래스들을 볼 수 있다.

라이브러리는 packagesclasses로 나뉜다. 즉 단일 클래스(메소드와 속성을 포함하는)를 가져오거나 특정 패키지에 속하는 모든 클래스를 포함하는 패키지를 가져올 수 있다.

User-Defined-Package

사용자가 클래스와 인터페이스를 카테고리화하여 사용자 정의 자바 패키지를 생성할 수 있다.

생성하기 위해서, 우선 프로젝트에 디렉토리를 만든 뒤, package 폴더명;을 써준다.

import

다른 클래스 사용하는 방법

패키지 주소 전체를 이용하기

java.util.Date today = new java.util.Date();
java.util.Date yesterday = new java.util.Date();

이 사용법은 클래스 사용시마다 매번 주소를 입력해야하므로 번거롭다.

import 키워드 사용

import java.util.*;
import java.math.BigInteger;
  • * 를 이용하여 패키지의 모든 하위 클래스에도 적용이 가능하다.
  • 만약 서로 다른 패키지가 같은 이름을 가진 클래스를 가지고 있다면, 이는 컴파일 에러로 이어진다.
    • 따라서 이를 피하기 위해 특정 클래스의 주소를 import 하는 방식으로 사용해야 한다.
import java.util.*;
import java.sql.*;
// ERROR
public class Test {
 public static void main(String[] args) {
  Date newDate = new Date();
 }
}

Date 클래스는 java.utiljava.sql 패키지 모두에 존재하기 때문에 컴파일 에러가 발생한다.

이런 경우에는

java.util.Date utilDate = new java.util.Date();
java.sql.Date sqlDate = new java.sql.Date(0);

와 같이 패키지의 전체 주소를 이용하는 방식을 사용해야한다.

static

import 는 static 클래스, 메소드, 데이터 필드에도 적용가능하다.

import static java.lang.System.out;
public class example {
	public static void main(String... args){
		out.println("EXAMPLE");
		}
}

이와같이 자주 사용하게 되는 System.out 객체는 static 클래스인 System을 import하거나, System.out을 import하여 간소화할 수 있다.

클래스패스

정의

말 그대로 클래스를 찾기위한 경로이다. JVM이 프로그램을 실행할 때, 클래스파일을 찾는 데 기준이 되는 파일 경로를 말한다. JVM은 컴파일된 소스코드(.java)인 바이트코드(.class)를 classpath에 지정된 경로를 통해 찾아야한다.

클래스패스는 디렉토리와 파일을 콜론 으로 구분하는데, 실행하고자 하는 바이트코드를 찾는 과정은 다음과 같다.

1️⃣ Java Runtime시에, 클래스패스에 지정된 경로를 모두 검색한다.

2️⃣ 특정 class에 대한 코드가 포함된 .class파일을 찾은 뒤, 첫 번째로 찾은 파일을 사용한다.

한편 클래스패스를 지정하는 방법에는 두 가지가 있다. 환경변수 CLASSPATH를 사용하는 방법과, Java Runtime시에 -classpath 플래그를 사용하는 방법이 있다.

환경변수 CLASSPATH

환경변수를 설정하지 않아도 자바를 컴파일 할 수 있는데 왜 환경변수를 설정하는 것일까? 이유는 cmd에서 직접 자바를 컴파일하기 위해서이다. 어디에서든 cmd(혹은 터미널)을 이용하여 소스코드를 컴파일 및 실행하고자 할 때, jdk가 설치된 디렉토리를 환경변수로 지정해주면 된다.

IntelliJ에서는 자동으로 환경변수에 JDK 경로를 지정하기 때문에 별다른 설정이 필요없다.

Mac에서의 환경변수 설정

  • mac에서의 환경변수 설정

    https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9uY5K%2FbtqROe8AP7w%2Fl2unQhjtvWcqsxvLK9vKSk%2Fimg.png

    JDK 설치 후

    cd /Library/Java/JavaVirtualMachines

    ls -la

    을 통해 jdk가 설치된 디렉토리로 이동한다.

    cd /Library/Java/JavaVirtualMachines/jdk{jdk버전}.jdk/Contents/Home

    으로 이동한 뒤, JAVA_HOME 경로를 설정해주어야한다.

    export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk{jdk버전}.jdk/Contents/Home

    를 실행한 뒤

    vi를 통해 /etc/paths 를 열고,

    https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FO52gR%2FbtqRXGXjh7x%2FoLPsFvePYddfuE080uPSoK%2Fimg.png

    export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk{jdk버전}.jdk/Contents/Home 를 가장 아래줄에 삽입한다.

    그 다음

    /etc/profile을 연 뒤,

    export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk{jdk버전}.jdk/Contents/Home

    export CLASSPATH=.:$JAVA_HOME/lib/tools.jar

    을 입력한 뒤 저장한다.

-classpath 플래그

환경변수 CLASSPATH를 시스템에 설정하지 않고도 클래스패스를 런타임시에 지정하는 것이 가능한데, 이는 javac, java를 이용하여 실행할 때 -classpath(cp)를 사용하면 가능하다.

java -classpath "경로";. 클래스명

접근 지시자

Modifier Class Package Subclass World
public Y Y Y Y
protected Y Y Y N
default Y Y N N
private Y N N N
  • 접근 범위 : private < default < protected < public
  • 클래스가 지시자 없이 선언된다면(default, package-private 클래스), 그 클래스는 오직 그 자신의 패키지에서만 볼 수 있다.
대상 사용가능한 접근 제어자
클래스 public, (default)
메서드, 멤버변수 public, (default), protected, private
지역변수 없음
대상 사용가능한 접근 제어자
클래스 public, (default), final, abstract
메서드 모든 접근 제어자, final, abstract, static
멤버변수 모든 접근 제어자, final, static
지역변수 final
Profile picture

2yeseul

트리플에서 백엔드 개발을 맡고 있습니다. 무한 삽질을 기록합니다. ⚒️