Java

[중앙정보처리학원] Java* 객체지향 캡슐화(encapsulation)

해보구 2024. 4. 22. 16:42

캡슐화(encapsulation) 이란?

캡슐화란 객체의 상태와 동작을 하나의 단위로 묶어서 구현하는 것을 의미한다.

다시 말하자면,

하나의 목적을 이루기 위해 관련 있는 모든 것들을 하나의 캡슐에 담아 두는 것을 의미한다.

어떻게 보자면 위에서 소개한 setter 메서드 같은 경우에도 캡슐화의 일환으로 볼 수 있다.

객체의 상태를 뜻하는 필드를, 동작을 뜻하는 메서드와 하나의 단위로 묶어서 관리하는 것이기 때문인데, 또 다른 예시를 소개해 보겠다.

 

// 시동 거는 기능
public void engineStart() {
    System.out.println("시동 버튼을 눌렀습니다.");
    System.out.println("시동이 걸렸습니다.");
}


// 엔진에 연료가 주입되는 기능
private void injectGasoline() {
    System.out.println("연료가 엔진에 주입됩니다.");
}
// 엔진오일이 주입되는 기능
private void injectOil() {
    System.out.println("엔진 오일이 순환합니다.");
}
// 실린더가 움직이는 기능
private void moveCylinder() {
    if (start) {
        System.out.println("실린더가 움직입니다.");
    } else {
        System.out.println("차가 고장났습니다.");
    }
}

 

자동차에 시동을 걸기 위해서는 engineStart()라는 메서드를 외부에서 호출할 것이다.

운전자가 자동차의 시동 버튼을 누르면 차 내부에서는

  1. 연료가 엔진에 주입되고,
  2. 엔진 오일 순환이 시작되고,
  3. 실린더가 움직이기 시작할 것이다.

순서가 중요한 로직이고, 모든 과정이 정상적으로 진행 되어야 시동이 완료될 것이다.

그리고 이러한 과정을 거치는 메서드들은 모두 private 으로 지정하였다.

운전자는 시동 버튼을 누르는 행위만 진행할 뿐이지, 직접 연료를 주입하거나, 엔진 오일을 순환 시키거나 실린더를 움직이는 행위는 할 수도 없고 해서는 안 되기 때문이다.

 

// 시동 거는 기능
public void engineStart() {
    System.out.println("시동버튼을 눌렀습니다.");
    injectOil();
    injectGasoline();
    this.start = true;
    moveCylinder();
    System.out.println("시동이 걸렸습니다.");
}

 

그래서 engineStart() 메서드 내에 순서를 지켜서 내부에서만 호출이 가능한 메서드를 호출하였다.

일련의 과정을 통해 start 필드값도 true로 바뀌고 시동이 걸리게 될 것이다.

이러한 과정을 캡슐화라 한다. 하나의 목적을 위해 관련 있는 것들을 모아두는 것.

예시는 메서드로 들었지만, 여러 개의 클래스가 모여 하나의 동작을 진행 한다면

필드로 클래스 타입의 변수를 선언하여 클래스들의 캡슐화도 구현할 수 있을 것이다.

이를 통해 사용자 쪽에서 좀 더 간결한 문법으로 객체를 동작시킬 수 있는 편의성이 있고,

내부 로직이 변경되더라도 외부 코드에는 영향을 미치지 않도록 설계되기 때문에 유지 보수의

편의성 또한 증가한다.