반응형
다형성, 역할과 구현의 분리
다형성(Polymorphism)은 객체지향 프로그램밍에서 중요한 개념으로, 하나의 추상적인 역할(인터페이스나 추상 클래스)을 여러 다른 구체적인 개념으로 구현할 수 있는 능력을 가리킨다.
역할과 구현의 분리는 다형성의 핵심 원칙이며, 코드의 역할과 분리가 명확해질수록 코드가 단순해지고 유지보수가 용이해진다. 즉, 새로운 구현을 추가하거나 기존 구현을 변경할 때 다른 부분에 미치는 영향이 적을수록 역할과 구현이 잘 분리되었다고 말할 수 있다.
다음은 역할과 구현의 분리를 실세계의 비유로 표현한 그림이다.
위 예시 그림으로 다형성의 역할과 구현의 분리 개념을 설명하면 이렇다.
- 사용자(클라이언트)는 대상의 역할(인터페이스)만 알면 된다.
- 즉, 스마트폰(갤럭시, 아이폰)의 사용 방법만 알면 구현 대상의 내부 구조를 몰라도 사용하는 데에는 지장이 없다. - 사용자(클라이언트)는 구현 대상(구현 클래스)의 내부 구조가 변경되어도 영향을 받지 않는다.
- 예를들어, 스마트폰의 내부 하드웨어가 업그레이드되더라도 스마트폰(역할)의 사용방법은 달라지지 않았기 때문에 사용자에게는 영향이 없다. - 사용자(클라이언트)는 구현 대상 자체를 변경해도 영향을 받지 않는다.
- 즉, 휴대폰 기종이 바뀌었다고해서 사용자가 새로운 기술을 배울 필요가 없다.(스마트폰이라는 역할을 대상으로 구현이 되었기 때문에)
실세계와 객체 지향을 1:1로 매칭한 비유는 완벽하다고 할 수는 없지만, 실세계의 비유로 역할과 구현을 이해하기에는 좋다.
역할과 구현의 분리에는 몇 가지 주의할 점이 있다.
- 구현 클래스는 역할을 충실히 구현해야한다. 즉, 인터페이스에 선언된 메서드와 속성(상수 필드)를 구현해야 한다.
- 역할과 구현을 분리하면, 구현의 세부 사항을 감춘다. (정보은닉, 캡슐화)
- 적절한 수준의 추상화를 유지하는 것이 좋다.
- 객체 지향 프로그래밍에서 추상화는 핵심 개념 중 하나이다. 그러나 과도한 추상화는 코드의 복잡성을 높일 수 있는 계기가 될 수 있으니 선택할 때 신중히 고려한다.
- 역할(인터페이스) 자체가 변하면, 클라이언트, 서버 모두에 큰 변경이 발생한다.
- 위 그림을 과장해서 예로들면, 스마트폰을 태블릿 PC로 역할을 바꾸어야 한다면?
- 완전히 적절한 비유라고 할 수는 없지만, 역할이 변경되면 모든 구현 내용을 변경해야 될 수도 있는 큰 영향이 있을 것이라 것을 직감적으로 알 수 있을 것이다.
- 따라서, 인터페이스를 안정적으로 잘 설계하는 것이 중요하다.
스프링과 객체 지향
앞서 살펴본 것처럼, 객체 지향 프로그래밍에서 다형성은 굉장히 중요한 개념이다. 다형성은 확장 가능한 설계를 촉진하고 클라이언트 코드에 영향을 주지 않고도 쉽게 변경을 가능하게 한다.
이러한 다형성을 스프링에서 제어의 역전(IoC), 의존관계 주입(DI)이라는 개념으로 역할과 구현을 편리하게 다룰 수 있도록 지원한다.
반응형
'Java' 카테고리의 다른 글
익명 객체(Anonymous Object) (0) | 2023.09.04 |
---|---|
추상 클래스(abstract class) (0) | 2023.08.30 |
클래스와 객체, 변수 (0) | 2023.08.28 |
인스턴스와 변수 (0) | 2023.08.09 |
객체지향 프로그래밍(OOP) (0) | 2023.08.09 |