ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [스프링핵심원리-기본편] 좋은 객체 지향 프로그래밍이란?
    히딘쓰의 책상/강의 2023. 8. 22. 17:15
     
     
    인강 들으며, 복습을 위한 요약 정리🎉
     
     
     
    객체 지향 특징
    • 추상화
    • 캡슐화
    • 상속
    • 다형성
     

    객체 지향 프로그래밍

    핵심 개념! 핵심 키워드가 중요함
    • 객체들의 모임
    • 객체끼리 메시지를 주고 받을 수 있고 데이터를 처리할 수 있는 것 (협력)
    • 💡 유연하고 변경이 용이
      • 컴포넌트를 쉽고 유연하게 변경하면서 개발할 수 있는 방법
      • 궁극의 유연함과 궁극의 변경이 용이한 방법이 객체 지향의 핵심!
      • 이게 바로 다형성 (Polymorphism)

     

    다형성이 왜 중요할까?

    다형성을 실세계에 비유!
    • 💡 역할구현으로 세상을 구분
    • 역할이 인터페이스, 구현이 인터페이스를 구현한 객체

     

    다형성의 예시들

    • 운전자 - 자동차
      • 자동차라는 역할을 만들고 구현을 분리한 것은 결국 운전자(클라이언트)를 위해서 한 것
      • 운전자(클라이언트)가 자동차 내부 구조 등은 몰라도 자동차의 역할(인터페이스)만 제대로 수행하면 클라이언트에게 영향을 주지 않음
      • 어떤 자동차여도 자동차의 역할만 제대로 수행한다면 상관이 없음 (ex. 전기 자동차여도 자동차의 역할만 제대로 하면 됨) → 자동차 세상을 무한히 확장 가능함
      • 💡 클라이언트에 영향을 주지 않고 새로운 기능을 제공할 수 있다는 것
      • 역할구현으로 세상을 구분했기 때문에 가능한 것
      • → 여기서 진짜 중요한 것은 내가 자동차 역할을 여러 개 무한히 구현할 수 있는 게 아니고 새로운 자동차가 나와도 클라이언트는 새로운 걸 배우지 않아도 되는 것!
      • 💡 클라이언트를 바꿀 필요가 없음!!!!
    • 연극
      • 로미오 역할(클라이언트)과 줄리엣 역할(서버, 인터페이스)
      • 줄리엣의 실제 배우(구현)가 바뀐다고 로미오 역할(클라이언트)에 영향을 주지 않음. 다른 대상 대체 가능. 로미오의 실제 배우(구현) 도 마찬가지!
      • → 이게 바로 유연하고 변경이 용이 하다는 것
      • 역할과 구현을 나눔으로써 변경 가능, 대체 가능성이 생김 
    출처 : 스프링 핵심원리-기본편

     

    정리

    역할과 구현을 분리함으로써 세상이 단순해지고, 유연해지며 변경도 편리해진다
    • 장점
      • 핵심은 클라이언트!
      • 💡 클라이언트는 대상의 역할(인터페이스)만 알면 된다
      • 클라이언트는 구현 대상의 내부 구조를 몰라도 된다
      • 클라이언트는 구현 대상의 내부 구조가 변경되어도 영향을 받지 않는다
      • 클라이언트는 구현 대상 자체를 변경해도 영향을 받지 않는다

     

     

    자바 언어에서도 역할과 구현을 분리하는 개념을 사용함

    • 자바 언어의 다형성을 활용
      • 역할 = 인터페이스
      • 구현 = 인터페이스를 구현한 클래스, 구현 객체
      • 객체를 설계할 때 역할과 구현을 명확히 분리
      • 객체 설계 시 역할(인터페이스)을 먼저 부여하고, 그 역할을 수행하는 구현 객체 만들기

    (참고) 꼭 인터페이스가 아니라 일반 상속 관계도 다형성이 가능

    하지만 인터페이스는 다중 상속 가능, 일반 상속은 단일 상속만 가능 등의 여러 문제들이 있음

    가급적이면 인터페이스로!

    핵심은 구현보다 인터페이스(역할)이 더 먼저! 더 중요하다는 것!

     

    💡 중요한 것은 클라이언트! (요청하는 사람)

     

     

     

    다형성의 본질

    • 💡 클라이언트를 변경하지 않고, 서버의 구현 기능을 유연하게 변경할 수 있음

     

     

     

    <역할과 구현을 분리>

    • 정리
      • 실세계의 역할과 구현이라는 편리한 컨셉을 다형성을 통해 객체 세상으로 가져올 수 있음
      • 유연하고, 변경이 용이
      • 확장 가능한 설계
      • 클라이언트에 영향을 주지 않는 변경 가능
      • 인터페이스를 안정적으로 잘 설계하는 것이 중요

    인터페이스의 구현체를 무한 확장 할 수 있음여기서 제일 중요한 것은 인터페이스가 깨지면 다 끝난다는 것..!

    인터페이스를 안정적으로 잘 설계하는 것이 굉장히 중요함

    → 그럼에도 클라이언트에는 영향을 주지 않음!

     

     

    <역할과 구현을 분리>

      • 역할(인터페이스) 자체가 변하면, 클라이언트, 서버 모두에 큰 변경이 발생한다
      • 자동차를 비행기로 변경해야 한다면?
      • 대본 자체가 변경된다면?
      • USB 인터페이스가 변경된다면?
      • 인터페이스를 안정적으로 잘 설계하는 것이 중요

    자동차가 비행기로 바뀌면 인터페이스 자체가 변경되기 때문에 다 뜯어 고쳐야 함

    연극에서 대본 자체가 변하면 그 대본을 보고 연기하는 모두가 영향을 받음

    → 설계할 때 인터페이스를 안정적으로 가장 변화 없는 방식으로 잘 설계하는 것이 중요!

    API에서도 인터페이스 자체가 마니 안 흔들리게 잘 설계하는 게 진짜 잘하는 개발자!

     

     

     

    자! 이제 스프링!

    💡 객체 지향의 꽃은 다형성!

    스프링 컨테이너가 제공하는 건 다형성을 편리하게 사용할 수 있도록 지원하는 기능

    → 스프링을 사용하면 레고 블럭 조립하듯이 구현을 편리하게 변경할 수 있음

    스프링과 객체 지향의 설계에 대해서 제대로 이해하려면 다형성 외에 한가지를 더 알아야함

    바로 SOLID (좋은 객체 지향 설계의 5가지 원칙)

     

Designed by Tistory.