본문 바로가기

IT/JAVA

자바 패키지 - 백기선님 스터디 7주차 과제

목표

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

학습할 것 (필수)

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

 

package 키워드

패키지란 클래스(또는 인터페이스)의 묶음인 하나의 디렉터리이다.

하나의 소스파일에는 첫 번째 문장으로 단 한 번의 패키지 선언만을 허용한다.

모든 클래스는 반드시 하나의 패키지에 속해야 한다.

대소문자 모두 가능하나 클래스명과의 구분을 위해 소문자를 사용하는 것이 원칙이다.

// 패키지 선언

package 패키지명;

 

이름 없는 패키지(unnamed package)

패키지를 지정하지 않은 클래스는 자동적으로 '이름 없는 패키지'에 속하게 된다.

 

import 키워드

사용하고자 하는 클래스의 패키지를 명시할 수 있다.

import로 명시해주면 클래스 이름에서 패키지명을 생략할 수 있다.

import 패키지명.클래스명;	 // 두 방법의 성능상 차이는 없다.
	또는
import 패키지명.*;		// 해당 패키지 하위 클래스 모두 포함


// lions패키지에 존재하는 Simba 클래스 사용 시
	
    lions.Simba babySimba = new lions.Simba();

// import 사용 시

import lions.*;

	Simba babySimba = new Simba();

 

클래스명 대신 *를 이용해 하위 클래스를 모두 포함할 수는 있지만,

하위 패키지의 클래스까지 모두 포함하는 것은 아니다.

import java.util.*;
import java.text.*;

위의 두 문장은 아래와 같이 쓸 수 없다.

import java.*;

 

패키지문 다음, 클래스 선언 전에 작성한다.

package 패키지명;

import 패키지명.*;

class 클래스명{
}

 

java.lang패키지는 모든 소스파일에 묵시적으로 import 되어있다.

 

static import문

static import문을 사용하면 static멤버를 호출할 때 클래스 이름을 생략할 수 있다.

import static java.lang.Integer.*;	// Integer클래스의 모든 static 메서드
import static javaj.lang.Math.random; // Math.random만

 

 

클래스패스

컴파일러나 JVM 등이 클래스의 위치를 찾는 데 사용되는 경로이다.

클래스패스를 지정하지 않으면 기본적으로 현재 디렉터리(.)가 클래스패스로 지정된다.

패키지의 루트 디렉토리가 클래스패스에 포함돼 있어야만 실행 시 JVM이 클래스를 찾을 수 있다.

 

CLASSPATH 환경변수

'제어판 - 시스템 - 고급 시스템 설정 - 환경변수 - 새로 만들기'에서 설정할 수 있다.

;를 구분자로 사용하여 여러 개의 경로를 지정할 수 있다.

.'는 현재 디렉터리(.)를 클래스패스에 포함시키기 위함이다.

 

-classpath 옵션 (-cp)

일시적으로 클래스패스를 지정할 수 있다.

C:\WINDOWS>java -cp	c:\jdk11\work	com.javapath.lions.Simba

 

 

접근지시자 (public, protected, default, private)

클래스, 멤버변수, 메서드, 생성자에 사용되며 외부 접근을 제한하는 역할을 한다.

접근지시자가 명시되어 있지 않다면 default이다.

접근지시자 접근 가능 범위
public 모두. 제한 범위 없음.
protected 같은 패키지 || 다른 패키지의 자손 패키지에서 가능
default 같은 패키지에서만 가능
private 같은 클래스에서만 가능

 

대상에 따라 사용할 수 있는 접근지시자

대상 접근지시자
클래스 public, default
메서드 public, protected, default, private
멤버변수
지역변수 없음

 

접근지시자를 이용한 캡슐화

클래스 내부에 선언된 데이터를 보호

외부에는 불필요한, 내부적으로만 사용되는 부분을 감추기 위함

 

생성자의 접근지시자

인스턴스의 생성을 제한할 수 있다.

private로 지정하면 외부에서 생성자에 접근이 불가하므로 인스턴스를 생성할 수 없다.

인스턴스를 생성해서 반환해주는 public메서드를 제공하여 외부에서 클래스의 인스턴스를 사용할 수 있도록 한다.

이때, 메서드는 public이며 static이어야 한다.

class Simba{
    private static Simba s = new Simba();
    
    //인스턴스를 생성하지 않고도 호출할 수 있어야하므로 static이어야한다.
    public static Simba getInstance(){
    	return s;
    }	
}

 

접근지시자가 private인 클래스는 다른 클래스에 상속될 수 없다.

상속 시 자식 클래스는 항상 부모 클래스의 생성자를 호출하는데 접근지시자가 private일 경우 자식 클래스에서 접근이 불가하기 때문이다.

이때는 클래스 앞에 final을 추가하여 상속할 수 없는 클래스임을 알리는 것이 좋다.

public final class Math{
	private Math(){}
    	⋮
}

 

 

Reference)

자바의 정석, 남궁 성