Jay's Developer Note

[JAVA] 캡슐화 & 은닉화 본문

JAVA

[JAVA] 캡슐화 & 은닉화

Jay(J) 2022. 3. 16. 19:58
728x90

캡슐화 & 은닉화

캡슐화와 은닉화는 단어처럼 캡슐 알약에 비교하면 이해하기 쉽다.
감기약의 성분을 환자(사용자)는 알 필요가 없다. 단지 알약을 물과 함께 삼키면 속에서 약효가 발휘된다.
이처럼 외부에서 내부의 내용을 알 수 없게 감싼 구조를 캡슐화했다라고 할 수 있다. 그렇다면 자연스레 은닉화도 같이 된 것이다.
예시 코드들을 보면서 한 번 더 이해 해보도록하자.

예시 1
class Car {
  // Bad
  public String model;
  public int maxSpeed;
}

외부에서 '직접' 멤버 변수에 접근할 수 있기 때문에 캡슐화에 위배되는 코드다.
그렇다면 캡슐화를 적용하려면 어떻게 해야 할까?
멤버 변수들을 숨기고(은닉화) 접근할 수 있는 창구를 만들어주면 된다.

class Car {
  // 외부에서 접근 금지(은닉화)
  private String model;
  private int maxSpeed;

  // 접근할 수 있는 메소드(창구) 생성
  public String getModel() {
    return this.model;
  }
  public void setModel(String model) {
    this.model = model;
  }
  
  public int getMaxSpeed() {
    return this.maxSpeed
  }
  public void setMaxSpeed(int maxSpeed) {
    this.maxSpeed = maxSpeed;
  }
}

위처럼 model, maxSpeed 를 설정할 수 있는 메소드들을 만들어서 외부와 통신하게 되는데 이를 getter/setter 라고 칭한다. Intellij 계열 IDE 에서는 'Alt + Insert' 를 누르면 손쉽게 getter and setter 를 만들어준다.

 

예시 2

이번에는 접근 제어자를 통해 외부의 창고와 내부 로직을 구분지어서 돌아가는 소스 코드를 대략 적어보겠다.

class Car {
  public boolean startEngine() {
    return startMotor();
  }
  
  // 자동차 시동모터 시작
  private boolean startMotor() {
    if (electricSensorOn()) {
      // 전원인가가 성공하면 RPM 올리기
      return rpmUp();
    } else {
      // 전원인가 안되면 시동 안 걸림
      return false;
    }
  }
  
  // 자동차 전기 센서 전원 공급
  private boolean electricSensorOn() {
    boolean isSuccess = false;
    // 전기 센서들에 전원인가 성공하면 isSuccess = true
    return isSuccess;
  }
  
  // 시동모터가 최소 RPM 까지 기계적인 힘으로 올려줌
  private boolean rpmUp() {
    boolean isSuccess = false;
    // 시동모터가 최소 RPM 으로 올려주면 isSuccess = true
    return isSuccess;
  }
}

public 으로 선언된 startEngine 메소드만 외부(사용자)에서 접근이 가능하고, private 으로 선언된 메소드들은 내부에서 로직으로 활용된다.
외부에서는 아래처럼 사용하면 시동 여부만 가져와서 분기 처리를 할 수 있다.

class Hyundai {
  public static void main(String[] args) {
    Car mCar = new Car();
    if (mCar.startEngine()) {
      System.out.println("시동 걸림!");
    } else {
      System.out.println("시동 안 걸림..!");
    }
    // mCar.rpmUp(); // private 이기 때문에 에러발생
  }
}

 

728x90

'JAVA' 카테고리의 다른 글

[JAVA] 임시 비밀번호 생성(feat. RandomStringUtils)  (0) 2022.05.25
[JAVA] Class - 5(상속)  (0) 2022.04.02
[JAVA] Class - 4(메소드)  (0) 2022.03.13
[JAVA] Class - 3(멤버 변수)  (0) 2022.03.11
[JAVA] Class - 2(생성자)  (0) 2022.02.25