접근제어자란?
접근제어자 종류
private
private가 붙은 변수, 메서드는 해당 클래스에서만 접근이 가능함
[예제]
public class Test {
private String test;
private String getTest() {
return this.test;
}
}
// test변수와 getTest메서드는 오직 Test Class에서만 접근이 가능하며
// 다른 Class에서는 접근이 불가함
default
접근제어자를 별도로 설정하지 않는다면 접근 제어자가 없는 변수, 메서드는 default 접근제어자가 되어 해당 package내에서만 접근이 가능함
[예제]
package test; // 패키지가 동일함
public class TestHello {
// sayHello은 default 접근제어자로 설정됨
String sayHello = "Hello!";
}
package test; // 패키지가 동일함
public class TestBye {
String sayHello = "Hello!";
public static void main(String[] args) {
TestHello hello = new TestHello();
// TestHello 클래스의 sayHello변수를 사용할 수 있음
System.out.println(hello.sayHello); // Hello!
}
}
// TestHello과 TestBye의 Package는 test로 동일하기에
// TestBye 클래스에서 TestHello의 sayHello변수에 접근이 가능함
protected
접근제어자가 protected로 설정되었다면 protected가 붙은 변수와 메서드는 동일한 Package의 클래스 or 해당 클래스를 상속받은 다른 Package의 클래스에서만 접근이 가능함
[예제]
package test; // 패키지가 서로 다름
public class TestHello {
// sayHello은 protected 접근제어자로 설정됨
protected String sayHello = "Hello!";
}
package test.bye; // 패키지가 서로 다름
public class TestBye extends TestHello { // TestHello를 상속받음
public static void main(String[] args) {
TestHello hello = new TestHello();
// 상속한 TestHello 클래스의 protected 변수는 접근이 가능함
System.out.println(hello.sayHello); // Hello!
}
}
// TestHello클래스를 상속한 TestBye클래스의 package는 test.bye이므로
// TestHello의 package인 test와 다르지만 TestHello의 sayHello변수가
// protected이기 때문에 hello.sayHello와 같은 접근이 가능함
// 단, sayHello의 접근제어자가 protected가 아닌 default접근제어자였다면
// hello.sayHello문장은 컴파일 오류가 발생하게 됨!
public
public접근제어자가 붙은 변수와 메서드는 어떤 클래스에서라도 접근이 가능하다는 의미임
[예제]
package test; // 패키지가 서로 다름
public class TestHello {
// sayHello은 public 접근제어자로 설정됨
public String sayHello = "Hello!";
}
package test.bye; // 패키지가 서로 다름
public class TestBye {
public static void main(String[] args) {
TestHello hello = new TestHello();
// TestHello 클래스의 public 변수는 어떤 클래스라도 접근가능함
System.out.println(hello.sayHello); // Hello!
}
}
// TestHello클래스의 public 접근제어자를 설정한 sayHello는
// TestBye클래스에게 접근이 가능함! 왜냐, public접근제어자는 어떤 클래스라도
// 접근 할 수 있으며, 상속받지 않아도 package가 달라도 public 접근제어자에
// 접근이 가능함!