슬기로운 개발생활

온라인 자바 스터디 #7 - 패키지, import, 접근제어자, 클래스패스

by coco3o
반응형

목표

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

학습할 것 (필수)

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

패키지

패키지란, 클래스의 묶음이다. 패키지에는 클래스 또는 인터페이스를 포함 시킬 수 있고,

서로 관련된 클래스들끼리 그룹 단위로 묶어 놓음으로써 클래스를 효율적으로 관리할 수 있다.

  • 하나의 소스파일에 패키지 선언은  가장 첫 줄에 해야 하고 소스파일 하나에 하나만 있어야 함.
  • 패키지 이름과 위치한 폴더의 이름이 같아야 함
  • 점(.)을 구분자로 하여 계층구조로 구성할 수 있다.
  • 물리적으로 클래스 파일(.class)을 포함하는 하나의 디렉토리다.

패키지의 선언

패키지를 선언하는 것은 아주 간단하다. 클래스나 인터페이스의 소스파일(.java)에

다음과 같이 한 줄만 적어주면 된다.

packge 패키지명;
package Whiteship; //whiteship 패키지 안의 Student 클래스

public class Student { }
package Whiteship.live_study; //Whiteship 패키지 안의 live_study 패키지 안의 Student 클래스

public class Student { }
  • 주석과 공백을 제외한 첫 번째 문장이어야 한다.
  • 하나의 소스파일에 단 한번만 선언될 수 있다.
  • 패키지명은 소문자로 하는 것이 원칙이다.
  • 자바의 예약어를 사용하면 안된다. ( ex) int , static )
  • 모든 클래스는 반드시 하나의 패키지에 포함되어야 한다.

이름없는 패키지 (unnamed package)

//패키지 선언 x

public class Main { 
	public static void main(String[] args) {
    System.out.println("Hello World!");
    }
}

하지만 위와 같이 패키지 선언을 하지 않고도 아무런 문제가 없었다. 

그 이유는 소스파일에 자신이 속할 패키지를 지정하지 않은 클래스는 컴파일러가 자동적으로

'이름없는 패키지'로 관리하기 때문이다.

따라서 패키지를 명시하지 않은 모든 클래스, 인터페이스는 모두 같은 패키지에 속하게 된다.

여기서 중요한건 웬만하면 default package를 쓰지 않는 것이 좋다.

왜냐하면 앞으로 import문을 알아볼 것 이지만 default package  즉, 이름이 없는 패키지이므로

다른 패키지에서 디폴트 패키지를 import시킬 수 없기 때문이다.

반대로 디폴트 패키지에서는 다른 패키지를 import할 수 있다.


네임스페이스 (Namespace)

네임스페이스란 이름을 구분 할 수 있게 해주는 공간을 의미한다.

 

이 특성 덕분에 패키지는 이름 중복으로 인한 문제를 방지 할 수 있다.

패키지 안의 클래스 이름은 고유해야 한다. 다시 말해 하나의 패키지 안에는 같은 이름의 두 개의 클래스를 만들 수 없다.

하지만 패키지가 다르다면 상관 없다.

아래 사진과 같이 패키지 자체가 분리된 다른 공간 이므로

다른 패키지에 같은 이름의 클래스가있더라도, 똑같은 이름을 쓸 수 있다.

 


import

import 패키지명.클래스명;
또는
import 패키지명.*;

같은 패키지에서 여러 개의 클래스가 사용될 때, import문을 여러 번 사용하는 대신

 import 패키지명.* 을 이용하면 지정된 패키지에서 일치하는 클래스이름을 컴파일러가 알아서 찾아준다.

import java.util.*;

이렇게 하면 java.util 패키지의 모든 클래스를 사용할 수 있다.

import java.util.*;

public class Whiteship {
       public static void main(String[] args) {
            Random rand = new Random();
            Date dt = new Date();
            Scanner sc = new Scanner(System.in);
        }
}

Random, Date, Scanner 클래스는 모두 java.util. 패키지에 속해 있으므로 하나의 import문으로 충분하다.

 

*알아두기*

같은 패키지 내의 클래스, java.lang 패키지의 클래스는 import를 할 필요가 없어 바로 사용 가능하다.


Static import

import에 static을 붙이면 import된 정적 멤버필드나 정적 메소드는 클래스의 이름 없이 접근하여 사용할 수 있다.

