객체들의 소통 방식

객체 지향 프로그래밍에서 객체들은 어떻게 소통할까?

객체들은 각자 주어진 역할이 있고 그 역할을 수행하기 위한 책임을 갖는다. 객체들이 역할을 성실히 수행하면 하나의 커다란 애플리케이션을 완성할 수 있다.

객체들이 역할을 성실하게 수행하기 위해서는 자신들만의 명확한 역할과 책임을 가져야 한다. 따라서 다른 역할과 책임을 갖는 객체에 의존적이지 않아야 한다. 또한 객체들은 서로가 필요할 때 서로에게 요구사항을 전달할 수 있어야 한다.

요구사항을 전달하는 것은 여러 단어로 말할 수 있을 것 같다.

어떻게 서로 소통하는지에 대한 생각은 잠시 미뤄두고, 무엇을 소통할 수 있는지 생각해보자.

인터페이스란?

위키백과에는 인터페이스를 다음과 같이 설명한다.

인터페이스는 서로 다른 두 개의 시스템, 장치 사이에서 정보나 신호를 주고받는 경우의 접점이나 경계면이다.

우리는 다음과 같이 바꿔보자.

인터페이스는 서로 다른 두 객체 사이에서 요청을 주고받는 접점이다.

인터페이스는 두 객체 사이의 접점이다. (두! 객! 체!)

(예전에 서른명 정도 앞에서 인터페이스에 대해 발표할 일이 있었다. 그때는 Java를 처음 공부할 때여서 다음과 같이 말했다. ‘서로 관련이 없는 클래스라도 인터페이스에 정의된 기능을 구현하고 싶으면 사용한다.’ 뭔가 껍데기만 있는 느낌이다.)

Java에서 인터페이스는 추상 메서드를 갖는다. 위의 정의를 바탕으로 추상 메서드는 다음처럼 설명할 수 있을 것 같다.

추상 메서드는 해당 인터페이스를 구현한 객체에게 무엇을 요청할 수 있는지를 나타낸다.

인터페이스 I를 구현한 객체 A에게 인터페이스 I를 구현하지 않은 어떤 객체 B가 요청을 보내기 위해서는 인터페이스 I만 알면 된다. 심지어 객체 A에 대한 구현 클래스도 몰라도 된다. 객체 지향 프로그래밍 측면에서는 모를수록 좋을 것이다.