자바에서는 정보 은닉을 위해서 접근 제한자(
Access Modifier
)를 제공한다.
접근 제한자를 사용하면 클래스 외부에서의 직접적인 접근을 허용하지 않는 멤버를 설정하여 정보 은닉을 구체화할 수 있으며,public
,protected
,default
,private
의 네 가지 종류가 있다.
public
접근 제한자는 외부 클래스가 자유롭게 사용할 수 있는 공개 멤버를 만든다.protected
접근 제한자는 같은 패키지 또는 자식 클래스에서 사용할 수 있는 멤버를 만든다.private
접근 제한자는 외부에 노출되지 않는 멤버를 만든다.default
접근 제한을 가진다. default
접근 제한자는 같은 패키지에 소속된 클래스에서만 사용할 수 있는 멤버를 만든다.클래스에 사용할 수 있는 접근 제한은
public
과default
두 가지이다.
//default 접근 제한
class 클래스이름 { ... }
//public 접근 제한
public class 클래스이름 { ... }
default
접근 제한클래스를 선언할 때 접근 제한자를 생략하면 클래스는 default
접근 제한을 가진다.
클래스가 default
접근 제한을 가지게 되면 같은 패키지 내에서는 아무런 제한 없이 사용할 수 있지만, 다른 패키지 내에서는 사용할 수 없도록 제한된다.
public
접근 제한클래스를 선언할 때 public
접근 제한자를 붙인다면 클래스는 public
접근 제한을 가진다.
클래스가 public
접근 제한을 가지게 되면 같은 패키지뿐만 아니라 다른 패키지에서도 아무런 제한 없이 사용할 수 있다.
객체를 생성하기 위해서는 new
연산자로 생성자를 호출해야 한다.
생성자가 어떤 접근 제한을 갖느냐에 따라 호출 가능 여부가 결정된다.
생성자는 다음과 같이 public
, protected
, default
, private
접근 제한을 가질 수 있다.
public class ClassName {
//public 접근 제한
public ClassName(...) { ... }
//protected 접근 제한
protected ClassName(...) { ... }
//default 접근 제한
ClassName(...) { ... }
//private 접근 제한
private ClassName(...) { ... }
}
클래스에 생성자를 선언하지 않으면, 컴파일러에 의해 기본 생성자가 자동으로 추가된다.
자동으로 생성되는 기본 생성자의 접근 제한은 클래스의 접근 제한과 동일하다.
default
→ 기본 생성자도 default
public
→ 기본 생성자도 public
필드와 메소드는 public
, protected
, default
, private
접근 제한을 가질 수 있다.
//필드 선언
[ public | protected | default | private ] [ static ] 타입 필드;
//메소드 선언
[ public | protected | default | private ] [ static ] 리턴타입 메소드이름(...) { ... };
Getter
와 Setter
메소드 ]일반적으로 객체 지향 프로그래밍에서 객체의 데이터는 객체 외부에서 직접적으로 접근하는 것을 막는다. 그 이유는 객체의 데이터를 외부에서 마음대로 읽고 변경할 경우 객체의 무결성이 깨질 수 있기 때문이다.
그래서 객체 지향 프로그래밍에서는 메소드를 통해서 데이터를 변경하는 방법을 선호한다.
데이터는 외부에서 접근할 수 없도록 막고 메소드는 공개해서 외부에서 메소드를 통해 데이터에 접근하도록 유도한다. Setter
메소드 안에 조건문을 추가하여 유효한 값만 데이터로 저장할 수 있다.
void setSpeed(double speed) {
if (speed < 0) {
this.speed = 0;
return;
} else {
this.speed = speed;
}
}
speed
가 음수일 경우 speed
필드에 0으로 저장하고, 메소드 실행을 종료하여 유효한 값만 데이터로 저장할 수 있다.
클래스를 선언할 때 가능하다면 필드를
private
으로 선언해서 외부로부터 보호하고,
필드에 대한Setter
와Getter
메소드를 작성해서 필드값을 안전하게 변경/사용하는 것이 좋다.
다음은 Setter
와 Getter
메소드를 선언하는 방법이다.
private 타입 fieldName;
//Getter
public 리턴타입 getFieldName() {
return fieldName;
}
//Setter
public void setFieldName(타입 fieldName) {
this.fieldName = fieldName;
}
필드 타입이 boolean
일 경우에는 Getter
를 get
으로 시작하지않고 is
로 시작하는 것이 관례이다.
private boolean stop;
//Getter
public boolean isStop() {
return stop;
}
//Setter
public void setStop(boolean stop) {
this.stop = stop;z
}