Introduce

객체지향 목표는 실세계를 모방하는 것이 아닌 새로운 세계를 창조하는 것이며, 현실 세계를 은유하여 표현하는 것은 객체지향의 다양한 측면을 이해하고 학습하는 데 효과적이기 때문이다.

객체지향의 본질

  • 객체지향이란 시스템을 상호작용하는 자율적인 객체들의 공동체로 바라보고 객체를 이용해 시스템을 분할하는 방법

  • 자율적인 객체란 상태행위를 함께 지니며 스스로 자기 자신을 책임지는 객체를 의미

  • 객체는 시스템의 행위를 구현하기 위해 다른 객체와 협력하며, 각 객체는 협력 내에서 정해진 역할을 수행

  • 객체는 다른 객체와 협력하기 위해 메시지를 전송하고, 수신한 객체는 적합한 메서드를 사용해 메시지를 처리

클래스지향 X / 객체지향 O

  • 클래스는 객체지향 프로그래밍 언어의 관점에서는 매우 중요한 구성요소지만 핵심을 이루는 중심 개념은 아니다.

  • 지나치게 클래스를 강조하는 프로그래밍 관점은 객체의 캡슐화를 저해하고 클래스의 상호 의존성이 높아지게 된다.

  • 때문에 객체지향 설계를 하기 위해선 코드를 담는 클래스의 관점이 아닌 메시지를 주고받는 객체의 관점 사고가 필요하다.

  • 클래스는 객체들의 협력 관계를 코드로 옮기는 도구일 뿐이다.(하지만 클래스가 중요하지 않다는 것은 아님)

  • 객체들이 서로 어떤 메시지를 주고받을지를 먼저 결정하는 것이 중요하다.

-
오해
진실(핵심)

객체지향

클래스지향

적절한 책임을 수행하는 역할 간의 유현하고 견고한 협력 관계 구축

class

객체지향의 핵심

협력에 참여하는 객체를 만드는 데 필요한 구현 매커니즘 중 하나

클래스의 구조와 메서드가 아니라 객체의 역할/책임/협력에 집중하는 것이 중요하며, 클래스에 얽매이지 말고 객체를 지향하는 것이 중요하다.

객체

객체란 식별 가능한 개체 또는 사물이다. 객체는 자동차처럼 만질 수 있는 구체적인 사물일 수도 있고, 시간처럼 추상적인 개념일 수도 있다. 객체는 변경 가능한 상태(state), 특징적인 행동(behavior), 구별 가능한 식별자(identity) 를 가진다.

상태

상태를 이용하면 과거의 이벤트 내역을 알지 않아도 현재를 기반으로 객체의 행동 방식을 이해하고 결과를 쉽게 예측할 수 있게 된다.

상태와 프로퍼티

상태는 특정 시점에 객체가 가지고 있는 정보의 집합으로 객체의 구조적 특징을 표현하며 아래와 같이 구분할 수 있다.

  • 객체의 상태

    • 프로퍼티(property): 객체를 구성하는 모든 특징, 변경되지 않고 고정되기 때문에 정적이며 아래 두 가지 종류의 조합으로 표현

      • 링크(link): 객체와 객체 사이의 연결, 링크로 연결됐을 때 요청을 주고 받을 수 있음

      • 속성(attribute): 객체를 구성하는 단순한 값

    • 프로퍼티 값(property value): 시간이 흐름에 따라 이벤트에 의해 변경되기 때문에 동적인 특징을 가짐

행동

객체지향 세계에서 객체는 자율적이며 다른 객체의 상태에 직접적으로 접근할 수도 상태를 변경할 수 없어야 한다. 객체의 행동은 아래 두 가지로 구분할 수 있다.

  1. 객체 자신의 상태 변경

    • 객체의 행동은 상태에 영향을 받는다.

    • 상태는 객체의 행동에 의해 변경된다.

  2. 행동 내에서 협력하는 다른 객체에 대한 메시지 전송

    • 다른 객체와 협력하는 유일한 방법이다.

    • 수신한 객체는 요청을 처리하기 위해 행동한다.

    • 객체는 행동을 통해 다른 객체와의 협력에 참여하므로 행동은 외부에 가시적이어야 한다.

식별자

식별자란 객체를 식별하는 것은 객체를 서로 구별할 수 있는 특정한 프로퍼티를 의미하며, 모든 객체는 식별자를 가진다. 단순한 값의 경우 값의 상태가 변하지 않기 때문에 두 인스턴스 상태가 같으면 두 값을 같은 것으로 판단하며(동등성), 반대로 객체는 가변 상태를 갖고 있기 때문에 안의 상태가 모두 똑같더라도 두 객체는 별개의 객체로 인식하게 된다(동일성).

  • 동등성(equality): 두 값이 같은지 판단할 수 있는 성질

  • 동일성(identical): 상태와 무관하게 식별자 기반으로 객체를 같은지를 판단할 수 있는 성질

행동이 상태를 결정한다

객체지향에 입문할 때 쉽게 빠지는 함정은 상태를 중심으로 객체를 바라보는 것인데, 필요한 상태를 먼저 설계하고 그 후 행동을 고려한다면 설계에 나쁜 영향을 끼친다.

  1. 캡슐화 저해: 상태에 초점을 맞출 경우 상태가 객체 내부로 깔끔하게 캡슐화되지 못하고 공용 인터페이스에 노출 될 확률이 높아진다.

  2. 객체의 고립화: 객체가 필요한 이유는 애플리케이션 문맥 내에서 다른 객체와 협력하기 위함인데, 상태를 먼저 고려하면 협력이라는 문맥에서 벗어난 채 설게하게 되어 협력에 적합치 않은 객체를 생성하게 된다.

  3. 객체 재사용성 저하: 객체 재사용성은 다양한 협력에 참여할 수 있는 능력에서 나오는데, 상태 초점인 경우 다양한 협력이 어렵다.

객체는 다른 객체와 협력하기 위해 존재하며, 행동은 협력헤 참여하는 유일한 방법이므로 적절하게 설계하기 위해선 상태보단 행동을 먼저 고려해야한 후 상태를 설계해야한다.

참고자료

Last updated

Was this helpful?