Java에서는 접근을 허용하거나 제한 할수 있다.
여기서 접근은 클래스 및 인터페이스와 각 멤버의 접근을 의미한다.
접근제한자 | 적용대상 | 접근허용 |
---|---|---|
public | class, field, constructor, method | ALL |
protected | field, constructor, method | extends |
default | class, field, constructor, method | Package |
private | field, constructor, method | Class |
public
: 모든 패키지에서 아무런 제한 없이 생성자를 호출할 수 있도록 한다.
protected
: 같은 패키지에 속하는 클래스에서 생성자를 호출할 수 있도록 한다. 만약 다른 패키지에 속한 클래스가 해당 클래스의 자식 클래스라면 생성자를 호출할 수 있다.
default
: 같은 패키지에서는 아무런 제한 없이 생성자를 호출할 수 있다.
(접근제한자를 명시해주지안으면 기본으로 dafault 접근제한을 가진다)
private
: 패키지 상관없이 생성자를 호출하지 못하도록 제한합니다. 오로지 클래스 내부에서만 생성자를 호출할 수 있고 객체를 만들 수 있다.
객체지향 프로그래밍에서 객체데이터를 외부에서 읽고 변경시 객체의 무결성이 깨질 수 있기떄문에 객체의 데이터는 객체 외부에서 직접적으로 접근하는 것을 막는다.
데이터는 외부에서 접근하지 않도록 막고 메소드는 공개해서 외부에서 메소드를 통해 데이터를 접근하게 하도록 한다.
** 메소드는 매개값을 검증해서 유효한 값만 데이터로 저장 할 수 있기 때문 **
ex)
public class Computer {
private boolean power = false; // 외부에서 조절 가능
private int panSpeed; // 외부에서 조절가능
private int temp; // 외부에서 볼 수만 있게 제한
public boolean isPower() {
return power;
}
public void setPower(boolean power) {
this.power = power;
}
public int getPanSpeed() {
return panSpeed;
}
public void setPanSpeed(int panSpeed) { // 팬 속도를 통해 온도 조절
this.panSpeed = panSpeed;
// 110 - 팬속도 = temp 라고 가정
temp = 110-this.panSpeed;
}
public int getTemp() {
return temp;
}
}
public class Main {
public static void main(String[] args) {
Computer com = new Computer();
// power 조절 및 보기
com.setPower(true);
System.out.println("power : "+com.isPower());
// pan speed 조절 및 보기
com.setPanSpeed(80);
System.out.println("pan speed : "+com.getPanSpeed());
// 온도 보기 ( 조절 불가 )
System.out.println("온도 : "+com.getTemp());
}
}
서로 연관 있는 속성과 기능들을 하나의 캡슐로 만들어 데이터를 외부로 부터 보호하는것을 말한다.
- 데이터 보호 : 외부로 부터 클래스에 정의된 속성과 기능들을 보호
- 데이터 은닉 : 내부의 동작을 감추고 외부에는 필요한 부분만 노출
즉, 각 객체 고유의 독립성과 책임 영역을 안전하게 지키고자 하는 목적