본문으로 바로가기

 

객체지향 프로그래밍 (Object-Oriented Programming)

  • 많은 객체(Objcet)들이 모여서 상호 협력하면서 메시지를 주고 받으며 데이터를 처리하는 방식의 현실세계의 패러다임을 접목한 프로그래밍 방법입니다.
  • 다형성을 통해 레고 블럭 조립하듯이 컴포넌트를 유연하고 변경이 용이하기 때문에 대규모 소프트웨어 개발에 많이 사용됩니다.
  • 대표적으로 많이 알려진 Java언어를 포함하여 Ruby Python, C++, Objectivc-C, C#, Kotlin 등이 모두 객체지향 요소를 가진 언어입니다.

객체지향의 특징

  • 캡슐화 : 접근제어 지시자를 통한 정보 은닉 ( public > protected > default > private )을 통해 여러가지 형태의 객체를 디자인 >  ex) 싱글톤
  • 상속 : 상위 클래스의 특징을 하위클래스에서 상속받아 코드의 중복 제거, 코드 재사용성 증대
  • 추상화 : 모델링개념. 클래스 설계를 할때  공통적으로 묶일 수 있는 기능은 추상화 > 추상클래스 > 인터페이스 모델링해서 향후 다형성으로 확장할 수 있도록 설계
  • 다형성  : OOP의 OOP답게 만들어 주는 가장 큰 특징
    • 다형성을 통해 역할과(인터페이스) 구현을 분리해서 오버라이딩을 통해 서비스의 구현기능을 유연하게 변경, 확장이 가능
    • 특히 스프링같은 DI컨테이너를 이용하면 다형성을 극대화 하여 OCP,DIP 설계 원칙을 잘 지키면서도 구현체를 편리하게 변경,확장이 가능

다형성의 실세계 비유

  • 역할(interface)구현(implements)으로 세상을 구분
  • 운전자-자동차 / 공연무대 / 키보드마우스 / 정렬알고리즘 / 할인정책

  • 자동차의 구현을 분리한 건 운전자를 위함임! 차가 바뀐다고해서 운전자는 내부 구조를 알 필요가 없이 운전 가능!
  • 클라이언트에 영향을 주지 않고 새로운 기능을 제공할 수있음!! 클라이언트를 바꿀 필요가 없는 것이 중요!!

역할과 구현을 분리

  • 역할과 구현으로 구분하면 세상이 단순해지고, 유연해지며 변경도 편리해진다.
  • 장점
    • 클라이언트는 대상의 역할(인터페이스)만 알면 된다.
    • 클라이언트는 구현 대상의 내부 구조를 몰라도 된다.
    • 클라이언트는 구현 대상의 내부 구조가 변경되어도 영향을 받지 않는다
    • 클라이언트는 구현 대상 자체를 변경해도 영향을 받지 않는다.
  • 자바 언어의 다형성 활용
    • 역할 = 인터페이스
    • 구현 = 인터페이스를 구현한 클래스, 구현 객체
  • 객체를 설계할 때 역할과 구현을 명확히 분리!
  • 객체 설계시 역할(인터페이스)를 먼저 부여하고, 그 역할을 수행하는 구현 객체 만들기!!
  • 핵심은 구현보다 역할(인터페이스)가 더 중요하다!!

객체의 협력이라는 관계부터 생각

  • 혼자 있는 객체는 없다.
  • 클라이언트 : 요청, 서버 : 응답 - 수많은 클라이언트와 객체 서버는 협력관계를 가짐

자바 언어의 다형성

  • 오버라이딩을 떠올려보자, 오버라이딩은 자바의 기본 문법 - 메서드 재정의
  • 결국 오버라이딩 된 메서드가 호출 되는것 !
  • 다형성으로 인터페이스를 구현한 객체를 실행시점에 유연하게 변경 가능. (상속도 가능)
  • 다형성의 본질 클라이언트를 변경하지 않고 서버의 구현기능을 유연하게 변경 가능

정리

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

Reference

 

스프링 핵심 원리 - 기본편 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., - 강의 소개 | 인프런...

www.inflearn.com