[그린컴퓨터] Server/JAVA(객체 지향 프로그래밍)

정보 은닉 {접근 제어자 살펴보기, get( ) & set( ) 메서드, 정보은닉이란}

Ben의 프로그램 2023. 5. 18. 11:21
728x90

접근 제어자 살펴보기

  • 지금까지 클래스를 만들고 멤버 변수, 메서드, 생성자 등을 만들 때도 public 예약어를 사용했는데, 이 예약어의 의미를 살펴보겠습니다.
  • 객체 지향 프로그램에서는 예약어를 사용해 클래스 내부의 변수나 메서드, 생성자에 대한 접근 권한을 지정할 수 있습니다.
  • 이러한 예약어를 '접근 제어자 access modifier' 라고 합니다.
  • 앞에서 만들었던 모든 변수에는 public 예약어가 있습니다. 
  • public 이라고 선언한 변수나 메서드외부 클래스에서 접근이 가능하며 외부 클래스가 사용할 수 있다는 뜻입니다. 
  • 반대로 접근 제어자를 private으로 선언한 변수나 메서드는 외부 클래스에서 사용할 수 없습니다.
  • 예제를 통해 접근 제어자 변경이 어떤 영향을 미치는지 살펴보겠습니다.
package hiding;

public class Student {
	int studentID;
	private String studentName; // studentName 변수를 private으로 선언
	int grade;
	String address;
	
	public String getStudentName() {
		return studentName;
	}
	
	public void setStudentName(String studentName) {
		this.studentName = studentName;
	}
}
package hiding;

public class StudentTest {

	public static void main(String[] args) {
		Student studentLee = new Student();
		studentLee.studentName = "이상원"; // 오류발생
		
		System.out.println(studentLee.getStudentName());
	}

}
  • StudentName 변수를 private 으로 바꾸었습니다.
  • 그랬더니, StudentTest.java 파일에서 오류가 발생하고 있습니다. 왜 그럴까요?
  • 이유는 studentName 변수의 접근 제어자가 public일 때는 외부 클래스인 StudentTest.java 파일의 클래스에서 접근할 수 있었지만, private 으로 바뀌면서 외부 클래스의 접근이 허용되지 않기 때문입니다.

get( ), set( )  메서드

  • 그렇다면, private 으로 선언한 studentName 변수를 외부 코드에서 사용하려면 어떻게 해야 할까요?
  • studentName 변수를 사용할 수 있도록 public 메서드를 제공해야 합니다. 
  • pulic 메서드가 제공되지 않는다면 studentName 변수에 접근할 수 있는 방법은 없습니다.
  • 이때 사용할 수 있는 public 메서드가 바로 get( ), set( ) 메서드입니다. 
  • 값을 얻는 get( ) 메서드를 getter, 값을 지정하는 set( ) 메서드를 setter 라고도 부릅니다.
  • get( )  메서드와 set( ) 메서드는 이클립스에서 자동으로 만들 수 있다. (범위 지정후 - 마우스 우클릭 - Source - Generate Getters and Setters)
  • 다음과 같이 StudentTest.java 파일을 수정합니다.
package hiding;

public class StudentTest {

	public static void main(String[] args) {
		Student studentLee = new Student();
		studentLee.setStudentName("이상원");  // 오류발생 해결!
		
		System.out.println(studentLee.getStudentName());
	}
	
}
  • studentLee 의 멤버 변수인 studentName 에 직접 값을 대입하는 것은 studentName 이 private 으로 선언된 상태이기 때문에 오류가 발생했습니다.
  • 하지만 public 으로 선언된 setStudentName( ) 메서드를 활용하면 오류 없이 studentLee 의 멤버 변수인 studentName 에 값을 대입할 수 있습니다.
  • 외부 클래스에서 private 변수에 직접 접근할 수는 없지만, public 메서드를 통하면 private 변수에 접근할 수 있습니다.

정보 은닉이란?

  • 변수를 public 으로 선언하는 것과 변수를 private 으로 선언하고 나서 그 변수를 사용할 수 있도록 pulic 메서드를 제공하는 것의 차이는 무엇일까요? 어차피 변수에 접근하는 것은 마찬가지 아닌가요? 다음 예제를 통해 생각해보겠습니다.
public class MyDate {
	public int day;
	public int month;
	public int year;
}
  • MyDate 클래스를 보면 모든 멤버 변수를 public 으로 선언했습니다. 
  • 따라서 외부 클래스에서 MyDate 를 사용할 때 값을 마음대로 넣을 수 있습니다. 
public class MyDateTest {

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

}
  • 그런데, 이렇게 하니까 2월 임에도 불구하고 day 값에 31이 대입된 것을 볼 수 있습니다.
  • 즉, 클래스의 멤버 변수를 public 으로 선언하면 접근이 제한되지 않으므로 정보의 오류가 발생할 수 있습니다. 
  • 그래서 다음과 같이 변수를 private 으로 바꾸고 별도의 public 메서드를 제공해야 합니다.
public class MyDate {
	private int day;
	private int month;
	private int year;
	
	public int getDay() {
		return day;
	}
	public void setDay(int day) {
		if (this.month == 2) {
			if (this.day < 1 || day > 28) {
				System.out.println("날짜 범위 오류입니다.");
			} else {
				this.day = day;
			}
		}
	}
}
  • 이처럼 클래스 내부에서 사용할 변수나 메서드는 private 으로 선언해서 외부에서 접근하지 못하도록 하는 것을 객체 지향에서는 '정보 은닉 information hiding' 이라고 합니다.
  • 정보 은닉은 객체 지향 프로그래밍의 특징 중 하나이며 자바에서는 접근 제어자를 사용하여 정보 은닉을 구현니다.
  • 모든 변수를 private으로 선언해야 하는 것은 아니지만, 필요한 경우에는 private 으로 선언하여 오류를 막을 수 있습니다.

  • 자바에서 사용하는 접근 제어자를 정리하면 위와 같습니다.