[오브젝트] 2장 : 객체지향 프로그래밍

jungh8n·2023년 1월 3일
0

이전 장에서는 객체지향적 설계를 할 때 결합도가 낮은 객체를 만들기 위한 캡슐화 개념에 대해 중점적으로 다루었고 그를 위한 도구로 인터페이스와 구현이 있다는 것을 배웠다.
추가로, 객체지향 프로그래밍 언어에서는 접근 제어 메커니즘을 이용하여 캡슐화를 돕는다.
이번 장의 제목은 ‘객체지향 프로그래밍’으로 실제 프로그래밍 단계에서 겪을 수 있는 문제와 기법들을 다루었다.

메시지와 메소드를 이용한 협력

객체가 다른 객체들과 협력하기 위해 메시지와 메소드를 사용하고 이 둘을 잘 구분해야 한다는 내용으로 시작한다.

메시지는 객체 간 협력을 위해 전달되는 매개체이고
메소드는 협력을 위해 수신한 메시지를 처리하기 위한 자신만의 행동

으로 정리할 수 있다.

상속을 이용한 다형성

다형성이라는 개념을 코드에서 구현하기 위해 여러 방법이 있는데,
그 중 첫 번째는 추상 클래스를 상속받는 것이다.

공통적으로 사용될 코드는 부모 클래스인 추상 클래스에서 구현하고 다르게 처리가 필요한 부분의 구현은 이를 상속받은 자식 클래스에서의 오버라이딩을 통해 위임하며, 이를 템플릿 메소드 패턴이라고 부른다.

이는 코드의 재사용성을 높이기에 아주 효과적인 방법이다. 기존에 존재하는 코드에서 차이가 나는 부분만 오버라이딩이라는 기법을 이용하여 약간만 다른(대부분의 구현은 가져오고 특정 메소드만 다른) 자식 클래스를 쉽게 만들 수 있다.

위와 같은 프로그래밍은 유연하고 재사용성 높은 코드를 작성하기에 좋지만 이는 코드의 의존성과 실행 시점의 의존성이 다를 수 있다는 문제가 생긴다.
코드에서는 부모인 추상 클래스에 의존성을 가지지만 실제 실행 단계에서는 이를 상속받은 자식 클래스에 의존성을 갖게 되고 이는 코드를 처음 접하는 사람이 좀 더 이해하기 어려워지게 된다(가독성이 떨어진다).

따라서 유연성과 가독성은 트레이드오프 관계임을 알 수 있다.

인터페이스를 이용한 다형성

두 번째로 인터페이스를 상속받는 방법이 있다.
상속의 목적이 코드의 재사용성에만 있다고 착각할 수 있지만 인터페이스 상속은 부모의 코드를 재사용하는 것이 아니라 부모가 수신하는 메시지를 모두 수신할 수 있는 자식 클래스를 만드는 것이다.
따라 자식 클래스는 부모 클래스를 완전히 대체할 수 있고 이를 업캐스팅이라고 한다.
이때 메시지를 수신한 클래스가 무엇이냐에 따라 수신한 메시지를 처리하는 메소드가 달라지게 되고 이것이 다형성이다.

정리하자면 다형성

  • 메시지를 수신하는 객체의 타입에 따라 다르게 응답할 수 있는 성질
  • 메시지와 메소드를 실행 시점에 바인딩(동적 바인딩)한다.

합성

상속은 자식 클래스에서 부모 클래스의 내부 구조를 알아야 한다는 점에서 캡슐화를 위반한다. 이는 부모와 자식 클래스 간의 결합도를 높여 수정이 어려워지는 코드가 된다.

이를 해결하기 위한 방법이 합성이다.
합성에서는 다른 객체의 인스턴스를 자신의 인스턴스 변수로 포함하여 재사용하는 방법이다.
메시지를 이용해 결합도를 낮출 수 있는 효과를 얻을 수 있다.

0개의 댓글