본문 바로가기

WINK-(Web & App)/Spring Boot 스터디

[2024-2 SpringBoot 스터디] 윤성욱 #3주차

반응형

다형성(Polymorphism)

객체 지향 프로그래밍에서 다형성은 역할과 구현을 분리하여 코드의 유연성과 확장성을 높이는 강력한 도구이다.

 

다형성은 단순히 기술적 개념이 아니라, 실세계의 역할구현을 객체로 옮겨온 것이라 볼 수 있다. 예를 들어 운전자-자동차처럼, 역할만을 알고 있으면 다양한 구현을 선택할 수 있는 구조로, 이 구조가 바로 다형성의 핵심이라고 볼 수 있다.

 

  • 운전자는 자신이 운전할 자동차의 내부 구조나 작동 방식에 대해 몰라도 되며, 운전자는 차를 운전하는 역할만 수행할 뿐이다. 여기서 자동차 역할은 운전자의 조작을 받아 차량을 움직이는 것이다.
  • 자동차 구현으로는 K3, 아반떼, 테슬라 모델3와 같이 다양하게 존재할 수 있다. 운전자가 ‘자동차’라는 역할만 알고 있다면, 어떤 자동차를 몰더라도 기본적인 운전이 가능하며, 차종 변경 시에도 운전법은 변하지 않는다.

이처럼 역할구현을 나누면 세상을 더욱 단순하고 유연하게 바라볼 수 있다. 역할만 알고 있다면 그 역할을 수행하는 구체적인 대상이 어떤 방식으로 구현되든 상관없이 동일한 행동을 기대할 수 있기 때문이다.


역할과 구현의 분리로 얻는 장점

  • 역할(인터페이스)만 알면 됨: 클라이언트는 구체적인 구현 대신 인터페이스(역할)를 알기만 하면 된다.
  • 내부 구조 몰라도 동작: 클라이언트는 구현의 세부 사항을 알 필요가 없다.
  • 구현 변경의 유연성: 내부 구현이 변경되어도 클라이언트는 영향을 받지 않는다.
  • 구현 교체 가능: 다른 구현체로 변경해도 클라이언트에 큰 영향을 미치지 않는다.

자바 언어에서의 다형성

MemberRepository라는 인터페이스와

그 구현체인 MemoryMemberRepositoryJdbcMemberRepository를 보자.

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();
    }
}

역할과 구현을 분리하는 설계의 장점

  1. 유연하고 변경 용이: 클라이언트 코드와 구현 코드를 분리하여 변경에 유연하게 대응할 수 있다.
  2. 확장 가능한 설계: 새로운 구현체를 추가할 때, 기존 클라이언트를 수정하지 않아도 되므로 확장성이 좋다.
  3. 안정적인 인터페이스 설계: 인터페이스를 안정적으로 잘 설계하면, 다양한 구현체가 역할을 수행할 수 있으며, 확장 시에도 변경 영향을 최소화할 수 있다.

한계와 주의점

  • 역할 자체의 변화: 역할(인터페이스)이 변하면, 클라이언트와 서버 모두에 큰 변경이 발생한다.
    예를 들어, 자동차를 비행기로 바꾸어야 한다면, 운전자의 조작 방법도 바뀌어야 하는 것 처럼...
  • 안정적인 인터페이스 설계: 인터페이스는 잘 설계되어야 하며, 변화 가능성이 적어야 한다. 그렇지 않으면, 잦은 인터페이스 변경으로 인해 유연성이 줄어들 수 있다.

스프링과 다형성

스프링 프레임워크는 다형성을 극대화해 제어의 역전(IoC)의존관계 주입(DI)을 통해 역할과 구현을 유연하게 다룰 수 있도록 지원한다.

이를 통해 필요한 구현을 조립하듯 연결하고, 구체적인 구현체의 교체도 쉽게 할 수 있다.

 

다형성을 적극적으로 활용하면, 코드의 확장성과 유연성이 증가하며 유지보수가 쉬운 객체 지향 설계를 할 수 있다.

반응형