Java/[인프런 김영한 실전 자바 - 기본편]

[인프런 김영한 실전 자바 - 기본편] 다형성과 설계

h2boom 2024. 7. 17. 16:32

 객체 지향 프로그래밍

  • 객체 지향 특징
    • 객체 지향의 특징 중 가장 중요한 것은 다형성!
      • 디자인 패턴은 대부분 다형성을 활용한 것.
      • 스프링의 핵심인 IoC, DI도 다형성을 활용하는 것.
    • 추상화
    • 캡슐화
    • 상속
    • 다형성
  • 객체 지향 프로그래밍 : 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 "객체"들의 모임으로 파악하고자 하는 것
    • 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다.
    • 객체 지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 만든다.
      • 레고 블럭을 조립하듯, 컴퓨터 부품을 갈아 끼우듯 유연하고 변경이 용이하게 한다.

 

  • 다형성의 실세계 비유
    • 실세계와 객체 지향을 1:1로 매칭하는 것은 아니다.
    • 역할과 구현으로 세상을 구분한다.

  • 위 예시에서는 운전자 역할에서 볼 때 구현된 자동차가 바뀌어도 운전자에게 영향을 주지 않는다.
    • 자동차 역할의 인터페이스에 따라서 정해져 있기 때문에
  • 자동차 역할과 구현이 구분되어 있는 이유
    • 자동차가 바뀌더라도 운전자의 역할은 바뀌지 않기 때문에, 운전자에게 영향을 주지 않는다.
    • 클라이언트가 자동차의 내부 구조를 다 알 필요가 없다. 자동차의 역할만 알면 된다.
    • 역할과 구현을 구분해놓음으로 운전자는 어떤 자동차가 구현되더라도 문제가 되지 않는다.

 

  • 역할과 구현을 분리함으로 단순해지고 유연해지며 변경이 편리해진다.
    • 클라이언트는 대상의 역할(인터페이스)만 알면 된다.
    • 클라이언트는 구현 대상의 내부 구조를 몰라도 된다.
    • 클라이언트는 내부 구조가 변경되어도 영향을 받지 않는다.
    • 클라이언트는 구현 대상 자체를 변경해도 영향을 받지 않는다. 
    • 결국 역할과 구현을 분리하는 것은 클라이언트의 편의성을 위한 것.

 

  • 역할과 구현을 분리하는 것을 자바 언어로 적용을 한다면?
    • 역할 = 인터페이스
    • 구현 = 인터페이스를 구현한 클래스, 구현 객체
    • 객체 설계 시 역할과 구현을 명확히 분리해야 한다.
      • 역할(인터페이스)을 먼저 부여하고 역할을 수행하는 구현 객체를 만들어야 한다.
    • 유연하고 변경이 용이하며, 확장 가능한 설계를 할 수 있고 클라이언트에 영향을 주지 않는 변경이 가능하다.
      그렇기에 인터페이스를 안정적으로 잘 설계하는 것이 중요하다.

 

  • 다형성의 본질
    • 인터페이스를 구현한 객체 인스턴스를 실행 시점에 유연하게 변경할 수 있다.
    • 클라이언트를 변경하지 않고 서버의 구현 기능을 유연하게 변경할 수 있다.

 

class Car {
	// 내용 생략
}

class Driver {
	private Car car;
	//이후 내용 생략
}
  • Driver 클래스는 클래스 상에서 Car 클래스를 알고 있다
    = Driver 클래스는 Car 클래스에 의존한다.
  • 의존 = 클래스 상에서 어떤 클래스를 알고 있다의 의미다.

OCP (Open-Closed Principle) 원칙

  • 객체 지향 설계 원칙 중 하나로 확장에는 열려있고, 변경에는 닫혀 있다는 뜻이다.
    = 기존 코드의 수정 없이 새로운 기능을 추가할 수 있다.

    • Open for extension : 새로운 기능의 추가나 변경 사항이 생겼을 때 기존 코드는 확장할 수 있어야한다.
    • Closed for modification : 기존의 코드는 수정되지 않아야 한다.
  • 확장이 열려있다는 의미는?
    • 인터페이스를 사용해서 구현하는 새로운 클래스를 자유롭게 추가할 수 있다.
  • 코드 수정은 닫혀있다는 의미는?
    • 새로운 클래스를 추가하게 되면 당연히 기존 코드의 수정은 불가피하다.
    • 변하지 않는 부분
      • 클라이언트 코드를 수정하지 않는다.
  • OCP 원칙의 핵심은 클라이언트 코드는 수정하지 않고 기능을 확장할 수 있어야 한다는 것이다.

 

전략 패턴 (Strategy Pattern): 디자인 패턴 중 가장 중요한 패턴 중 하나.
알고리즘을 클라이언트 코드의 변경 없이 쉽게 교체할 수 있다.
전략 패턴 ex) Driver - Car 에서 Car 인터페이스가 전략을 정의하는 인터페이스이며 각각의 차량 K3, 테슬라 등이 전략의 구체적인 구현이 된다. 또한 전략을 클라이언트 코드 Driver의 변경 없이 손쉽게 교체할 수 있다.
Null Object Pattern : 참조형 변수에 null 대신 null 역할을 하는 객체(Null Object)를 변수에 대입해줌으로 NPE 예외를 방지하고 null 대신 객체를 넣어줄 수 있다.

출처:[인프런 김영한 실전 자바 - 기본편]

https://www.inflearn.com/course/%EA%B9%80%EC%98%81%ED%95%9C%EC%9D%98-%EC%8B%A4%EC%A0%84-%EC%9E%90%EB%B0%94-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard

 

김영한의 실전 자바 - 기본편 강의 | 김영한 - 인프런

김영한 | 실무에 필요한 자바 객체 지향의 핵심 개념을 예제 코드를 통해 쉽게 학습합니다., 국내 개발 분야 누적 수강생 1위, 제대로 만든 김영한의 실전 자바[사진][임베딩 영상]단순히 자바 문

www.inflearn.com