자바

[자바] 접근제어자

j9972 2022. 8. 5. 11:18
728x90

접근제어자

객체안에 소속된 멤버들 ( 변수,메소드 ) 을 사용하는데 있어서 권한을 주는것
class A {
    public String x() {
        return "public x()";
    }
    
    public String y() {
        return "public y()";
    }
    
    private String z() {
        return "public z()";
    }
}

public class AccessDemo {
    public static void main(String[] args) {
        A a = new A();
        System.out.println(a.x());
        System.out.println(a.y());
        // System.out.println(a.z()); pricate이라는 접근제어자 때문에 오류
    }
}

 

 

접근제어자를 사용하는 이유

은행을 생각하기 ( 저금통 = private, 고객 응대 창고 = public )
class Cal {
    private  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 class calDemo {
    public static void main(String[] args) {
        calDemo c1 = new calDemo();
        c1.setOprands(10,20);
        c1.sumDecoPlus(); // sum은 접근 불가능
    }
}

- default 타입은 그냥 접근제어자 없이 void나 반환타입이 오는 타입을 말한다

 

클래스의 접근 제어자

- default와 public을 갖는다
public은 다른 패키지에서 클래스를 사용할 수 있다
default는 다른 패키지에서 클래스를 사용할 수 없다 ( 앞에 아무것도 적혀 있지 않다. )

- 클래스를 public으로 선언할 시에는 "클래스의 이름 == 소스코드의 이름(파일의 이름)" 을 지켜줘야한다.
하나의 소스파일에는 하나의 public class만 사용해야만 한다

 

 

접근제어자를 사용하는 이유

- 외부로부터 데이터 보호
- 외부에는 불필요한, 내부적으로만 사용되는 부분을 감추기 위해

만일 메서드 하나를 변경해야 할때, 접근제어자를 적절히 선택해서 접근 범위를 최소화하도록 노력하자 ( public이면 전부를 봐야함 )

제어자 같은 클래스 같은 패키지 자손클래스 전체
public  O O O O
protected O O O X
default O O X X
private O X X X

 

생성자의 접근 제어자

보통 생정자의 접근 제어자는 클래스의 접근제어자와 같지만, 다르게 지정할 수 있다.

 

private이니 외부에서 접근할 수 없어서, 인스턴스를 만들 수 없다.

하지만, 클래스 내부에서는 인스턴스 생성 가능

-> 클래스 내부 메서드가 public 이면서 static 이여야 외부에서 이 클래스 인스턴스를 사용할 수 있다.

 

private인 클래스는 다른 클래스의 조상이 될 수 없다.

이유는, 생성자의 접근 클래스가 private이므로 자손클래스에서 호출하는 것이 불가능하기 때문이다

따라서 private 클래스 앞에 final을 더 추가하여 상속할 수 없는 클래스라는것을 알리기

 

제어자의 조합

1. 메서드에 static과 abstract를 함께 사용할 수 없다.
2. 클래스에 abstract와 final을 동시에 사용할 수 없다.
3. abstract메서드의 접근 제어자가 priate일 수 없다.
4. 매서드에 private과 final을 같이 사용할 필요가 없다.