접근 가능한 범위를 정해, 데이터 은닉/보호(Encpsulation)기능을 추가한다.
접근제어자별 접근 범위(public > protected > default > private)
private 또는 protected 변수에 접근하기 위해 앞에서 배운 getter와 setter 사용한다
접근 제어자는 하나만 사용할 수 있다
코딩 실습1
package s04.s02.p05.subp01;
public class ClassA {
public int x;
protected int y;
int z; // default(= package)
private int w;
public void methodA() {}
protected void methodB() {}
void methodC() {} // default(=package)
private void methodD(){}
public void methodTest(){
System.out.println(x);
System.out.println(y);
System.out.println(z);
System.out.println(w);// 내부라 접근가능
methodA();
methodB();
methodC();
methodD(); // 내부이기에 접근 가능
//private은 특성상 내부 구현을 위해서만 사용됨
}
}
class ClassTest { // 같은 패키지인 경우우
public static void main(String[] args) {
ClassA obj = new ClassA();
System.out.println(obj.x);
System.out.println(obj.y);
System.out.println(obj.z);
//System.out.println(obj.w); // w는 private이라 접근 불가
obj.methodA();
obj.methodB();
obj.methodC();
// obj.methodD(); // 접근 불가 /IDE 빠른완성에 뜨지도 않음
}
}
같은 패키지의 같은 클래스의 경우 모든 접근제어자에 접근이 가능함
같은 패키지의 다른 클래스의 경우 private 접근제어외에 다른 접근자에는 접근이 가능함
package s04.s02.p05.subp02;
import s04.s02.p05.subp01.ClassA;
class ClassAA extends ClassA {
public void methodTest(){
System.out.println(x);
System.out.println(y); // 자식이라 다른 패키지에서도 사용 가능
//protected는 private처럼 쓰지만, 상속한 경우 접근이 필요 할 때 사용함(내부적 구현 바꾸어야 할때)
//System.out.println(z); // 접근불가
// System.out.println(w);// 내부라 접근가능
methodA();
methodB();
// methodC(); 접근불가
// methodD(); // 내부이기에 접근 가능
}
}
public class ClassB {
public static void main(String[] args) {
ClassA obj = new ClassA();
System.out.println(obj.x);
// System.out.println(obj.y); //protected는 다른 패키지인 경우 자식만 가능
// System.out.println(obj.z); // default는 다른 패키지면 안됩니다.
//System.out.println(obj.w); // w는 private이라 접근 불가
obj.methodA();
//obj.methodB();
// obj.methodC();
// obj.methodD(); // 접근 불가 /IDE 빠른완성에 뜨지도 않음
}
}
다른 패키지에 해당클래스를 상속받은 클래스는 public과 protect만 접근이 가능함
다른 패키지에 상속받지 않는 보통의 클래스의 경우 public으로만 접근이 가능함
위의 예제에서 처럼 접근제어자 키워드 별로 접근이 가능한 범위를 지정해 줄 수 있음
클래스에는 Public과 Default 접근제어자만 사용 가능하다
public과 deafault 접근제어자를 통해 다른 패키지에서 클래스에 접근 할 수 있는지 없는지만 제어한다
private의 경우 클래스로 접근이 다른 클래스의 접근이 불가능하기때문에 객체지향에 의미에 맞지않는다
protected의 경우 다른패키지의 자식클래스가 있다는 것이 전제되어야 되기때문에 public과 다른점이 없다(존재 의미가 없음)
java 파일에는 무조건 하나의 클래스가 있기로 약속을 했고 하나의 클래스명은 파일이름과 같아야 한다는 규칙이있음
해당 public 클래스는 전체 클래스를 대표해서 다른 클래스들에서 불러서 사용할 수 있게 됨
그 외에 전체에 존재하는 다른 클래스는는 내부적으로 대표 클래스를 구성하는 클래스로 인식을하게 됨
class SingletonClass {
private final static SingletoneClass instance = new SingletonClass();
private SingletonClass() {}
public static SingletonClass getInstance() {
return instance;
}
}
public class Foo {
final int x = 0; // final variable
final int y; // blank finial variable
public Foo(int y) {
this.y = y; // blank final variable initialization
}
}