본문 바로가기

Java/Methodology

[OOP] 객체 지향 프로그래밍이란? - 캡슐화

  • 캡슐화(Encapsulation)

하나의 클래스안에 관련있는 변수와 메소드를 하나로 묶는다.
데이터를 은닉화하여 외부에서의 조회 및 수정을 제한한다.

아래는 캡슐화가 되지 않은 코드다.

public class Car
{

    String manufacturer;
    String modelName;

}

void oopTest()
{
    Car car = new Car();

    car.manufacturer = "현대";
    car.modelName = "쏘나타";

    log.info("{}", car.manufacturer);
    log.info("{}", car.modelName);
}

어디서든 멤버 변수에 접근할 수 있고 심지어 수정까지도 가능하다.
이런 식으로 개발을 하면 프로젝트가 커질수록 값이 변경되는 곳을 찾기 힘들어질 것이다.

아래와 같이 코드를 수정해보자.

public class Car
{

    private String manufacturer;
    private String modelName;

    public String getManufacturer()
    {
        return this.manufacturer;
    }

    public String getModelName()
    {
        return this.modelName;
    }

    public void modifyModelName(String modelName)
    {
        this.modelName = modelName;
    }

    public Car(String manufacturer, String modelName)
    {
        this.manufacturer = manufacturer;
        this.modelName = modelName;
    }

}

void oopTest()
{

    Car car = new Car("현대", "쏘나타");

    log.info(car.getManufacturer());
    log.info(car.getModelName());

    car.modifyModelName("그랜져");
}

private로 감춰져 있기 때문에 .을 통해서 조회 및 수정이 불가능하다.
조회를 하기 위해선 getXXX를 호출하여 조회하여야 한다.
또한, modelName을 수정하기 위해선 modifyModelName을 호출해서 수정하여야 한다.

개발자 취향이겠지만 필자는 모든 setter를 열어두지 않는다. 또한, 무의미한 setModelName식의 네이밍 또한 피하는 편이다.
필요할 때 setter를 만들고 setter 역할을 하는 메소드의 이름도 의미 있게 만들어야 나중에 유지 보수하기 편하다고 생각한다.(물론 케바케)