자바 패키지

KangMyungJoe·2020년 12월 27일
0

java_study

목록 보기
6/8
post-thumbnail

백기선님과 함께하는 Java-Study 7주차

7주차 과제: 자바 패키지
목표: 자바의 패키지에 대해 학습하기

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

1. package 키워드

package란, 클래스를 구분 짓는 폴더의 개념으로 흔히 자바 소스코드에서 아래와 같이 명시되어 있다.

package [package 이름]

위처럼 패키지를 통해 클래스들을 간단히 구분할 수 있다.


자바 패키지의 특징은 다음과 같다.

  • 소스코드 가장 첫 줄에 명시되어 있어야 함
  • 소스코드에 패키지 선언이 1줄만 있어야 함
  • 패키지 이름이 java로 시작하면 안 됨

또한, 자바 패키지 이름을 지을 때도 몇가지 규칙이 존재한다.

  • 패키지 이름은 모두 소문자
  • 자바의 예약어를 사용하지 말아야 함
  • 표준에 따르는 게 좋음

2. import 키워드

import란, 소스코드를 작성할 때 다른 패키지에 있는 클래스를 해당 패키지의 클래스에서 사용할 것이라는 것을 명시해주는 예약어이다.

import packageName.className;  // packageName 패키지 속 특정 클래스
import packageName.*;  // packageName 패키지 속 모든 클래스


대표적으로 위와 같이, ArrayList를 사용할 경우 java.util 패키지에서 ArrayList에 해당하는 클래스를 import 해야 사용할 수 있다.


import static을 사용하여 static 멤버에 해당하는 클래스의 이름을 생략할 수 있다. 특정 클래스의 static 멤버를 자주 사용하는 경우 코드가 깔끔해지고 간편하다.

import static의 예는 다음과 같다.

import static java.lang.Math.random;
import static java.lang.Math.PI;

3. 클래스패스

클래스패스란, JVM 혹은 Java 컴파일러에 패키지와 클래스의 위치를 지정해주는 경로를 뜻한다. 프로그램을 시작할 때, 어떤 프로그램을 찾아 사용할 지를 정해주는 길이라고 생각해도 된다.

클래스패스를 지정하는 방법은 4장, 5장에서 다룬다.


4. CLASSPATH 환경변수

CLASSPATH 환경변수란, 앞서 3장에서 설명한 클래스패스를 지정하는 방법 중 하나로, 시스템 어느 곳에서든 참조 할 수 있도록 환경변수로 설정하는 방법이다.

즉, 시스템 어디에서든 JDK가 제공하는 라이브러리를 사용할 수 있도록 하기 위해 설정한다.


출처

환경 변수를 설정하는 화면에서
변수 이름은 CLASSPATH, 경로는 jdk(version)/lib 폴더로 지정하여 설정한다.


5. -classpath 옵션

-classpath 옵션이란, 커맨드 창에서 자바 프로그램을 실행하기 위한 컴파일 과정에서 CLASSPATH를 알려주기 위한 옵션이다.

커맨드 창에서는 다음과 같은 형식으로 사용한다.

javac -classpath CLASSPATH 경로  
javac -cp CLASSPATH 경로  

javac -classpath C:\java\jdk1.8.0\ exmaple.java

6. 접근지시자

접근 지시자란, 다른 말로 접근 제어자 라고도 불리는 클래스, 메소드, 클래스 변수 등을 선언할 때 사용하는 키워드다. 말 그대로 접근 제어에 관한 범위를 지정한다.

자바는 총 4가지의 접근 지시자를 사용한다.

  • public : 모든 클래스에서 접근 가능
  • default : 접근 지시자를 선정하지 않은 경우로, 같은 패키지만 접근 가능
  • protected : 같은 패키지 안에 속해있거나, 상속 받은 경우 접근 가능
  • private : 해당 클래스 내에서만 접근 가능


말로 설명한 내용을 표로 나타내면 위와 같다.
출처

또한, 키워드를 사용하는 대상에 따라 사용할 수 있는 접근 지시자가 각각 다르다.


출처


먼저, private 키워드와 관련된 예제다.

class Access1 {
    int a = 10; // 접근 가능
    private int b = 20; // 접근 불가
}

public class Foo {
    public static void main(String[] args) {       
        Access1 access1 = new Access1();.
        
        System.out.println(access1.a);	// 출력 가능
        System.out.println(access1.b);	// 출력 불가능
    }
}

주석으로 이미 답을 작성했지만, Access1 클래스의 a는 Foo 클래스에서 접근이 가능하지만, private로 선언된 b는 접근할 수 없다.

private으로 필드를 선언하고 public으로 getter와 setter 메소드를 이용하여 데이터에 접근하도록 코드를 작성하는 방식으로 데이터 무결성을 유지하도록 설정하는 데 주로 사용된다.


protected 키워드와 관련된 예제다.

class Access1 {
    int a = 10; // 접근 가능
    private int b = 20; // 접근 불가
    protected int c = 122;
}

class Access2 extends Access1 {
    public void printC() {
        System.out.println(super.c);
    }
}
public class Foo {
    public static void main(String[] args) {       
        Access1 access1 = new Access1();
        Access2 access2 = new Access2();
        
        access2.printC(); // 정상 출력
        System.out.println(access1.a); 
        System.out.println(access1.b); // 출력 불가
    }
}

Access1 클래스를 상속받은 Access2는 Access1 클래스의 a b c 3개의 필드 중 private으로 선언된 b를 제외하면 모두 접근할 수 있다.


profile
소통을 잘하는 개발자가 되고 싶습니다.

0개의 댓글