규제에 해당
- 추상 클래스
- final
- 접근 제어자
- 인터페이스 등
접근 제어자
- 클래스의 맴버(변수와 메소드)들의 접근 권한을 지정한다.
ex )
class A {
public String y(){
return "public void y()";
}
private String z(){
return "public void z()";
}
public String x(){
return z();
}
}
public class AccessDemo1 {
public static void main(String[] args) {
A a = new A();
System.out.println(a.y());
// 아래 코드는 오류가 발생한다.
//System.out.println(a.z());
System.out.println(a.x());
}
}
z 메소드에서 에러가 발생하는 이유?
- 메소드가 키워드 private으로 시작되고 있다. private은 클래스(A) 밖에서는 접근 할 수 없다는 의미다. 바로 이 private의 자리에 오는 것들을 접근 제어자(access modifier)라고 한다
하지만 리턴하는것이 z메소드인 x메소드는 왜 오류가 안나는건가?
- 접근 제어자가 public이기 때문에 호출 할 수 있다. 그리고 메소드의 내용을 보면 내부적으로 메소드 z를 호출하고 있다. 메소드 z는 정상적으로 호출된다. 왜냐하면 메소드 x와 메소드 z는 같은 클래스의 소속이기 때문이다.
접근 제어자를 상용하는 이유
- 객체의 로직을 보호하기 위해서는 맴버에 따라서 외부의 접근을 허용하거나 차단해야 할 필요가 생긴다.
- 사용자에게 객체를 조작 할 수 있는 수단만을 제공함으로서 결과적으로 객체의 사용에 집중 할 수 있도록 돕기 위함이다.
ex )
class Calculator{
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 void sumDecoMinus(){
System.out.println("----"+_sum()+"----");
}
}
public class CalculatorDemo {
public static void main(String[] args) {
Calculator c1 = new Calculator();
c1.setOprands(10, 20);
c1.sumDecoPlus(); // 출력 결과 :++++30++++
c1.sumDecoMinus(); // 출력 결과 :----30----
}
}
세밀한 제어
public | protected | default | private | |
같은 패키지, 같은 클래스 | 허용 | 허용 | 허용 | 허용 |
같은 패키지, 상속 관계 | 허용 | 허용 | 허용 | 불용 |
같은 패키지, 상속 관계 아님 | 허용 | 허용 | 허용 | 불용 |
다른 패키지, 상속 관계 | 허용 | 허용 | 불용 | 불용 |
다른 패키지, 상속 관계 아님 | 허용 | 불용 | 불용 | 불용 |
클래스의 접근 제어자
- 클래스의 접근 제어자는 총 2개로 public과 default이다.
- default는 접근 제어자를 붙이지 않은 경우 default가 된다.
- 접근 제어자가 public인 클래스는 다른 패키지의 클래스에서도 사용할 수 있다.
- default인 경우는 같은 패키지에서만 사용 가능하다.
ex )
2개의 클래스 만들기
public class PublicClass {} // public 접근 제어자
class DefaultClass {} // default 접근 제어자
같은 패키지에서는 오류 X
public class ClassAccessModifierInnerPackage {
PublicClass publicClass = new PublicClass();
DefaultClass defaultClass = new DefaultClass();
}
다른 패키지에서는 오류 발생
public class ClassAccessModifierOuterPackage {
PublicClass publicClass = new PublicClass();
//DefaultClass defaultClass = new DefaultClass();
}
한가지 중요한 제약 사항이 있다. public 클래스가 포함된 소소코드는 public 클래스의 클래스 명과 소스코드의 파일명이 같아야 한다. 코드를 보자. 이 코드의 이름은 PublicNameDemo.java이다.
//public class PublicName {}
public class PublicNameDemo {}
주석처리된 부분은 오류가 발생한다. 퍼블릭 클래스의 이름과 소스코드의 이름이 일치하지 않기 때문이다. 그 말은 하나의 소스 코드에는 하나의 public 클래스가 존재 할 수 있다는 의미다.