자바
[자바] 접근제어자
j9972
2022. 8. 5. 11:18
728x90
접근제어자
객체안에 소속된 멤버들 ( 변수,메소드 ) 을 사용하는데 있어서 권한을 주는것
class A {
public String x() {
return "public x()";
}
public String y() {
return "public y()";
}
private String z() {
return "public z()";
}
}
public class AccessDemo {
public static void main(String[] args) {
A a = new A();
System.out.println(a.x());
System.out.println(a.y());
// System.out.println(a.z()); pricate이라는 접근제어자 때문에 오류
}
}
접근제어자를 사용하는 이유
은행을 생각하기 ( 저금통 = private, 고객 응대 창고 = public )
class Cal {
private int left, right;
public void setOprands(int left, int right) {
this.left = left;
this.right = right
}
private int _sum() { // 내부에 접근을 막음
return this.left + this.right;
}
public void sumDecoPlus() {
System.out.println("++++" + _sum() + "++++");
}
}
public class calDemo {
public static void main(String[] args) {
calDemo c1 = new calDemo();
c1.setOprands(10,20);
c1.sumDecoPlus(); // sum은 접근 불가능
}
}
- default 타입은 그냥 접근제어자 없이 void나 반환타입이 오는 타입을 말한다
클래스의 접근 제어자
- default와 public을 갖는다
public은 다른 패키지에서 클래스를 사용할 수 있다
default는 다른 패키지에서 클래스를 사용할 수 없다 ( 앞에 아무것도 적혀 있지 않다. )
- 클래스를 public으로 선언할 시에는 "클래스의 이름 == 소스코드의 이름(파일의 이름)" 을 지켜줘야한다.
하나의 소스파일에는 하나의 public class만 사용해야만 한다
접근제어자를 사용하는 이유
- 외부로부터 데이터 보호
- 외부에는 불필요한, 내부적으로만 사용되는 부분을 감추기 위해
만일 메서드 하나를 변경해야 할때, 접근제어자를 적절히 선택해서 접근 범위를 최소화하도록 노력하자 ( public이면 전부를 봐야함 )
제어자 | 같은 클래스 | 같은 패키지 | 자손클래스 | 전체 |
public | O | O | O | O |
protected | O | O | O | X |
default | O | O | X | X |
private | O | X | X | X |
생성자의 접근 제어자
보통 생정자의 접근 제어자는 클래스의 접근제어자와 같지만, 다르게 지정할 수 있다.
private이니 외부에서 접근할 수 없어서, 인스턴스를 만들 수 없다.
하지만, 클래스 내부에서는 인스턴스 생성 가능
-> 클래스 내부 메서드가 public 이면서 static 이여야 외부에서 이 클래스 인스턴스를 사용할 수 있다.
private인 클래스는 다른 클래스의 조상이 될 수 없다.
이유는, 생성자의 접근 클래스가 private이므로 자손클래스에서 호출하는 것이 불가능하기 때문이다
따라서 private 클래스 앞에 final을 더 추가하여 상속할 수 없는 클래스라는것을 알리기
제어자의 조합
1. 메서드에 static과 abstract를 함께 사용할 수 없다.
2. 클래스에 abstract와 final을 동시에 사용할 수 없다.
3. abstract메서드의 접근 제어자가 priate일 수 없다.
4. 매서드에 private과 final을 같이 사용할 필요가 없다.