접근제어자
- private
- public
- protected
접근제어자를 사용하는 이유?
- 객체의 로직을 보호하기 위해서
- 멤버에 따라서 외부의 접근을 허용하거나 차단해야 할 필요성이 생김.
- 사용자에게 객체를 조작 할 수 있는 수단만을 제공함으로서 결과적으로 객체의 사용에 집중 할 수 있도록 돕기 위함.
간단한 예제를 보자
public class AClass { Integer i; Integer j; Integer k; static int TEMP = 10; public void setOprands(int i, int j) { this.i = i; this.j = j; } public void AMethod(){ System.out.println("A 클래스 호출 완료"); } // 오버라이딩 public void overRiding(){ System.out.println("오버라이딩"); } // private private String x(){ return "private"; } // public public String y(){ return "public"; } // public - private 메소드에 접근 public String z(){ return x(); } } public static void main(String[] args) { AClass aClass = new AClass(); BClass bClass = new BClass(); aClass.overRiding(); bClass.overRiding(); // 에러 발생 - 접근제어자가 private 이라서 // aClass.x(); aClass.y(); aClass.z(); } } | cs |
aClass.x() - private, aClass.y() - public, aClass.z() - public 이지만 private인 x를 호출하고 있다.
aClass.x()는 에러가 발생하는데, private 으로 선언했기 때문에 외부에서는 호출이 되지않는다.
만약,
aClass.x() 를 호출하고 싶다면 aClass.z() 처럼 호출해야 한다.
private -> default -> protected ->public
private
public class PrivateAccess { private String a; private String getA(){ return this.a; } } | cs |
위 예제의 a 변수와 getA메소드는 오직 PrivateAccess 클래스에서만 접근이 가능하고 다른 클래스에선 접근이 불가능하다.
default
public class PublicClass { } class DefaultClass { } public class ClassPackage1 { public static void main(String[] args) { // TODO Auto-generated method stub PublicClass publicClass = new PublicClass(); DefaultClass defaultClass = new DefaultClass(); } } | cs |
위 예제의 a 변수와 getA메소드는 오직 PrivateAccess 클래스에서만 접근이 가능하고 다른 클래스에선 접근이 불가능하다.
protected
package com.kor.test.sample.name; public class ClassPackage1 { protected String name = "HAHA"; } package com.kor.test.sample.test; import com.kor.test.sample.name.ClassPackage1; public class ClassPackage extends ClassPackage1{ public static void main(String[] args) { ClassPackage classPackage = new ClassPackage(); System.out.println(classPackage.name); } } | cs |
위 예제의 패키지가 서로 다르지만 name 변수가 protected로 선언 되었으므로 접근이 가능하다.
name 변수가 protected가 아니었으면 에러가 발생한다.