Purple Bobblehead Bunny

Backend/JAVA

[JAVA] 접근 제어자

준영어린이 2022. 3. 16. 17:13

 

접근제어 지시자

지시자 접근 허용 범위
클래스 내부 해당 패키지 내부 상속받은 클래스  그 이외
private 가능 불가능 불가능 불가능
default 가능 가능 불가능 불가능
protected 가능 가능 가능 불가능
public 가능 가능 가능 가능

default는 생소하지만, 우리가 여태 계속 써왔던 부분이다.

class A { ... } -->  보통은 클래스를 생성할 때 이렇게 생성을 한다. class앞에 아무것도 없는 경우를

                       default 지시자 라고 한다.

default 지시자는 같은 클래스, 같은 패키지내에서만 사용이 가능하다.

 

private, protected, public 지시자의 이해를 돕기위한 코드 예제

Line17에서 int_private = 3; 에서 오류가 생긴다.

여기서 private의 접근 범위를 보면 클래스 내부에서만 가능하다고 되어있다.

 

int_private는 A라는 클래스에 정의가 되어있다.

그래서 A클래스를 벗어난 JAVA클래스에서는 접근이 불가능하다.

 

반대로 default, protected, public은

지시자 접근 허용범위
클래스 내부 해당 패키지 내부 상속받은 클래스 그 이외
default 가능 가능 불가능 불가능
protected 가능 가능 가능 불가능
public 가능 가능 가능 가능

해당 패키지 내부에 있는(같은 경로) 경로에서 사용이 가능하므로 접근이 가능하다.

 

private와 정보은닉

 

private는 정보은닉을 위해서 사용 한다.

해당 클래스 내부에서만 사용 가능.. 즉, 외부에서의 해당 값 접근이 불가능하다

여자가 남자보다 돈이 많으면 여자가 돈을 내고, 그 이외의 상황에서는 남자가 돈을 내게 되는 예제이다.

예제에서 각각의 BoyFriend,GirlFriend 클래스에서 돈을 뜻하는 money가 default로 되어있다.

 

public class JAVA  {
public static void main(String[] args ) {
       GirlFriend girl = new GirlFriend(5000);
       BoyFriend boy = new BoyFriend(10000);
       int FoodValue = 4000;
       if (girl.getMoney() > boy.getMoney()) {
girl.pay(FoodValue);
  }else
boy.pay(FoodValue);
      }
}

 

dafault 지시자여서 이렇게 외부에서 값을 조정을 할 수 있다.↓↓↓

public class TestClass {

    public static void main(String[] args) {

         GirlFriend girl = new GirlFriend(5000);

         BoyFriend boy = new  BoyFirend(10000);

         girl.money += 10000;

         boy.money += 5000;

         ...

     }

}

 

protected. private

protected는 접근범위 위치가 조금 애메해서, 가급적이면 public 또는 default를 쓰게 된다.

 

 

메소드에서 public과 default

class A {

    public A() {

    int a() {..}

    public void aa() {...}

}

여기서 클래스는 dafault인데 메소드는 public으로 선언되어 있다.

클래스가 default 라서 아무리 메소드를 public으로 걸어봐도, public의 범위가 아닌 default 범위 내에서만 사용이 된다.

그래서 보통 public을 지워주는 것이 현명하다.

여기서 알 수 있는 사실은

 

속해있는 클래스의 범위에 한정되서 , 생성자의 범위를 결정 할 수 있다.

(메소드의 경우 public을 사용하여 default 클래스에서도 선언할 수 있다)

'Backend > JAVA' 카테고리의 다른 글

[JAVA] Scanner  (0) 2022.03.18
[JAVA] TreeSet HashSet  (0) 2022.03.17
[JAVA] Object  (0) 2022.03.15
[JAVA] 오버로딩, 오버라이딩 (Overloading, Overrding)  (0) 2022.03.14
[JAVA] abstract , interface  (0) 2022.03.11