06-6 / 패키지와 접근 제한자

자바에서는 클래스를 체계적으로 관리하기 위해 패키지(package)를 사용한다.

패키지의 물리적인 형태는 파일 시스템에 폴더에 해당하지만 그 뿐만 아니라 클래스의 일부분으로, 클래스를 "유일하게" 만들어주는 식별자 역할도 한다. 이름이 달라도 패키지가 다르면 다른 클래스로 인식된다.

상위패키지.하위패키지.클래스

 

 


패키지 선언) 

패키지 선언하는 방법은 아래와 같다.

package 상위패키지.하위패키지;

public class ClassName {...}

 

패키지는 클래스으 일부이기에 클래스만 따로 복사해서 다른곳으로 이동하면 클래스를 사용할 수 없다. 만약 이동해야한다면 패키지 전체를 이동해야한다.

 

패키지 이름에도 규칙이 있다

- 숫자로 시작 불가, $,_를 제외한 특수문자 불가

- java로 시작 불가 (자바 표준 API가 이런 형태로 사용하기 때문)

-모두 소문자 작성이 관례

 

  • import문

사용하고자 하는 클래스 또는 인터페이스가 다른 패키지에 소속되어 있다면 import문으로 해당 패키지의 이름과 함께 클래스 또는 인터페이스를 가져와야 한다.

import 상위패키지.하위패키지.클래스이름;
import 상위패키지.하위패키지.*; // 동일한 패키지 소속의 여러 클래스 사용시 이렇게 묶어줄 수 있다.

 

import문은 package선언문과 클래스 선언문 사이에 작성한다. import개수에 제한은 없다.

주의할 점은 상위패키지를 import했다고 하위패키지까지 모두 import되는 것은 아니다. 자바는 패키지 이름으로 식별하기 때문에 아래 두개를 별도의 패키지로 인지한다. 따라서 사용하려면 둘 모두 import해야한다. 

import 상위패키지;
import 상위패키지.하위패키지;

 

만약 이름이 동일한 클래스가 존재하고 두 패키지 모두 import되어 있다면 클래스 사용시 컴파일러가 어느것을 사용해야할 지 몰라 에러를 발생시키는 경우가 있다. 이때에는 어느 패키지의 어느 클래스를 사용한 것인지 실행문에서 명확하게 밝혀 사용해야 에러 발생을 피할 수 있다.

com.littlezero.coding.study study1 = com.littlezero.coding.study();
com.littlezero.programming.study study2 = com.littlezero.programming.study();

 

 


접근 제한자) 

클래스 및 인터페이스 그리고 이들이 가지고 있는 멤버의 접근을 제한하기 위한 제한자를 접근 제한자(Access Modifier)라고 한다.

객체 생성을 막기위해 생성자 호출을 막거나, 필드나 메소드를 사용하지 못하도록 막아야 하는 경우도 있다. 이때 사용한다.

 

종류

접근제한자 설명
public 외부 클래스가 자유롭게 사용할 수 있다.
protected 같은 패키지 또는 자식 클래스에서 사용할 수 있다.
private 외부에서 사용 될 수 없다.
위 3개 중 하나도 적용되지 않으면 default 접근 제한을 갖는다.
default 같은 패키지에 소속된 클래스에서만 사용할 수 있다.

 


클래스의 접근 제한) 

접근 제한자 같은 패키지 다른패키지 예외사항
default 제한없이 사용 가능 사용 불가능  
public 제한없이 사용 가능  

+ 클래스 선언시 public을 생략했다면 default 접근 제한을 갖는다.

 

 


생성자의 접근 제한) 

객체를 생성하기 위해서는 new 연산자로 생성자를 호출한다. 그러나 생성자가 어떤 접근 제한을 갖느냐에 따라 호출여부가 결정된다.

 

클래스에 생성자를 선언하지 않으면 컴파일러에 의해 자동으로 기본 생성자가 추가된다. 자동으로 생성되는 기본 생성자의 접근 제한은 클래스의 접근 제한과 동일하다. 

 

접근 제한자 같은 패키지 다른패키지 예외사항
default 제한없이 호출 가능 호출 불가능  
public 제한없이 호출 가능  
protected 제한없이 호출 가능 호출 불가능 *(예외있음) 다른 패키지에 속한 클래스가 해당 클래스의 자식 클래스라면 호출 가능
private 호출 불가능 *(예외있음) 클래스 내부에서만 호출 가능

 

 


필드와 메소드의 접근 제한) 

필드와 메소드 선언시 사용 범위 지정

접근 제한자 같은 패키지 다른패키지 예외사항
default 제한없이 사용 가능 사용 불가능  
public 제한없이 사용 가능  
protected 제한없이 사용 가능 사용 불가능 *(예외있음) 다른 패키지에 속한 클래스가 해당 클래스의 자식 클래스라면 사용 가능
private 사용 불가능 *(예외있음) 클래스 내부에서만 사용 가능

+ 필드 메소드 선언시 public을 생략했다면 default 접근 제한을 갖는다.

 

 


Getter와 Setter 메소드) 

객체 지향 프로그래밍에서는 객체의 필드를 객체 외부에서 직접적으로 접근하는 것을 막는다.

외부에서 마음대로 변경이 가능하다면 객체의 무결성이 깨질 수 있기 때문이다.

이런 문제점에 객체 지향 프로그래밍에서는 메소드를 통해서 필드를 변경하는 방법을 선호한다. 메소드를 통해 매개값을 검증하여 유효한 값만 객체의 필드로 저장할 수 있게 하는데 이런 역할을 하는 메소드가 Setter이다.

 

선언 방법은 void set + 필드이름(필드이름첫글자 대문자) 로 명명하며 넣을 값을 매개값으로 받는다.

 

void setSpeed(int speed){
	if(speed < 0) {
    	this.speed = 0;
        return;				// 진짜 왜 넣지?
    } else {
    	this.speed = speed;
    }
}

public void setStop(boolean stop){
	this.stop = stop;
}

 

외부에서 객체 데이터를 읽을 때도 메소드를 사용하는 것이 좋다. 메소드로 필드값을 사용하기 적절하게 필드값으로 가공한 후 외부로 전달하는 역할을 하는 메소드는 Getter이다. 

 

선언 방법은 필드타입 get + 필드이름(필드이름첫글자 대문자) 로 명명한다.

받으려는 필드타입이 boolean타입일 경우는 get으로 시작하지 않고 is로 시작하는 것이 관례다.

double getSpeed(){
	double km = speed * 1.6;
    return km;
}

boolean isStop(){
	return stop;
}

 

클래스 선언시 가능하다면 필드를 private 선언해 외부로 부터 보호하고 필드에 대한 Setter와 Getter 메소드를 작성해 필드값은 안전하게 변경/사용하자.

 

 

+ Recent posts