티스토리 뷰

클래스를 만드는 사고방식과 원칙을 알아보자. 원칙은 참고로 삼고 너무 집착하지는 말자.

캡슐화, 응집도, 결합도

캡슐화, 응집도, 결합도는 보수성이 높은 클래스를 설계하는데 사용하는 기본 요소이다. 이 3가지를 의식하기만 해도 코드 품질은 매우 좋아진다.

캡슐화

객체 내부의 변수 또는 구현 상세를 사용자로부터 은폐하는 것을 캡슐화라고 한다. 클래스 사용자 입장에서 클래스가 어떤 멤버 변수를 가지며 어떤 방식으로 구현되는지 다 알 필요가 없다. 사용자에게는 꼭 필요한 부분만 제공하는 것이 좋다. 부모-자식 관계라도 꼭 필요한 부분만 protect로 하고 나머지는 private가 좋다.

추상 인터페이스를 사용하면 좋은 캡슐화를 실현할 수 있다. 추상 인터페이스란 순수 가상 함수만으로 구성된 추상 클래스를 의미한다. 따라서 함수의 구현 또는 멤버 변수등이 없다. 오직 사용자에게 인터페이스만 제공하게 된다.

class Drawable {
public:
    virtual ~Drawable() {} // 순수 소멸자
    virtual void draw(Renderer& renderer) = 0; // 순수 가상 함수
};

추상 인터페이스 사용자는 구현하는 클래스의 상세를 완전히 은폐할 수 있으므로 캐슐화가 가능하다. 캡슐 내에 변경이 발생해도 캡슐 밖에는 영향을 주지 않아서 변경에 의한 영향 범위를 최소화할 수 있다. 캡슐화의 목적은 다음과 같다.

  • 객체 내부의 상태를 보호
  • 객체의 구현 상세를 은폐

캡슐화를 통해서 클래스 내부 구조를 신경 쓰지 않아도 사용자가 쉽게 사용할 수 있는 클래스를 만드는 것이 중요하다.

응집도

응집도(cohesion)란 클래스가 하나의 역할에 얼마나 집중하는지를 나타내는 척도이다. 크고 복잡한데다 여러 역할을 수행하는 클래스는 응집도가 낮다고 한다. 예를 들어 Game클래스는 득점 계산, 제한 시간 제어, 캐릭터 관리라는 3가지 역할을 모두 담당한다면 응집도는 매우 낮다고 할 수 있다. Game클래스의 응집도를 높이려면 득점 계산, 제한 시간 제어, 캐릭터 관리라는 역할을 서로 다른 클래스에 이양해야 한다. 이렇게 하면 Game클래스는 다른 클래스 제어 역할이라는 하나의 역할에 집중할 수 있다. 따라서 응집도가 높아진다. 일반적으로 멤버 변수가 많으면 클래스가 여러 역할을 수행해야 하므로 응집도가 낮아진다. 반면 멤버 변수가 1개라면 하나의 역할에 집중할 수 있으므로 응집도가 높아진다.

결합도

경합도(coupling)란 다른 클래스와의 연관 정도를 나타내는 척도이다. 다른 클래스와 전현 관련이 없고 완전히 독립적인 클래스라면 결합도가 낮은 것이다. 반대로 많은 클래스와 관련되어 독립성이 낮다면 결합도가 높은 것이다. 클래스는 가능한 서로 영향을 주지 않는 것이 좋습니다. 결합이 낮으면 외부 변경에 영향을 받지 않으며, 재사용, 테스트가 간편한다.

상속과 이양의 관계

상속보다 이양을 사용하는 편이 설계 측면에서 유연하다. 상속 관계에서 부모 클래스를 변경하면 자식클래스까지 영향이 미친다. 설계의 유연성과 보수성 관계에서 이양이 훨씬 좋다. 상속 관계는 컴파일 때 결합하지만, 이양은 실행 중에도 결합할 수 있다. 또한 이양은 재사용성이 높다.

기능 상속과 추상 인터페이스 구현

C++에서는 기능 상속과 추상 인터페이스 구현을 문법적으로 구별하지 않는다. 상속은 부모 클래스로부터 기능 상속을 의미하지만, 추상 인터페이스는 역할 구현을 의미한다. 따라서 추상과 인터페이스는 서로 다른 개념으로 생각해야 한다. C++은 다중상속이 가능하지만 JAVA나 C#은 단일 상속에 다중 인터페이스 구현이 가능하다. 그 이유는 다중상속의 복잡성 때문에 오류가 발생할 확률이 높기 때문이다. 그래서 C++에서도 단일 상속에 다중 인터페이스 구현을 이용하자.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함