본문 바로가기
Concepts/객체지향

객체지향의 사실과 오해 - 인터페이스

by ocwokocw 2021. 8. 24.

- 이 글은 조영호의 객체지향의 사실과 오해를 기반으로 작성되었습니다. (가능하면 꼭 읽어보는것을 추천드립니다.)

- 인터페이스

인터페이스에는 3 가지 특징이있다. 우선 사용법만 익히면 내부 구조나 동작방식을 몰라도 된다. 또한 내부 구조나 동작방식을 바꾸더라도 사용자에게 영향을 미치지 않는다. 그리고 인터페이스를 변경하지 않으면 사용자와 의사소통에 전혀 문제가 없다는것이다.

 

앞에서 우리는 메시지의 중요성을 재차 강조했었다. 객체가 다른 객체와 상호작용할 수 있는 유일한 방법은 메시지를 주고 받는것이기 때문에 인터페이스란 객체가 수신할 수 있는 메시지의 목록이라고 할 수 있다.


- 책임, 메시지, 인터페이스

여태까지 살펴본 책임, 메시지, 인터페이스를 잠시 정리하는 시간을 가져보자.

 

맨 먼저 객체의 자율성을 강조했었다. 협력에 참여하는 객체는 자율적으로 판단해 스스로 책임을 수행하는 방법을 결정할 수 있어야 한다.

 

그 다음 다른 객체와 소통하는 메시지에 관해 살펴보았다. 어떤 객체가 메시지를 수신받을 수 있다면 책임을 수행할 수 있다는 말이 되고 이런 메시지의 목록이 인터페이스가 된다. 메소드의 개념도 있었는데 메소드란 메시지를 수신했을 때 책임을 수행할 수 있는 방법을 의미한다. 메시지와 메소드는 객체의 내부와 외부로 영역을 구분하여 다형성이라는 성질을 가질 수 있게 한다.

 

그리고 인터페이스라는 개념도 알아보았다. 인터페이스는 다른 객체와 협력할 수 있는 접점이다. 메시지로 구성된 공용 인터페이스는 외부와 내부를 명확하게 구분해준다.


- 인터페이스의 구현과 분리

객체지향적인 사고방식에는 중요한 3 가지 원칙이 있다.

  • 좀 더 추상적인 인터페이스
  • 최소 인터페이스
  • 인터페이스와 구현간의 차이

추상적인 인터페이스는 왕과 모자장수의 예제에서 살펴보았었다. 왕이 모자장수에게 증언하라고 명령했을 때 '시간 순서대로'나 '말로 표현해서' 라는 너무 상세한 수준의 지시를 하면 객체의 자율성을 저해한다. 협력에서 객체가 역할에 대한 책임을 수행할 수 있으면서 충분히 추상적인 '증언하라' 정도가 적절하다.

 

최소 인터페이스는 외부에 노출할 필요가 없는 메시지는 노출하지 말라는것이다. 이를 달성하려면 메시지를 먼저 설계한 후 이에 적절한 객체를 할당하는 책임-주도 설계, What/Who 사이클을 따라야 한다.

 

마지막으로 인터페이스와 구현간의 차이의 원칙은 객체의 외부와 내부를 분리하는것이 중요하다는것이다.

 

구현은 객체지향에서 내부의 동작을 가리키는 용어이다. 그래서 Java 에서 인터페이스를 구현할 때 implements 라는 예약어가 쓰인다. 객체는 상태를 갖는데 이 상태는 외부에 해당하지 않는다. 그래서 인터페이스에 상태를 표현하지 않으며, 내부 구현에 상태를 표현한다. 또한 객체는 메시지를 수신할 때 특정한 행동을 한다. 이때 처리하는 방법을 메소드라고 한다. 메소드 역시 외부가 아닌 내부에 해당한다.

 

인터페이스와 구현을 분리하는것은 중요하다. 인터페이스를 통해서 구현의 메소드를 호출하던 구현의 메소드를 직접 호출하던 어차피 동작은 되는데 왜 굳이 분리하는가? 그것은 인간의 뇌가 보잘것 없기 때문이다. 하나의 부분씩 작성할때에는 객체간의 오가는 메시지를 모두 파악해서 영향도를 알 수 있을것 같지만 조금만 많아지면 그럴 수 없다.

 

이때 인터페이스가 결합을 느슨하게 해준다. 외부가 영향을 받을때에는 인터페이스가 변경될 때 뿐이며, 내부에 해당하는 구현은 아무리 변경해도 처리 방법이 달라질 뿐 외부는 영향을 받지 않는다.

 

위에서 길게 언급했지만 결국 외부와 내부를 분리하여 구현을 숨기는것을 세 글자로 캡슐화라고 할 수 있다.

댓글