객체지향 패러다임

  • [[OOP-to-me-Alan-Kay]]{앨런 케이의 심플한 OOP 정의}

객체지향 패러다임의 관점에서 핵심은 역할(role), 책임(responsibility), 협력(collaboration)이다.

– 오브젝트. 03장. 73쪽.

이처럼 객체들이 애플리케이션의 기능을 구현하기 위해 수행하는 상호작용을 협력이라고 한다. 객체가 협력에 참여하기 위해 수행하는 로직은 책임이라고 부른다. 객체들이 협력 안에서 수행하는 책임들이 모여 객체가 수행하는 역할을 구성한다.

– 오브젝트. 03장. 75쪽.

결합도(coupling)

객체 사이의 의존성이 과한 경우를 가리켜 결합도(coupling)가 높다고 말한다. 반대로 객체들이 합리적인 수준으로 의존할 경우에는 결합도가 낮다고 말한다. 결합도는 의존성과 관련돼 있기 때문에 결합도 역시 변경과 관련이 있다. 두 객체 사이의 결합도가 높으면 높을수록 함께 변경될 확률도 높아지기 때문에 변경하기 어려워진다. 따라서 설계의 목표는 객체 사이의 결합도를 낮춰 변경이 용이한 설계를 만드는 것이어야 한다.

– 오브젝트. 01장. 17쪽.

다형성

다형성은 객체지향 프로그램의 컴파일 시간 의존성과 실행 시간 의존성이 다를 수 있다는 사실을 기반으로 한다.

– 오브젝트. 02장. 63쪽.

다형성이란 동일한 메시지를 수신했을 때 객체의 타입에 따라 다르게 응답할 수 있는 능력을 의미한다. 따라서 다형적인 협력에 참여하는 객체들은 모두 같은 메시지를 이해할 수 있어야 한다.

– 오브젝트. 02장. 63쪽.

지연 바인딩(lazy binding), 동적 바인딩(dynamic binding)

다형성을 구현하는 방법은 매우 다양하지만 메시지에 응답하기 위해 실행될 메서드를 컴파일 시점이 아닌 실행 시점에 결정한다는 공통점이 있다. 다시 말해 메시지와 메서드를 실행 시점에 바인딩한다는 것이다. 이를 지연 바인딩(lazy binding) 또는 동적 바인딩(dynamic binding)이라고 부른다. 그에 반해 전통적인 함수 호출처럼 컴파일 시점에 실행될 함수나 프로시저를 결정하는 것을 초기 바인딩(early binding) 또는 정적 바인딩(static binding)이라고 부른다. 객체지향이 컴파일 시점의 의존성과 실행 시점의 의존성을 분리하고, 하나의 메시지를 선택적으로 서로 다른 메서드에 연결할 수 있는 이유가 바로 지연 바인딩이라는 메커니즘을 사용하기 때문이다.

– 오브젝트. 02장. 63쪽.

응집도(cohesion)

밀접하게 연관된 작업만을 수행하고 연관성 없는 작업은 다른 객체에게 위임하는 객체를 가리켜 응집도(cohesion)가 높다고 말한다. 자신의 데이터를 스스로 처리하는 자율적인 객체를 만들면 결합도를 낮출 수 있을뿐더러 응집도를 높일 수 있다.

– 오브젝트. 01장. 26쪽.

의인화(anthropomorphism)

비록 현실에서는 수동적인 존재라고 하더라도 일단 객체지향의 세계에 들어오면 모든 것이 능동적이고 자율적인 존재로 바뀐다. 레베카 워프스브록(Rebecca Wirfs-Brock)은 이처럼 능동적이고 자율적인 존재로 소프트웨어 객체를 설계하는 원칙을 가리켜 의인화(anthropomorphism)라고 부른다.

– 오브젝트. 01장. 34쪽.

책임

그런데 여기서 다루는 모든 주제 중에서 실용적인 기술 한 가지를 선택해야 한다면 그것은 무엇일까?

"객체지향 개발에서 중요한 능력은 책임을 능숙하게 소프트웨어 객체에 할당하는 것이다."

그 이유는 무엇인가? 책임을 할당하는 것은 UML 다이어그램을 그리거나 프로그래밍을 하는 동안 수행되어야 할 활동이면서 소프트웨어 컴포넌트의 견고성, 유지보수성, 재사용성에 크게 영향을 주기 때문이다.

물론 OOA/D의 다른 기술들도 중요하지만, 여기서 책임 할당을 강조하는 이유는 많은 "자율적인 판단의 정도(degrees of freedom)"나 대안들을 가지고 습득해야 할 어려운 기술이고 너무 중요하기 때문이다. 실제 프로젝트에서 개발자는 코드를 작성하면서 개발에 관련된 다른 활동들은 수행하지 않을 수도 있다. 그러나 그 상황에서도 책임 할당은 꼭 해야 하는 활동이다.

– UML과 패턴의 적용. 1장. 34쪽.

즉, 객체의 책임은 객체가 '무엇을 알고 있는가'와 '무엇을 할 수 있는가'로 구성된다.

– 오브젝트. 03장. 78쪽.

  • 하는 것
    • 객체를 생성하거나 계산을 수행하는 등의 스스로 하는 것
    • 다른 객체의 행동을 시작시키는 것
    • 다른 객체의 활동을 제어하고 조절하는 것
  • 아는 것
    • 사적인 정보에 관해 아는 것
    • 관련된 객체에 관해 아는 것
    • 자신이 유도하거나 계산할 수 있는 것에 관해 아는 것

– 오브젝트. 03장. 78쪽.

합성(composition)

합성은 다른 객체의 인스턴스를 자신의 인스턴스 변수로 포함해서 재사용하는 방법을 말한다.

– 오브젝트. 02장. 70쪽.

상속

상속의 목적은 코드 재사용이 아니다. 상속은 타입 계층을 구조화하기 위해 사용해야 한다. 뒤에서 살펴보겠지만 타입 계층은 객체지향 프로그래밍의 중요한 특성 중 하나인 다형성의 기반을 제공한다.

– 오브젝트. 12장. 389쪽.

참고문헌

  • UML과 패턴의 적용 [3판] / Craig Larman 저 / 김수동 역 / 홍릉과학출판사 / 2005년 12월 10일 3판 1쇄
  • 오브젝트 / 조영호 저 / 위키북스 / 2쇄 2019년 07월 17일

주석