반응형
다형성(Polymorphism)
객체 지향 프로그래밍에서 다형성은 역할과 구현을 분리하여 코드의 유연성과 확장성을 높이는 강력한 도구이다.
다형성은 단순히 기술적 개념이 아니라, 실세계의 역할과 구현을 객체로 옮겨온 것이라 볼 수 있다. 예를 들어 운전자-자동차처럼, 역할만을 알고 있으면 다양한 구현을 선택할 수 있는 구조로, 이 구조가 바로 다형성의 핵심이라고 볼 수 있다.
- 운전자는 자신이 운전할 자동차의 내부 구조나 작동 방식에 대해 몰라도 되며, 운전자는 차를 운전하는 역할만 수행할 뿐이다. 여기서 자동차 역할은 운전자의 조작을 받아 차량을 움직이는 것이다.
- 자동차 구현으로는 K3, 아반떼, 테슬라 모델3와 같이 다양하게 존재할 수 있다. 운전자가 ‘자동차’라는 역할만 알고 있다면, 어떤 자동차를 몰더라도 기본적인 운전이 가능하며, 차종 변경 시에도 운전법은 변하지 않는다.
이처럼 역할과 구현을 나누면 세상을 더욱 단순하고 유연하게 바라볼 수 있다. 역할만 알고 있다면 그 역할을 수행하는 구체적인 대상이 어떤 방식으로 구현되든 상관없이 동일한 행동을 기대할 수 있기 때문이다.
역할과 구현의 분리로 얻는 장점
- 역할(인터페이스)만 알면 됨: 클라이언트는 구체적인 구현 대신 인터페이스(역할)를 알기만 하면 된다.
- 내부 구조 몰라도 동작: 클라이언트는 구현의 세부 사항을 알 필요가 없다.
- 구현 변경의 유연성: 내부 구현이 변경되어도 클라이언트는 영향을 받지 않는다.
- 구현 교체 가능: 다른 구현체로 변경해도 클라이언트에 큰 영향을 미치지 않는다.
자바 언어에서의 다형성
MemberRepository
라는 인터페이스와
그 구현체인 MemoryMemberRepository
와 JdbcMemberRepository
를 보자.
public interface MemberRepository {
void save();
}
public class MemoryMemberRepository implements MemberRepository {
public void save() {
System.out.println("Saving in memory...");
}
}
public class JdbcMemberRepository implements MemberRepository {
public void save() {
System.out.println("Saving in database...");
}
}
\MemberService
에서 MemberRepository
인터페이스만 알고 있으면, 구현체를 MemoryMemberRepository
에서 JdbcMemberRepository
로 변경해도 코드 수정 없이 유연하게 변경할 수 있다.
public class MemberService {
private MemberRepository memberRepository;
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
public void saveMember() {
memberRepository.save();
}
}
역할과 구현을 분리하는 설계의 장점
- 유연하고 변경 용이: 클라이언트 코드와 구현 코드를 분리하여 변경에 유연하게 대응할 수 있다.
- 확장 가능한 설계: 새로운 구현체를 추가할 때, 기존 클라이언트를 수정하지 않아도 되므로 확장성이 좋다.
- 안정적인 인터페이스 설계: 인터페이스를 안정적으로 잘 설계하면, 다양한 구현체가 역할을 수행할 수 있으며, 확장 시에도 변경 영향을 최소화할 수 있다.
한계와 주의점
- 역할 자체의 변화: 역할(인터페이스)이 변하면, 클라이언트와 서버 모두에 큰 변경이 발생한다.
예를 들어, 자동차를 비행기로 바꾸어야 한다면, 운전자의 조작 방법도 바뀌어야 하는 것 처럼... - 안정적인 인터페이스 설계: 인터페이스는 잘 설계되어야 하며, 변화 가능성이 적어야 한다. 그렇지 않으면, 잦은 인터페이스 변경으로 인해 유연성이 줄어들 수 있다.
스프링과 다형성
스프링 프레임워크는 다형성을 극대화해 제어의 역전(IoC)과 의존관계 주입(DI)을 통해 역할과 구현을 유연하게 다룰 수 있도록 지원한다.
이를 통해 필요한 구현을 조립하듯 연결하고, 구체적인 구현체의 교체도 쉽게 할 수 있다.
다형성을 적극적으로 활용하면, 코드의 확장성과 유연성이 증가하며 유지보수가 쉬운 객체 지향 설계를 할 수 있다.
반응형
'WINK-(Web & App) > Spring Boot 스터디' 카테고리의 다른 글
[2024-2 SpringBoot 스터디] 정호용 #4주차 섹션 4~5 (0) | 2024.11.19 |
---|---|
[2024-2 SpringBoot 스터디] 정호용 #3주차 섹션 1~3 (0) | 2024.11.17 |
[2024-2 SpringBoot 스터디] 조상혁 #3주차 (2) | 2024.11.13 |
[2024-2 SpringBoot 스터디] 탁태현 #2주차 (0) | 2024.11.07 |
[2024-2 SpringBoot 스터디] 윤성욱 #2주차 (1) | 2024.11.07 |