🤓 객체지향의 사실과 오해 를 통해서 공부중입니다.
객체는 식별 가능한 개체 또는 사물이다. 객체는 구별 가능한 식별자, 특징적인 행동, 변경가능한 상태를 가진다. 소프트웨어 안에서 객체는 저장된 상태와 실행 가능한 코드를 통해 구현된다.
왜 상태가 필요한가
인간은 행동의 과정과 결과를 단순하게 기술하기 위해 상태라는 개념을 고안했다. 상태를 이용하면 과거의 모든 행동 이력을 설명하지 않고도 행동의 결과를 쉽게 예측하고 설명할 수 있다.
상태와 프로퍼티
객체의 상태는 특정 시점에 객체가 가지고 있는 단순한 값과 객체의 조합으로 표현할 수 있다. 객체의 상태를 구성하는 모든 특징을 객체의 프로퍼티라고 한다. 일반적으로 프로퍼티는 변경되지 않고 고정되기 때문에 정적이다. 반면에 프로퍼티 값은 시간이 흐름에 따라 변하기 때문에 동적이다.
객체의 프로퍼티는 다른 객체를 가리키는 링크와 단순한 값인 속성, 두 종류의 조합으로 표현할 수 있다. 객체와 객체 사이의 의미있는 연결을 링크라고 하며, 객체의 링크를 통해서만 객체와 객체 사이에 메시지를 주고 받을 수 있다. 링크는 객체가 다른 객체를 참조할 수 있다는 것을 의미하며, 일반적으로 한 객체가 다른 객체의 식별자를 알고 있는 것으로 표현된다. 객체 간의 연결을 표현하는 링크와 달리, 객체를 구성하는 단순한 값은 속성이라고 한다.
상태와 행동
객체가 취하는 행동은 객체 자신의 상태를 변경시킨다. 객체의 행동동에 의해 객체의 상태가 변경된다는 것은 객체의 행동이 부수 효과를 초래한다는 것을 의미한다. 예를 들어 앨리스(객체)가 케이크를 먹는 행위는 앨리스의 키(상태)를 작게 변화 시키고 케이크의 양(상태)을 줄이는 부수 효과를 야기한다. 이처럼 객체의 행동은 객체의 상태를 변경시키지만, 행동의 결과는 객체의 상태에 의존적이다.
협력과 행동
객체는 다른 객체와 적극적으로 상호작용하며 협력하는 객체들의 공동체에 참여하기 위해 노력한다. 객체는 다른 객체에게 요청을 보냄으로써 다른 객체와 협력할 수 있다. 요청을 수신한 객체는 해당 요청을 처리하기 위해 적절한 방법에 따라 행동한다.
그 결과 자신의 상태를 변경한다. 즉, 객체는 협력에 참여하는 과정에서 자신의 상태뿐 아니라, 다른 객체의 상태 변경을 유발할 수 있다.
상태 캡슐화
객체는 상태를 캡슐 안에 감춰둔 채 외부로 노출하지 않는다. 객체가 외부에 노출하는 것은 행동뿐이며, 외부에서 객체에 접근할 수 있는 유일한 방법 역시 행동 뿐이다. 이처럼 외부로부터 전달된 메시지가 객체의 행동을 유발하지만, 객체의 상태를 변경할지 여부는 객체 스스로 결정한다. 메시지를 전달하는 외부의 객체는 메시지를 수신하는 객체의 상태가 변경된다는 사실조차 알지 못한다. 상태를 외부에 노출시키지 않고 캡슐화하는 것은 객체의 자율성을 높이며, 객체의 자율성이 높아질수록 객체 스스로 판단하고 스스로 결정하기 때문에 객체의 지능도 높아진다. 협력에 참여하는 객체들의 지능이 높아질수록 협력은 유연하고 간결해진다.
객체가 식별 가능하다는 것은 객체를 서로 구별할 수 있는 특정 프로퍼티가 객체 안에 존재한다는 것을 의미하며, 이 프로퍼티를 식별자라고 한다. 모든 객체는 식별자를 갖는다.
객체는 식별자를 기반으로 객체가 같은지 판단하는데, 이와 같은 성질을 동일성(identical)이라고 한다. 타입이 같은 두 객체의 상태가 완전히 똑같더라고, 식별자가 다르다면 두 객체는 독립적인 별개의 객체로 다뤄야 한다. 이와 달리 값은 식별자를 가지지 않는다. 값은 상태가 변하지 않기 때문에, 두 값의 상태가 같다면 두 값을 같은 것으로 판단한다. 이 처럼 상태를 이용해 두 값이 같은지 판단하는 성질을 동등성(equality)이라고 한다. 객체는 상태를 기반으로 동일성을 판단할 수 없는데, 그 이유는 시간이 흐름에 따라 객체의 상태가 변하기 때문이다.
객체에게 필요한 상태가 무엇인지를 찾고, 그 후에 상태를 변경하거나 조회할 수 있는 행동이 무엇인지 결정하는 방법은 설계에 나쁜 영향을 끼친다. 객체는 다른 객체와 협력하기 위해 존재하며, 객체의 행동은 객체가 협력에 참여하는 유일한 방법이다. 따라서 객체가 적합한지를 결정하는 것은 그 객체의 상태가 아니라 행동이다.
협력 안에서 객체의 행동은 객체가 협력에 참여하면서 완수해야하는 책임을 의미한다. 책임 주도 설계는 협력이라는 문맥 안에서 객체의 행동을 생각하도록 도움으로써 응집도 높고 재사용 가능한 객체를 만들 수 있게 한다.
객체지향을 현실 세계의 모방이라고 보는 관점은 객체지향 분석과 설계를 현실 세계에 존재하는 다양한 객체를 모방한 후, 필요한 부분만 취해 소프트웨어 객체로 구현하는 과정이라고 설명한다. 흔히 객체지향을 현실세계의 추상화라고도 하는데, 그 안에는 현실 세계를 모방해서 단순화한다는 의미가 숨어있다. 추상화란 실제의 사물에서 자신이 원하는 특성만 취하고 필요없는 부분을 추려 핵심만 표현하는 행위를 말한다. 그러나 소프트웨어안에 구현된 객체는 실제 세계의 객체와는 전혀 다른 양상을 띈다. 소프트웨어 객체는 실제 세계의 객체가 못하는 행등을 스스로 수행할 수 있다. 따라서 모방과 추상화라는 개념만으로 소프트웨어 객체와 현실 객체 사이의 관계를 설명하기는 어렵다.
소프트웨어 객체와 현실 속 객체의 가장 큰 차이점은 현실 속에서는 수동적인 존재가 소프트웨어로 구현될 때는 능동적으로 변한다는 것이다. 현실 속 객체는 인간이라는 에이전트 없이는 스스로 행동하지 않는다. 어떤 사건이 일어나기 위해서는 인간 에이전트가 반드시 필요하다. 하지만 소프트웨어 객체는 객체 자체가 자신의 체계 안에서 능동적이고 자율적인 에이전트이다. 현실 속 트럼프 카드는 스스로 뒤집을 수 없으며, 전화기는 스스로 통화 버튼을 누를 수 없다. 하지만 소프트웨어 객체는 이 것들을 자율적으로 행동할지를 결정한다. 이처럼 현실의 객체보다 더 많은 일을 할 수 있는 소프트웨어 객체의 특징을 의인화라고 한다.
은유란 실제로는 적용되지 않는 한 가지 개념을 이용해 다른 개념을 서술하는 대화의 한 형태이다. 은유의 본질은 한 종류의 사물을 다른 종류의 사물 관점에서 이해하고 경험하는 데 있다. 현실 속의 객체의 의미 일부가 소프트 웨어 객체로 전달되기 때문에, 프로그램 내의 객체는 현실 속의 객체에 대한 은유라고 할 수 있다. 은유 관계에 있는 실제 객체의 이름을 소프트웨어 객체의 이름으로 사용하면, 소프트웨어에 대해 사람들이 생각하는 모습과 실제 소프트웨어의 표현 사이의 차이를 줄여 소프트웨어의 구조를 쉽게 예측할 수 있다.
데이터 주도 설계와 책임 주도 설계
감사합니다. 이런 정보를 나눠주셔서 좋아요.