09-1 정보 은닉

클래스 외부에서 데이터에 직접 접근하는것을 막는 것

public class Circle {
    double rad = 0;
    final double PI = 3.14;

    public Circle(double r) {
        setRad(r);
    }

    public void setRad(double r) {
        if (r < 0) {
            rad = 0;
            return;
        }
        rad = r;
    }

    public double getArea() {
        return (rad * rad) * PI;
    }
}

public class Circle2 {
    public static void main(String[] args) {
        Circle c = new Circle(1.5);
        System.out.println(c.getArea());

        c.setRad(2.5);
        System.out.println(c.getArea());
        c.setRad(-3.3);
        System.out.println(c.getArea());
        c.rad = -4.5;
        System.out.println(c.getArea());
    }
}

위 Circle 코드에서 변수를 선언하고 Circle2에서 결과값을 출력하는 클래스를 각각 만들었을 때,

. 을 이용하여 외부에서 클래스를 가져올 경우에 정보를 은닉하지않으면 컴파일 오류는 발생하지 않으나 논리적인 오류가 발생할 수 있다. 그러므로 이때 private를 이용하여 자신이 원하는 변수를 결과값에 이용하도록 하기 위해서는 이용을 원하지 않는 변수에 private를 붙여주면 된다

public class Circle {
    private double rad = 0;
    final double PI = 3.14;

    public Circle(double r) {
        setRad(r);
    }

    public void setRad(double r) {
        if (r < 0) {
            rad = 0;
            return;
        }
        rad = r;
    }

    public double getArea() {
        return (rad * rad) * PI;
    }
}

public class Circle2 {
    public static void main(String[] args) {
        Circle c = new Circle(1.5);
        System.out.println(c.getArea());

        c.setRad(2.5);
        System.out.println(c.getArea());
        c.setRad(-3.3);
        System.out.println(c.getArea());
        c.rad = -4.5;
        System.out.println(c.getArea());
    }
}

위와 같이 double rad = 0 에 private를 붙여주면 Circle2클래스의 c.rad 에서 -를 입력하는 논리적 오 류를 방지할 수 있다 (컴파일 오류가 생겨서 작동이 불가능해지므로)

private에는 같은 클래스가 아닌 이상 직접 접근이 불가능해진다

변수의 이름을 기반으로 set, get 등 값을 꺼내가기 위한 메소드를 제공하면 이 값을 가져가는 통로가 된다. (Setter, Getter)

09-2 접근 수준 지시자

자바에서 제공하는 접근 수준 지시자

public > protected > default > private

클래스 정의 대상: public, default

인스턴스 변수와 메소드 대상: public, protected, default, private