협력하는 객체들의 공동체

나지은·2023년 7월 30일
0

🤓 객체지향의 사실과 오해 를 통해서 공부중입니다.

협력하는 사람들

요청과 응답으로 구성된 협력

하나의 문제를 해결하기 위해 다수의 사람 혹은 역할이 필요하기 때문에 일반적으로 한 사람에 대한 요청이 또 다른 사람에 대한 요청을 유발한다. 따라서 요청은 연쇄적으로 발생한다.

손님 -> (커피를 주문 / 커피 제공을 요청) -> 캐시어 -> (주문 내용이 기록된 컵을 전달 / 커피 제조를 요청) -> 바리스타

요청을 받으면 그 요청에 대해 응답을 한다. 요청이 연이어 발생하기 때문에 응답 또한 요청의 방향과 반대 방향으로 연쇄적으로 전달된다.

손님 <- (커피 제조가 완료되었음을 알림, 커피 전달 / 커피 제공 요청에 대한 응답) <- 캐시어 (커피 제조, 커피 전달 / 커피 제조 요청에 대한 응답) <- 바리스타

요청과 응답을 통해 다른 사람과 협력할 수 있는 능력은 인간으로 하여금 거대하고 복잡한 문제를 해결할 수 있는 공동체를 형성할 수 있게 만들며, 협력의 성공은 특정한 역할을 맡은 개인이 얼마나 요청을 성실히 이행하는가에 달렸다.

역할, 책임, 협력

사람들은 특정한 목표를 이루기 위해 서로 협력한다.
협력의 핵심은 특정한 책임을 수행하는 역할들 간의 연쇄적인 요청과 응답을 통해 목표를 달성한다는 것이다.
객체의 세계도 이와 유사하다. 객체 지향의 설계는 적절한 객체에게 적절한 책임을 할당하는 것에서 시작된다.
책임은 객체지향 설계의 품질을 결정하는 가장 중요한 요소이다.
책임이 불분명한 객체는 애플리케이셔의 미래를 불분명하게 만든다.
역할은 유연하고 재사용 가능한 협력 관계를 구축하는데 중요한 설계 요소이다.
객체의 역할은 다음과 같은 특징을 지닌다.

  • 여러 객체가 동일한 역할을 수행할 수 있다.

    어떤 객체가 역할을 수행했는지보다, 역할이 제대로 수행되었는지가 중요하다.
  • 역할은 대체 가능성을 의미한다.

    동일한 역할을 하는 두 객체가 있다면 요청자 입장에서 둘 중 누가 역할을 수행하는지는 중요하지 않다.
  • 각 객체는 책임을 수행하는 방법을 자율적으로 선택할 수 있다.

    동일한 요청에 대해 서로 다른 방식으로 응답할 수 있는 능력을 다형성이라고 한다.
  • 하나의 객체가 동시에 여러 역할을 수행할 수 있다.

다형성

다형성은 여러 가지 형태를 가질 수 있는 능력을 의미하며, 자바에서는 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함으로써 다형성을 구현한다.

협력 속에 사는 객체

객체는 협력적이어야 하며, 다른 객체의 요청에 귀 기울이고 다른 객체에게 적극적으로 도움을 요청할 수 있어야 한다.
또한 객체는 자율적어이야 한다. 객체는 공동의 목표를 달성하기 위해 협력하지만, 스스로의 결정에 의해 자율적으로 행동해야 한다.
요청에 응할 것인지, 어떤 방식으로 요청에 응답할지는 객체 스스로가 판단하고 결정해야 한다.

상태와 행동을 함께 지닌 자율적인 객체

객체가 자율적인 존재로 협력에 참여하기 위해 어떤 행동을 해야 한다면 그 행동을 하는 데 필요한 상태도 함께 지니고 있어야 한다.

public class Account {
  
  private Long balance;

  public void useBalance(Long amount) {
    if (amount > balance) {
      throw new AccountException(ErrorCode.AMOUNT_EXCEED_BALANCE);
    }
    balance -= amount;
  }
    }

객체의 자율성은 객체의 내부와 외부를 명확하게 구분하는 것으로부터 나온다. 객체의 사적인 부분은 객체 스스로 관리하고 외부에서 일체 간섭할 수 없도록 차단해야 하며, 객체의 외부에서는 접근이 허락된 수단을 통해서만 객체와 의사소통해야 한다.

public class Account {
  
  private Long balance;
  
  public void getBalance() {
    return this.balance;
  }
  
  public void setBalance(Long balance) {
    this.balance = balance;
  }
}

메서드와 자율성

객체는 협력을 위해 다른 객체에게 메시지를 전송하고 다른 객체로부터 메시지를 수신한다.
메시지를 수신하는 객체인 수신자는 수신된 메시지를 이해할 수 있는지 여부를 판단한 후 미리 정해진 자신만의 방법에 따라 메시지를 처리한다.
이처럼 객체가 수신된 메시지를 처리하는 방법을 메서드라고 부른다.

객체지향 프로그래밍 언어에서 메서드는 클래스 안에 포함된 함수 또는 프로시저를 통해 구현된다.
메시지를 수신한 객체가 실행 시간에 메시지에 대응되는 메서드를 선택할 수 있는데, 이는 다른 프로그래밍 언어와 객체지향 프로그래밍 언어를 구분짓는 핵심적인 특징 중 하나이다.

외부의 요청이 무엇인지 표현하는 메시지와 요청을 처리하기 위한 구체적인 방법인 메서드의 분리는 협력에 참여하는 객체들 간의 자율성을 높이는 핵심 메커니즘인데, 이는 캡슐화라는 개념과 관련되어 있다.

절차 지향 언어

프로시저 호출에 대한 실행 코드를 컴파일 시간에 결정한다.

캡술화

캡슐화는 클래스 안에 서로 연관있는 속성과 기능들을 하나의 캡슐로 만들어 데이터를 외부로부터 보호하는 것을 말한다.

객체 지향의 본질

  • 객체지향이란 시스템을 상호작용하는 자율적인 객체들의 공동체로 바라보고 객체를 이용해 시스템을 분할하는 방법이다.
  • 자율적인 객체란 상태와 행위를 함께 지니며 스스로 자기 자신을 책임지는 객체를 의미한다.
  • 객체는 시스템의 행위를 구현하기 위해 다른 객체와 협력한다. 각 객체는 협력 내에서 정해진 역할을 수행하며 역할은 관련된 책임의 집합이다.
  • 객체는 다른 객체와 협력하기 위해 메시지를 전송하고, 메시지를 수신한 객체는 메시지를 처리하는 데 적합한 메서드를 자율적으로 선택한다.

생각해 볼 내용

협력하는 객체들의 공동체(메시지를 주고받는 객체의 관점) vs 클래스로 구성된 설계도(코드를 담는 클래스의 관점)

profile
즐거움을 찾는 개발자🐯

0개의 댓글