JAVA

정보 은닉(접근 제어자, get(),set())

seungmin576 2024. 12. 13. 15:46

접근 제어자

객체 지향 프로그램에서는 예약어를 사용해 클래스 내부의 변수나 메서드, 생성자에 대한 접근 권한을 지정할 수 있다.

이러한 예약어를 '접근 제어자' 라고 한다.

pulbic이라고 선언한 변수나 메서드는 외부 클래스에서 접근이 가능하며 외부 클래스가 사용할 수 있다는 뜻이다.

반대로 접근 제어자를 private으로 선언한 변수나 메서드는 외부 클래스에서 사용할 수 없다.

 

  • private으로 선언하면 결과 값이 바뀌는 예제
package exercise;

public class Student {
    int studentID;
    private String studentName;
    int grade;
    String address;

    public String getStudentName(){
        return studentName;
    }

    public void setStudentName(String studentName){
        this.studentName = studentName;
    }
}

 

package exercise;

public class StudentTest {
    public static void main(String[] args) {
        Student student = new Student();
        student.studentName = "오류류?";

        System.out.println(student.getStudentName());
    }
}

 

studentName 변수의 접근 제어자가 private이니 외부 클래스의 접근이 허용되지 않아 오류가 난다.


get(), set() 메서드

private으로 선언한 studentName 변수를 외부 코드에서 사용하려면 어떻게 해야 할까?

studentName 변수를 사용할 수 있도록 public 메서드를 제공해야 한다.

public 메서드가 제공되지 않는다면 studentName 변수에 접근할 수 있는 방법은 없다.

이때 사용할 수 있는 것이 get(), set() 메서드이다.

get() = 값을 얻는 메서드, getter 라고도 부름

set() = 값을 지정하는 메서드, setter 라고도 부름

 

  • get(), set() 메서드를 사용할 수 있도록 코드 수정
package exercise;

public class StudentTest {
    public static void main(String[] args) {
        Student student = new Student();
        //student.studentName = "오류류?";
        student.setStudentName("이제된다!");	//setStudentName() 메서드를 활용해 private 변수에 접근
        
        System.out.println(student.getStudentName());
    }
}

 

studentName 멤버 변수에 이름 값을 직접 대입하는 것이 아니고 setStudentName() 메서드를 활용하여 값을 대입한다.

외부 클래스에서 private 변수에 직접 접근할 수는 없지만, public 메서드를 통하면 private 변수에 접근할 수 있다.


정보 은닉

변수를 public으로 선언하는 것과 변수를 private으로 선언하고 나서 그 변수를 사용할 수 있도록 public 메서드를 제공하는 것의 차이는 무엇일까? 어차피 변수에 접근하는 것은 마찬가지인데 말이다.

예제를 통해 생각해 보자.

 

public class MyDate{
	public int day;
    public int month;
    public int year;
}

 

day, month, year 모두 public으로 선언했다.

따라서 외부 클래스에서 MyDate를 사용할 때 값을 마음대로 넣을 수 있다.

그러면 2월은 28일이나 29일까지 이지만 31일로 잘못 대입할 수도 있다.

 

public class MyDateTest{
	public static void main(String[] args){
    	Mydate date = new Mydate();
        date.month = 2;
        date.day = 31;
        date.year = 2018;
    }
}

 

즉 클래스의 멤버 변수를 public으로 선언하면 접근이 제한되지 않으므로 정보의 오류가 발생할 수 있다.

이런 경우에는 오류가 나더라도 그 값이 해당 변수에 대입되지 못하도록 다음과 같이 변수를 private 으로 바꾸고 public 메서드를 별도로 제공해야 한다.

 

public class MyDate{
	private int day;
    private int month;
    private int year;
    
    public void setDay(int day){
        if (month == 2) {
            if(day  < 1 || day > 28){
                System.out.println("오류");
            } else {
                this.day = day;
            }
        }
    }
}

 

이처럼 클래스 내부에서 사용할 변수나 메서드는 private으로 선언해서 외부에서 접근하지 못하도록 하는 것을 객체 지향에서는 '정보 은닉'이라고 한다.

정보 은닉은 객체 지향 프로그래밍의 특징 중 하나이며 자바에서는 접근 제어자를 사용하여 정보 은닉을 구현한다.

모든 변수를 private 선언해야 하는 것은 아니지만 필요한 경우에는 오류를 막으려 private 선언할 수 있다.

 

자바에서 사용하는 접근 제어자는 다음과 같다.

접근 제어자 설명
public 외부 클래스 어디에서나 접근할 수 있다.
protected 같은 패키지 내부와 상속 관계의 클래스에서만 접근 할 수 있고 그 외 클래스에서는 접근할 수 없다.
아무것도 없는 경우 default 이며 같은 패키지 내부에서만 접근할 수 있다.
private 같은 클래스 내부에서만 접근할 수 있다.

'JAVA' 카테고리의 다른 글

객체 간 협력  (0) 2024.12.16
this  (0) 2024.12.16
참조 자료형  (1) 2024.12.13
생성자  (0) 2024.12.13
클래스와 인스턴스  (0) 2024.12.12