import static java.lang.System.*;

public class Whiteship {
          public static void main(String[] args) {
                      out.print("Hello World!");
          }
}
Hello World!
Process finished with exit code 0

1라인에서 java.lang 패키지의 System 클래스 안에 정의된 정적멤버에 대해 클래스명 없이 접근할 수 있도록 선언한 부분이다.  

5라인에서 System 클래스를 생략하고 바로 out 객체를 통해 문자열을 출력한 예제이다.


접근 제어자

  • 접근제어자는 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할을 함
  • 접근제어자는 생략가능하며 생략했을 때는 자동으로 default 임을 뜻하게 된다.
  • 접근제어자가 사용될 수 있는 곳 : 클래스, 멤버변수, 메소드, 생성자

    1. public : 접근 제한이 전혀 없다.

    2. protected : 같은 패키지 내에서, 그리고 상속 받는 경우 접근 가능

    3. default : 같은 패키지 내에서만 접근 가능

    4. private : 같은 클래스 내에서만 접근 가능

제어자 같은 클래스 같은 패키지 자손 클래스 전체
public O O O O
protected O O O  
default O O    
private O      

- 접근 범위 : private < default < protected < public 순으로 많은 접근을 허용한다.

 

대상 사용가능한 접근 제어자
클래스 public, (default)
메소드 public, protected, (default), private
멤버변수
지역변수 없음

위와 같이 public을 제외한 접근 제어자에 나오는 에러 코드를 보면 알 수 있다.

 

접근 제어자를 이용한 캡슐화

- 접근 제어자를 사용하는 이유는 클래스의 내부에 선언된 데이터를 보호하기 위해서이다.

데이터가 유효한 값을 유지하도록 또는 비밀번호와 같은 데이터를 외부에서 함부로 변경하지 못하도록

하기 위해서는 외부로부터의 접근을 제한하는 것이 필요하다.

이것을 데이터 감추기라고 하며 객체지향의 개념에선 캡슐화(encapsulation) 라 한다.


클래스패스

클래스패스란 말 그대로 클래스를 찾기위한 경로이다.

자바에서 클래스패스의 의미도 똑같다.

JVM이 프로그램을 실행할 때, 클래스파일을찾는 데 기준이 되는 파일 경로를 말하는 것이다.

소스코드(.java 파일)를 컴파일하면 소스코드가 바이트 코드(바이너리 형태의 .class 파일)로 변환된다.

java runtime(java 또는 jre)으로 이 .class 파일에 포함된 명령을 실행하려면, 먼저 이 파일을 찾을 수 있어야 한다.

.class 파일을 찾을 때 classpath에 지정된 경로를 사용한다.

 

classpath를 지정할 수 있는 두 가지 방법이 있다.

 

  • CLASSPATH 환경변수 사용
  • java runtime에 -classpath 옵션사용

CLASSPATH 환경변수 사용

컴퓨터 시스템 변수 설정을 통해 지정할 수 있다.

JVM이 시작될 때 JVM의 클래스 로더는 이 환경 변수를 호출한다.


 

java runtime 에 -classpath 옵션 사용

컴파일러가 컴파일 하기 위해서 필요로 하는 참조할 클래스 파일들을 찾기 위해서 컴파일시 경로를 지정해주는 옵션

 

Hello.java 파일이 C:\Java 디렉토리에 존재하고,

 

필요한 클래스 파일들이 C:\Java\Engclasses 에 위치한다면,

 

javac -classpath .;C:\Java\Engclasses;C;\Java\Korclasses C:\Java\Hello.java

 

과 같이 ; 으로 구분해줄 수 있다. ( . 은 현 디렉토리, .. 은 현 디렉토리에서 상위 디렉토리를 의미 )

 

classpath 대신 단축어인 cp를 사용해도 된다.

javac -cp .;C:\Java\Engclasses;C;\Java\Korclasses C:\Java\Hello.java

 

 

references :effectivesquid.tistory.com/entry/%EC%9E%90%EB%B0%94-%ED%81%B4%EB%9E%98%EC%8A%A4%ED%8C%A8%EC%8A%A4classpath%EB%9E%80

kils-log-of-develop.tistory.com/430

 

 

반응형

블로그의 정보

슬기로운 개발생활

coco3o

활동하기