본문 바로가기

프로그래밍/Java

19.12.22) Java - 정보은닉(Information Hiding)

목차

  • 정보 은닉(Information Hiding)은 왜 필요한가?
  • 정보 은닉(Information Hiding)은 어떻게 하는가?
  • 결국 잘못된 값이 들어가는 건 똑같지 않나?
  • 잘 설계된 클래스

    핵심

  • 정보 은닉은 클래스의 상태 정보를 안전하게 보호하기 위한 기능이다

정보 은닉(Information Hiding)은 왜 필요한가?

정보 은닉은 다른 클래스로부터 접근을 막는 행동이다. 그럼 왜 정보 은닉을 해야할까? 여기서 정보는 객체의 상태정보를 말한다. 정보 은닉을 하지 않으면 객체의 상태정보에 누구나 접근이 가능해진다. 이 의미는 잘못된 데이터가 들어갈 수 있다는 의미다. 잘못된 데이터가 들어가는 것을 막기 위해 정보 은닉을 한다.

예를 들면, 사람의 위는 누구나 접근할 수 있게 개방되어 있지 않다. 뼈와 근육으로 감추어져있다. 왜 그런가? 어떤 사람이 내 위에 직접적으로 음식물을 전달하면 내 위는 위험할 수 있다. 돌이 올지, 사과가 올지 모르기 때문이다. 그래서 사람은 입이 존재한다. 입에서 음식물을 판단하고 위에 갈 수 있는 음식이면 삼키지만 아니면 뱉는다.

정보 은닉(Information Hiding)은 어떻게 하는가?

정보 은닉을 하기 위해선 private 키워드를 사용한다. 객체 상태정보에 private을 사용해서 안전하게 보호한다. 그럼 어떻게 객체 상태정보에 데이터를 입력할까? 아까 예시처럼 입과 같은 기능이 필요하다. Setter, Getter 메서드이다.

Setter, Getter method

객체의 상태 정보를 private으로 설정하면 어떻게 상태 정보를 입력하고 출력할 수 있을 까? 이 때 setter, getter 메서드를 사용한다. 상태 변수 하나에 setter, getter 메서드를 하나씩 만든다.

public class Book{
    private String title;
    private int price;
}

public void setName(String title){
    this.title = title;
}
public String getName() {
    return title;
}

... // price도 마찬가지로 구현한다.

결국 잘못된 값이 들어가는 건 똑같지 않나?

그럼 이런 생각이 든다. 메서드로 하더라도 내가 잘못된 데이터를 넣을 수 있지 않을까? 물론 넣을 수 있다. 하지만 메서드이기 때문에 잘못된 데이터를 걸러낼 수 있다. 바로 if문이나 while문 등 다양한 기능을 활용할 수 있다. 메서드를 사용하지 않고 상태 정보를 직접 수정할 수 있었다면 잘못된 데이터를 걸러낼 방법이 없다.

잘 설계된 클래스

잘 설계된 클래스는 어떤 구조일까? 아무나 객체의 데이터를 접근하거나 사용하는 것을 막는 구조이다 단계 별로 살펴보자.

  1. 객체의 상태 정보가 은닉되어 있어야 한다. (private 사용)
  2. 기본 생성자가 명시적으로 표현되고, 오버로딩 생성자를 만들어 적절하게 초기화한다.
  3. Setter & Getter 메서드가 존재한다.
  4. 객체의 전체 정보를 출력하는 toString 메서드가 존재한다.