🔹 클래스의 멤버인 변수와 메소드들의 접근 권한을 지정하는 역할
🔹 public
, protected
, default
, private
가 있다.
🔹외부에서 데이터에 직접적인 접근을 허용하지 않도록 함으로써 정보 은닉을 구체화 하기 위해
🔹클래스 내부에 선언된 데이터를 보호하기 위해
객체지향에서의 정보 은닉(data hiding)
사용자가 굳이 알 정보가 없는 정보는 사용자로부터 숨겨야 한다는 개념
👉🏻 이를 통해 사용자는 언제나 최소한의 정보만으로 프로그램을 사용할 수 있다.
🔹접근 제한이 없다.
🔹어디서든 접근 가능하다.
🔹같은 패키지, 같은 클래스, 자식 클래스에서 접근 가능하며 이외에는 private처럼 취급된다.
🔹같은 클래스, 같은 패키지 내에서만 접근 가능하다.
🔹private 접근제어자를 사용하여 선언된 클래스 멤버는 외부에서 직접 접근할 수 없다.
🔹private 멤버는 해당 멤버를 선언한 클래스(같은 클래스 내)에서만 접근할 수 있다.
👉🏻 외부에서 접근하기 위해서는 해당 객체의 public 메소드를 통해서만 접근할 수 있다.
(ex. getter, setter)
접근제어자의 접근 범위
public > protected > default > private
package study;
public class ChanPark {
[ ] String firstname = "chan";
[ ] String lastname = "park";
}
----------------------------------
package study.AccessModifier;
import study.ChanPark
public class ChanHoPark extends ChanPark{
public static void main(String[] args){
ChanHoPark chp = new ChanHoPark();
System.out.println(chp.lastname);
}
}
결과 : park
class Calculator{
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()+"----");
}
}
class Main {
public static void main(String[] args) {
Calculator c1 = new Calculator();
c1.setOprands(10, 20);
c1.sumDecoPlus();
c1.sumDecoMinus();
}
}
6-1. 위 코드는 캡슐화된 코드인가?
6-2. Main 클래스 실행 결과는?
1 class Hello{
2 protected static void hello(){
3 System.out.println("HELLO!");
4 }
5 }
6
7 class Hi{
8 private static void hi(){
9 System.out.println("HI!");
10 }
11 }
12
13 class Main02{
14 public static void main(String[] args) {
15 Hello.hello();
16 Hi.hi();
17 }
18 }
7-1. 위 코드는 정상적으로 실행되는가?
7-2. 7-1번의 이유는?
[ ] > [ ] > [ ] > [ ]
답 : getter, setter
답 : x
이유 : protected 접근제어자는 자식클래스에서 접근 가능할 뿐이지, 꼭 오버라이드 해야하는 건 아니다.
답 : 없다
이유 : abstract 메서드는 자식클래스에서 구현하기 위해 접근해야 하기 때문에
package study;
public class ChanPark {
[ ] String firstname = "chan";
[ ] String lastname = "park";
}
----------------------------------
package study.AccessModifier;
import study.ChanPark
public class ChanHoPark extends ChanPark{
public static void main(String[] args){
ChanHoPark chp = new ChanHoPark();
System.out.println(chp.lastname);
}
}
결과 : park
답 : public, protected
이유 : 다른 패키지이지만 ChanPark 클래스를 상속받아서 자식클래스가 되었으므로 protected도 가능하다
답 : 인터페이스, 연결자, 접근자, 다리.. 접근을 하도록 도와주는 역할을 가리키는 말이면 다 맞는 거 같다.
class Calculator{
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()+"----");
}
}
class Main {
public static void main(String[] args) {
Calculator c1 = new Calculator();
c1.setOprands(10, 20);
c1.sumDecoPlus();
c1.sumDecoMinus();
}
}
6-1. 위 코드는 캡슐화된 코드인가?
답 : x
이유 : 멤버변수가 private로 지정되어 있지 않기 때문
6-2. Main 클래스 실행 결과는?
답 :
++++30++++
----30----
1 class Hello{
2 protected static void hello(){
3 System.out.println("HELLO!");
4 }
5 }
6
7 class Hi{
8 private static void hi(){
9 System.out.println("HI!");
10 }
11 }
12
13 class Main02{
14 public static void main(String[] args) {
15 Hello.hello();
16 Hi.hi();
17 }
18 }
7-1. 위 코드는 정상적으로 실행되는가?
답 : 에러
7-2. 7-1번의 이유는?
답 : 16번에서 에러, private로 지정되어 있어서 호출 불가능
답 : public > protected > default > private