객체의 구성요소
지난 글에서는 객체지향의 의미와 객체의 성질에 대해 살펴보았다. 객체는 각자 역할과 책임을 가지고 있는 능동적인 존재이며, 서로 메시지를 통해 상호작용하며 협력한다고 했다. 그렇다면 이제는 객체가 구체적으로 어떻게 구성되어 있는지 살펴볼 차례이다.
상태
먼저, 각 객체는 내부적으로 상태를 저장한다. 객체가 다른 객체로부터 요청을 받으면 상태에 따라 처리가 달라진다. 예를 들어, 3만원짜리 상품을 주문할 때 계좌의 잔고가 충분하다면 성공적으로 주문이 되겠지만, 잔고가 2만원밖에 없다면 주문이 완료되지 못할 것이다.
이렇게 객체가 상태를 저장하고 있으면 과거에 어떤 일이 있었는지 하나하나 기록해 둘 필요가 없다. 과거에 컴퓨터를 샀든, 책을 샀든, 갈비찜을 샀든 중요한 것은 현재의 상태, 즉 가지고 있는 돈의 액수이기 때문이다.
객체가 저장하고 있는 상태들을 프로퍼티(property)라고 한다. 은행 계좌를 예시로 들면, 계좌의 잔고 뿐만 아니라 계좌를 개설한 은행, 계좌의 주인, 계좌번호, 비밀번호 등이 프로퍼티에 해당한다. 중요한 것은 각 프로퍼티의 값은 달라질 수 있지만, 프로퍼티 자체는 변하지 않는다는 것이다. 즉, 은행 계좌라는 객체를 설계할 때 계좌번호를 프로퍼티로 갖도록 설계했다면, 모든 객체들은 계좌번호를 가져야 한다는 것이다.
프로퍼티는 숫자나 문자열 등의 단순한 값일 수도 있지만, 다른 객체를 프로퍼티로 갖기도 한다. 객체가 가지는 단순한 값을 속성(attribute)라고 하고, 다른 객체는 링크(link)를 통해 연결된다.
행동
객체는 자신의 역할과 책임을 다하기 위해 다양한 행동을 할 수 있다. 은행 계좌 객체는 계좌 잔액에 따라 이자를 계산해서 지급하거나, 자동이체를 등록할 수도 있고, 계좌이체를 할 수도 있다. 이러한 행동들은 다른 객체에 의해 실행되기 때문에 수동적으로 보이지만, 모든 객체는 외부의 요청을 자신의 상태에 따라 다양한 로직으로 동작할 수 있기 때문에 능동적이다.
다른 객체는 객체 내부의 상태를 알 수 없으며, 메시지를 통해 요청만 할 뿐이다. 다른 객체의 상태를 미리 알고 행동을 결정하는 것은 역할과 책임이 잘 나누어지지 않았다는 뜻이다. 역할과 책임이 잘 나누어지면 객체들은 메시지를 통해 다른 객체의 행동을 유발한다. 이렇게 서로의 상태를 알지 못하고, 메시지를 통해 협력하는 것을 캡슐화라고 한다.
객체의 행동은 객체의 상태를 변화시키는 부수 효과(side effect)를 낳는다. 계좌이체를 하면 잔고가 줄어드는 것처럼 말이다. 반대로, 객체의 상태를 변화시키는 것은 오로지 객체의 행동을 통해서만 가능하다. 따라서 객체의 상태와 행동은 서로 의존적인 관계에 있다.
식별자
객체는 상태와 행동을 가진다고 했다. 그렇다면 같은 역할을 가진 두 객체가 우연히 똑같은 상태를 가지게 된다면 두 객체는 동일한 객체일까? 당연히 그렇지 않다. 똑같은 만 원짜리 지폐도 자세히 보면 일련번호가 다르다. 만 원으로 할 수 있는 일은 똑같지만, 두 장의 지폐는 분명히 구분이 된다. 이렇게 객체들을 구분할 수 있는 프로퍼티를 식별자(identifier)라고 한다.
식별자는 모든 객체가 다른 값을 가져야 한다. 이 식별자를 통해 객체가 같은지를 구분할 수 있고, 이러한 성질을 동일성(identity)이라고 한다. 만약 식별자가 변경이 가능하다면 두 객체의 식별자가 같은 경우가 발생할 수 있다. 따라서 식별자는 변경이 불가능한 값이어야 한다.
식별자가 다르지만, 다른 상태는 모두 같은 경우도 의미가 있다. 위 예시처럼 두 장의 지폐는 다른 객체지만 지폐의 가치는 동일하다. 이렇게 서로 다른 두 객체의 상태가 동일한 것을 동등성(equality)하다고 한다.
정리
정리하자면, 객체는 단순한 값을 저장하는 '속성'과 다른 객체에 대한 참조를 저장하는 '링크'를 통해 현재 상태를 저장한다. 또, 객체는 자신의 역할과 책임을 수행하기 위한 행동을 정의한다. 행동은 상태에 따라 달라질 수 있고, 상태는 행동을 통해서만 변경이 가능하다. 상태와 행동이 같은 객체는 여러개 존재할 수 있지만, 각각을 구분하기 위해 식별자를 가진다. 식별자가 같은 객체는 동일하며, 식별자가 다르지만 상태가 같은 두 객체는 동등하다고 표현한다.
3줄 요약
- 객체는 단순한 값과 다른 객체를 상태로 갖는다
- 객체는 행동을 통해 자신의 역할을 수행할 수 있다
- 상태는 행동에 의해 변경되고, 행동은 상태에 따라 달라질 수 있다
'Programming > 객체지향의 사실과 오해' 카테고리의 다른 글
[Programming] 객체지향의 사실과 오해(6) - 기능과 구조 (0) | 2023.05.30 |
---|---|
[Programming] 객체지향의 사실과 오해(5) - 메소드와 인터페이스 (0) | 2023.05.25 |
[Programming] 객체지향의 사실과 오해(4) - 객체지향 설계 기법 (0) | 2023.05.21 |
[Programming] 객체지향의 사실과 오해(3) - 추상화 (0) | 2023.05.18 |
[Programming] 객체지향의 사실과 오해(1) - 객체지향 (0) | 2023.05.07 |