접근제어자
접근제어자는 클래스, 변수, 메서드의 선언부에 사용되어 클래스 내ㆍ외부에서 접근할 수 있는 범위를 지정한다.
| 지시자 | 클래스 내부 | 동일 패키지 | 상속받은 클래스 | 이외의 영역 |
|---|---|---|---|---|
| private | ○ | X | X | X |
| default | ○ | ○ | X | X |
| protected | ○ | ○ | ○ | X |
| public | ○ | ○ | ○ | ○ |
default 는 아무런 접근 제어자도 붙이지 않는 것을 의미한다.
class AAA{
private int num;
public void setNum(int n) { num = n; }
public int getNum() { return num; }
}
class BBB{
public accessAAA(AAA inst){
inst.num=20;
inst.setNum(20);
System.out.println(inst.getNum());
}
}
Int.num=20;에서 num은 private 멤버이므로 컴파일 에러가 발생한다.
System.out.println(inst.getNum());에서 setNum, getNum은 public이므로 호출 가능하다.
System.out.println(inst.getNum());에서 setNum, getNum은 public이므로 호출 가능하다.
package dean;
class AAA{ //package dean으로 묶인다.
int num;
}
class BBB{ //package dean으로 묶인다.
public init(AAA a) { a.num=20; }
}
Int.num이 defualt로 선언되었고
BBB는 AAA와 같은 패키지로 묶여있기 때문에 a.num=20; 같이 접근 가능하다.
BBB는 AAA와 같은 패키지로 묶여있기 때문에 a.num=20; 같이 접근 가능하다.
class AAA {
protected int num;
}
class BBB extends AAA{
public void init(int n) { num=n; }
}
Int.num이 defualt로 선언되었고
클래스 BBB가 클래스 AAA를 상속하였으므로 클래스 BBB가 상속된 변수 num에 접근 가능하다.
클래스 BBB가 클래스 AAA를 상속하였으므로 클래스 BBB가 상속된 변수 num에 접근 가능하다.
캡슐화
접근 제어자를 사용하는 목적은 주로 클래스 내부에 선언된 데이터들을 보호하기 위해서이다.
데이터가 유효한 값을 유지하기 위해 비밀번호, 개인정보같은 데이터를 외부에서 함부로 접근하지 못하도록 하기 위해서는 외부로 부터 접근을 제한하는 것이 필요한데 이것을 객체지향에서는 캡슐화Encapsulation라고 한다.
접근 제어자를 사용하는 또다른 목적은 외부에서 접근할 필요가 없는 멤버들을 private로 정의하여 외부에 노출시키지 않음으로 코드의 복잡성을 줄인다.
default 클래스
default 클래스는 동일한 패키지 내에 정의된 클래스에 의해서만 인스턴스 생성이 가능하다.
package apple;
class AAA { } //default 클래스 선언
package banana;
class BBB { //default 클래스 선언
public void make() {
apple.AAA inst = new apple.AAA();
}
}
클래스를 대표할 정보로 외부에 의미가 있는 클래스를 public으로 선언한다.
apple.AAA는 AAA와 BBB의 패키지가 다르므로 인스턴스 생성이 불가능 하다.
public 클래스
public 클래스는 동일한 패키지 내에 정의된 클래스에 의해서만 인스턴스 생성이 가능하다.
하나의 코드파일에 하나의 클래스만 public으로 선언 가능하고 public 클래스 이름과 소스파일 이름은 일치해야 한다.
package apple;
public class AAA { } //public 클래스 선언
package banana;
public class BBB { //public 클래스 선언
public void make() {
apple.AAA inst = new apple.AAA();
}
}
AAA는 public 클래스이므로 어디서든지 인스턴스 생성이 가능하다.
생성자의 접근 제어자
생성자에 접근 제어자를 사용함으로써 인스턴스의 생성을 제한할 수 있다. 생성자의 접근 제어자를 private로 정의하면 외부에서 생성자에 접근 불가능 하므로 인스턴스를 생성할 수 없게 되지만 클래스 내부에서는 인스턴스의 생성이 가능하다.
public class AAA{
AAA() { }
}
클래스는 public으로 선언되어서 파일을 대표하게 되었다. 그럼에도 불구하고 생성자가 default로 선언되었기 때문에 동일 패키지 내에서만 인스턴스 생성이 허용된다.
class BBB {
public BBB() { }
}
생성자가 public 임에도 클래스가 default로 정의되어서 동일 패키지 내에서만 인스턴스 생성이 허용된다.