"Boldness has genius, power, and magic in it." - Johann Wolfgang von Goethe

JAVA_SPRING

[JAVA] 접근 제어 지시자_정보 은닉 정리

Toproot 2022. 9. 22. 22:13
728x90
728x90

접근제어지시자

학습내용

  • JAVA의 접근 제어지시자의 유형과 종류를 파악한다.(private < default < protected < public)
  • 정보 은닉의 개념과 private를 권장하는 이유를 이해한다.

📒 접근 제어 지시자 (Access Modifier)

접근 제어 지시자는 변수를 보호하고, 외부에서 변수를 더 잘 사용하 수 있게 하기 위해 사용합니다.
JAVA의 접근제어 지시자는 총 4개가 있고, 필요에 따라서 적절하게 변수의 접근 범위를 지정해줍니다.

클래스 접근 지정자

📌 public 클래스

패키지에 상관 없이 다른 어떤 클래스에서도 사용 가능.

public class World {}

📌 default 클래스

접근지정자 없이 설정한 클래스로, 같은 패키지 내에서만 사용이 허용.

class Local {}

멤버 변수 접근 지정자

📌 public 멤버

패키지에 상관 없이 모든 클래스들이 접근 가능.

public class A {
    public int n;
    public void m() {
        n = 5;
    }
}

📌 private 멤버

클래스 내의 멤버들에게만 접근이 허용됨.
안전한 코딩을 위해 가능한 한 변수를 private로 지정하여 사용하는 것 권장.
외부에서 접근이 불가하므로 getter(), setter()를 사용하여 접근 및 값 설정.

public class B {
    private int n;
    private void m() {
        n = 5;
    }
}

📌 protected 멤버

같은 패키지의 모든 클래스에서 접근이 가능.
다른 패키지에 있을 때는 상속관계로 자식 클래스의 경우에 접근이 허용됨.

public class C {
    protected int n;
    protected void m() {
        n = 5;
    }
}

📌 default 멤버

동일한 패키지 내에서 모두 접근 가능함.

public class D {
    int n;
    void m() {
        n = 5;
    }
}

Private 지정자를 권장하는 이유는?

  • Private 로 사용할때 변수에 접근하기 위해서 get,set 메서드를 제공한다.
  • 외부에서 해당 변수에 접근할때 제한을 두는 행위로, 객체의 속성이 변질되거나 오용되지 않게 하기 위함.
  • set을 해줄 때 메서드에서 검증을 하여 변수에 값을 지정할 수 있음.
  • 메서드를 통해 디버깅도 할 수 있어 사용자가 오류를 범한 것을 쉽게 파악할 수 있음.

정보 은닉 = 정보 보호

여러 개발서를 보면 '정보 은닉' 이라는 표현을 많이 사용합니다.
private나 protected 와 같이 외부의 접근을 제한하기 때문에 이러한 표현을 사용하는데요.
외부에서 객체의 속성 및 변수 값을 함부로 바꾸지 못하도록 정보를 보호하기 위한 차원에서 사용합니다.
따라서 프로그램을 더 안전하고 디버깅으로 에러를 더 빠르게 발견하기 위해 사용하는 이유로 '정보 보호' 라고 할 수 있습니다.

예시 코드

BirthDay

  • 생일의 날짜가 유효한 날짜인지 검증할 수 있는 객체.
package unit10_접근제어자_정보은닉;

public class BirthDay {

    private int day;
    private int month;
    private int year;

    private boolean isValid; // default값 >> false

    public int getDay() {
        return day;
    }

    // source -> generate getter and setter

    public void setDay(int day) {
        this.day = day;
    }

    public int getMonth() {
        return month;
    }

    public void setMonth(int month) {
        if ( month < 1 || month > 12) {
            isValid = false;
        } else {            
            isValid = true;
            this.month = month;
        }
    }

    public int getYear() {
        return year;
    }

    public void setYear(int year) {
        this.year = year;
    }

    public void showDate() {
        if(isValid) {
            System.out.println( year + "년 " + month + "월 " + day + "일 입니다.");
        }
        else {
            System.out.println("유효하지 않은 날짜입니다.");
        }
    }

    // set은 제공하지 않음. -> Read Only
    public boolean getIsValid() {
        return isValid;
    }

}

BirthDay Test

package unit10_접근제어자_정보은닉;

public class BirthDayTest {
    public static void main(String[] args) {

        BirthDay date = new BirthDay();
        date.setYear(2019);
        date.setMonth(12);
        date.setDay(30);

        date.showDate();
    }
}
728x90
728x90