본문 바로가기

Language/Java

[Java] 정보 은닉

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

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

반대로 private로 전언한 변수나 메서드는 외부 클래스에서 사용할 수 없다.

 

[실습] 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;
	}
}

 

[실습] private 변수 테스트하기
package hiding;

public class StudentTest {
	public static void main(String[] args) {
		Student studentLee = new Student();
		studentLee.studentName = "이상원";
		
		System.out.println(studentLee.getStudentName());
	}
}

 

studentName 변수의 접근 제어자가 public일 때는 외부 클래스인 StudentTest.java 클래스에서 이 변수에 접근할 수 있었지만, private로 바뀌면서 외부 클래스의 접근이 허용되지 않기 때문에 에러가 발생한다.

 

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

studentName 변수를 사용할 수 있도록 public 메서드를 제공하면 가능하다.

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

 

[실습] get(), set() 메서드 사용하기
package hiding;

public class Student {
	int studentID;
	private String studentName;  //studentName 변수를 private로 선언
	int grade;
	String address;
	
	public String getStudentName() {  //private 변수인 studentName에 접근해
		return studentName;           //값을 가져오는 public get() 메서드
	}
	
	public void setStudentName(String studentName) {
		this.studentName = studentName;  //private 변수인 studentName에 접근해
	}                                    //값을 지정하는 public set() 메서드
}

 

[실습] private 변수에 접근하기
package hiding;

public class StudentTest {
	public static void main(String[] args) {
		Student studentLee = new Student();
//		studentLee.studentName = "이상원";
		studentLee.setStudentName("이상원"); //setStudentName 메서드로 private변수에 접근
		
		System.out.println(studentLee.getStudentName());
	}
}

 

이처럼 studentName 멤버 변수에 이름값을 직접 대입하는 것이 아니고 setStudentName() 메서드를 활용하여 값을 대입한다. 즉, 외부 클래스에서 private 변수에 직접 접근할 수는 없지만, public 메서드를 통하면 private 변수에 접근할 수 있다.

 

이렇게 클래스 내부에서 사용할 변수나 메서드는 private로 선언해서 외부에서 접근하지 못하도록 하는 것을 객체 지향에서 '정보 은닉(information hiding)'이라 한다. 정보 은닉은 객체 지향 프로그래밍의 특징 중 하나이며, 자바에서는 접근 제어자를 사용해서 정보 은닉을 구현한다. 

모든 변수를 private로 선언해야 하는 것은 아니지만, 필요한 경우 private로 선언하여 오류를 막을 수 있다.

 

 

▶ 자바에서 사용하는 접근 제어자

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

 

'Language > Java' 카테고리의 다른 글

[Java] 객체 간 협력  (0) 2022.10.17
[Java] this 예약어  (0) 2022.10.12
[Java] 참조 자료형  (0) 2022.10.01
[Java] 생성자  (0) 2022.09.30
[Java] 클래스와 인스턴스  (0) 2022.09.28