본문 바로가기

Study/오프젝트

14) 일관성 있는 협력

객체는 협력을 위해 존재한다. 협력은 객체가 존재하는 이유와 문맥을 제공한다. 객체지향 패러다임의 장점은 설계를 ㅠ할 수 있다는 것이다. 재사용을 위해서는 객체들의 협력 방식을 일관성 있게 만들어 야한다.

 

비일관성은 두 가지 상황에서 발목을 잡는다. 하나는 새로운 구현을 추가해야 하는 상황이고, 또 다른 하나는 기존의 구현을 이해해야 하는 상황이다. 유사한 요구사항이 서로 다른 방식으로 구현돼 있다면 요구사항이 유사하다는 사실 자체도 의심하게 될 것이다. 따라서 유사한 기능을 서로 다른 방식으로 구현해서는 안 된다는 것이다.

 

유사한 기능은 유사한 방식으로 구현해야 한다. 객체지향에서 기능을 구현하는 유일한 방법은 객체 사이의 협력을 만드는 것뿐이므로 유지보수 가능한 시스템을 구축하는 첫걸음은 협력을 일관성 있게 만드는 것이다.

 

설계에 일관성 부여하기

일관성 있는 설계를 위한 두 가지의 조언을 살펴보자. 첫째는 다양한 설계 경험을 익히는 것이다. 두번째는 널리 알려진 디자인 패턴을 학습하고 변경이라는 문맥 안에서 디자인 패턴을 적용해 보는 것이다. 여기서 디자인 패턴은 다음 장에서 알아보도록 하자. 협력을 일관성 있게 만들기 위해 다음과 같은 기본 지침을 따르는 것이 도움이 될 것이다.

  • 변하는 개념을 변하지 않는 개념으로부터 분리하라.
  • 변하는 개념을 캡슐화하라.

변하는 부분을 따로 뽑아서 캡슐화하면 나중에 바뀌지 않는 부분에는 영향을 미치지 않은채로 그 부분만 수정하거나 확장할 수 있다. 객체지향에서 변경을 다루는 전통적인 방법은 조건 로직을 객체 사이의 이동으로 바꾸는 것(다형성)이다. 객체지향적인 코드는 조건을 판단하지 않는다. 단지 다음 객체로 이동할 뿐이다.

 

캡슐화

캡슐화란 변하는 어떤 것이든 감추는 것이다.

 

대부분 객체의 캡슐화에 관한 이야기를 들으면 데이터 은닉을 떠올린다. 데이터 은닉이란 외부에 공개된 메서드를 통해서만 객체의 내부에 접근할 수 있게 제한함으로써 객체 내부의 상태 구현을 숨기는 기법을 가리킨다.

 

캡슐화의 가장 대표적인 예는 객체의 퍼블릭 인터페이스와 구현을 분리하는 것이다. 자주 변경되는 내부 구현을 퍼블릭 인터페이스 뒤로 숨겨야 한다. 강조하지만 캡슐화란 단순히 데이터를 감추는 것이 아닌 소프트웨어 안에서 변할 수 있는 어떤'개념'이라도 감추는 것이다.

  • 데이터 캡슐화 : 데이터 캡슐화는 클래스의 내부 데이터를 외부에서 직접 접근하지 못하도록 하고, 대신 해당 데이터를 조작할 수 있는 메서드를 제공하는 것
  • 메서드 캡슐화 : 클래스 외부에서는 메서드를  직접 접근할 수 없고 클래스 내부와 서브클래스에서만 접근이 가능하도록 하는 것 (protected)
  • 객체 캡슐화 : 객체와 객체 사이의 관계를 캡슐화하는 것. (합성)
  • 서브타입 캡슐화 : 슈퍼타입의 구현을 서브타입에서 숨기는 것

일반적으로 데이터 캡슐화메서드 캡슐화개별 객체에 대한 변경을 관리하기 위해 사용하고 객체 캡슐화서브타입 캡슐화협력에 참여하는 객체들의 관계에 대한 변경을 관리하기 위해 사용된다.

'Study > 오프젝트' 카테고리의 다른 글

부록 A) 계약에 의한 설계  (0) 2024.02.01
12) 다형성  (1) 2024.01.25
11) 합성과 유연한 설계  (0) 2024.01.17
10) 상속과 코드 재사용  (0) 2024.01.10
09) 유연한 설계  (1) 2024.01.06