728x90

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


# 학습할 것

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

 

package 키워드


package 키워드에 앞서 패키지 자체에 대해 생각해보려 한다.

아주 쉽게 생각하면 컴퓨터에 폴더를 생각하면 된다.

실제로 자바에서 패키지 개념도 폴더와 같다.

 

조금 더 그럴싸하게? 얘기하면 클래스를 묶은 단위로 사용할 수 있다 할 수 있다.

그러면 왜 클래스를 굳이 패키지라는 폴더와 같은 개념을 사용해서 묶도록 했을까.

 

크게 두가지 이유가 있다.

하나는 같은 이름의 클래스를 선언할 때 구분할 수 있기 때문도 있고

다른 하나는 이 이유의 연장선에서 비슷한 또는 연관있는 클래스끼리 하나의 폴더로 묶어 관리하기 위함이다.

 

패키지 이름으로 아무것이나 사용할 수 있는건 아니다.

반드시 지켜야 하는 규칙도 있지만, 그렇지 않아도 되는 규칙이 있어서 혼란스러운 경우가 종종 있지만 보통은 다음과 같은 규칙이 있다.

 

- 영문 소문자를 사용

- 상위 패키지와 하위 패키지는 . 을 사용해서 연결

- 자바 예약어는 사용하지 않음

- java 로 시작하면 자바에서 기본적으로 제공하는 패키지

- javax 로 시작하면 자바에서 기본적으로 제공하는 확장 패키지

- org 로 시작하면 비영리 단체에서 만든 패키지

- com 으로 시작하면 기업에서 만든 패키지

 

일반적으로 위와 같은 규칙이 있으니, 사용하는 클래스가 어떤 패키지에 속해 있는지 보면 대략적인 정보에 대해 알 수 있다.

 

 

패키지를 선언하지 않는 경우도 있다.

권장하지 않지만 선언하지 않는다고 해서 프로그램이 동작하지 않는것은 아니다.

이런 경우 클래스가 default 패키지에 생성 되었다고 한다.

 

 

 

public class Exam_001_Default_Package {
    public static void main(String[] args) {
        // default package 를 사용한 경우로, package 키워드를 사용하지 않는다.
    }
}

 

 

728x90

 

 

import 키워드


이 키워드는 다른 패키지에 있는 클래스를 가져다 사용하고 싶을 때 쓰는 키워드 이다.

다음은 import 키워드를 사용한 예이다.

 

 

package me.xxxelppa.study.week07.sub_01;
 
public class Exam_001_sub_01 {
    private String sub_01_str = "sub_01 패키지 안에 선언된 문자열";
    
    public String getSub_01_str() {
        return sub_01_str;
    }
}

 

package me.xxxelppa.study.week07.sub_02;
 
import me.xxxelppa.study.week07.sub_01.Exam_001_sub_01;
 
public class Exam_001_sub_02 {
    public static void main(String[] args) {
        Exam_001_sub_01 exam_001_sub_01 = new Exam_001_sub_01();
        System.out.println(":: 다른 패키지 사용 -> " + exam_001_sub_01.getSub_01_str());
    }
}

 

:: 다른 패키지 사용 -> sub_01 패키지 안에 선언된 문자열

 

import 키워드를 사용하면 static import 라는 것을 보게 된다.

static 키워드를 사용하여 멤버 필드 (클래스 레벨의 변수) 또는 메소드를 선언하면, 객체 (또는 인스턴스)를 통하지 않고 클래스 이름을 통해 사용할 수 있다.

 

즉, 다음과 같은 것이 가능하다.

 

 

package me.xxxelppa.study.week07.sub_01;
 
public class Exam_002_sub_01_static {
    public static void print() {
        System.out.println("sub_01 패키지에 있는 static 메소드 print 사용");
    }
}

 

package me.xxxelppa.study.week07.sub_02;
 
import static me.xxxelppa.study.week07.sub_01.Exam_002_sub_01_static.print;
 
public class Exam_002_sub_02_static {
    public static void main(String[] args) {
        print();
    }
}

 

sub_01 패키지에 있는 static 메소드 print 사용

 

만약 static import 를 사용하지 않았다면, 7라인에서 print 메소드를 사용하기 위해

다음과 같이 작성 했어야 했다.

 

package me.xxxelppa.study.week07.sub_02;
 
import me.xxxelppa.study.week07.sub_01.Exam_002_sub_01_static;
 
public class Exam_002_sub_02_static {
    public static void main(String[] args) {
        Exam_002_sub_01_static.print();
    }
}

 

 

 

클래스 패스, CLASSPATH 환경변수


JVM에 의해 프로그램이 실행될 때 사용할 클래스 파일들을 찾는 경로를 클래스패스 라고 한다.

클래스패스를 설정하는 방법이 몇가지 있는데, 윈도우 기준으로 윈도우 시스템에서 사용 할 클래스 패스를 환경변수에 등록하는 방법과

ide와 같은 통합 개발 환경을 제공하는 도구에 classpath 를 설정하여 사용하는 방법이 있다.

 

예전에 환경변수를 설정하고 클래스패스에 대해 정리했던 글이다.

 

 

 

 

-classpath 옵션


이 옵션에 대해서는 윈도우 기준 명령 프롬프트에 java -help 명령을 입력하면 설명이 나와있다.

 

-classpath

class search path of directories and zip/jar files

 

--class-path

class search path of directories and sip/jar files

A ; separated list of directories, JAR archives, and ZIP archives to search for class files.

 

 

실행이 아니라 컴파일을 할 경우에는 다음과 같이 사용할 수 있다.

 

 

 

접근지시자


접근지시자는 다른 말로 접근제한자 라고도 한다.

클래스나 멤버 필드 또는 클래스 내부에 선언 된 메소드에 대해 외부의 접근을 어디까지 허용할 것이지 정할 때 사용할 수 있다.

 

5주차 과제에서 한 번 언급한 적이 있기 때문에 간략하게 표로 정리해 보았다.

 

구분 적용 가능한 접근지시자
class (클래스) public 또는 생략 (default)
멤버 필드 (클래스 변수) public, protected, 생략 (default), private
멤버 메소드
지역 변수 (메소드 변수)  

 

public : 자신을 포함한 모든 위치에서 사용이 가능하다. 즉, 제한이 없다.

protected : 같은 패키지 또는 상속 관계에서 접근 해서 사용할 수 있다.

생략(default) : package 라는 이름으로 부르기도 하는데, 같은 패키지 내에서 접근할 수 있는 지시자 또는 제한자 이다.

private : 같은 클래스 내에서만 접근해서 사용할 수 있다.

 

 

 

 

728x90

'Archive > Java online live study S01' 카테고리의 다른 글

9주차 : 예외 처리  (0) 2021.05.01
8주차 : 인터페이스  (0) 2021.05.01
6주차 : 상속  (0) 2021.05.01
5주차 : 클래스  (0) 2021.05.01
4주차 : 제어문  (0) 2021.05.01

+ Recent posts