Study/오브젝트

왜 캡슐화를 지켜야 하는가?

voider 2021. 11. 7. 21:59

'상태'와 '행동'을 하나의 객체로 모으는 이유는 객체 내부 구현을 외부로부터 감추기 위해서다. 여기서 구현이란, 나중에 변경될 가능성이 높은 어떤 것을 가리킨다. 객체지향이 강력한 이유는 한 곳에서 일어난 변경이 전체 시스템에 영향을 끼치지 않도록 파급효과를 적절하게 조절할 수 있는 장치를 제공하기 때문이다. 객체를 사용하면 변경 가능성이 높은 부분은 내부에 숨기고, 외부에는 상대적으로 안정적인 부분만 공개함으로써 변경의 여파를 통제할 수 있다.

변경될 가능성이 높은 부분을 구현이라고 부르고, 상대적으로 안정적인 부분을 인터페이스라고 부른다. 객체 설계는 변경 정도에 따라 구현과 인터페이스를 분리하고 외부에서는 인터페이스만 의존하도록 해야 한다. 이것이 캡슐화다.

캡슐화의 정도가 응집도와 결합도에 영향을 미친다. 캡슐화를 지키면 모듈 안의 응집도가 높아지고, 모듈 사이의 결합도는 낮아진다. 캡슐화를 위반하면 모듈 안의 응집도는 낮아지고 모듈 사이의 결합도는 높아진다.

응집도와 결합도

응집도는 모듈에 포함된 내부 요소들이 얼마나 연관되어 있는지 그 정도를 나타낸다. 모듈 내 요소들이 하나의 목적을 위해 긴밀하게 협력한다면 그 모듈은 높은 응집도를 가진다. 모듈 내의 요소들이 서로 다른 목적을 추구한다면 그 모듈은 낮은 응집도를 가진다. 객체지향 관점에서 응집도는 객체 또는 클래스에 얼마나 관련 높은 책임을 할당했는지 나타낸다.

결합도는 의존성 정도를 나타낸다. 의존성 정도는 다른 모듈에 대해 얼마나 많은 것을 알고 있는지를 나타낸다. 어떤 모듈이 다른 모듈에 대해 너무 자세한 부분까지 알고 있다면 두 모듈은 높은 결합도를 가진다. 어떤 모듈이 다른 모듈에 대해 꼭 필요한 정보만 알고 있다면 두 모듈은 낮은 결합도를 가진다. 객체지향 관점에서 결합도는 객체 또는 클래스가 협력에 필요한 적절한 수준의 관계만을 유지하고 있는지 나타낸다.

문제는 이 설명이 애매하다는 것이다. 얼마큼 연관 되어야 응집도가 높은 것인지, 얼만큼 알아야 결합도가 낮은 것인지.

높은 응집도와 낮은 결합도를 가진 설계를 추구해야 하는 이유는 소프트웨어를 변경하기 쉽게 만들기 위해서다. 변경의 관점에서 응집도란 변경이 발생할 때 모듈 내부에서 발생하는 변경의 정도로 측정할 수 있다.

결합도 역시 변경의 관점에서 설명할 수 있다. 결합도는 한 모듈이 변경되기 위해서 다른 모듈의 변경을 요구하는 정도로 측정할 수 있다. 다시 말해 하나의 모듈을 수정할 때 얼마나 많은 모듈을 함께 수정해야 하는가? 많다면 결합도가 높은 것이므로 잘못된 설계라고 할 수 있다.

📌 캡슐화는 단순히 객체 내부의 데이터를 외부로부터 감추는 것만을 의미하지 않는다. 진정한 캡슐화는 변경될 수 있는 어떤 것이라도 감춘다. 내부 속성을 외부로부터 감추는 것은 '데이터 캡슐화'라는 캡슐화의 한 종류일 뿐이다. 캡슐화는 구현과 관련된 모든 것을 감춘다.