본문 바로가기
Web/spring study

[Spring] 좋은 객체지향 프로그래밍이란?

by 장인이 2022. 5. 17.

0. 객체 지향의 특징

- 추상화

- 캡슐화

- 상속

- 다형성

 

1. 객체 지향 프로그래밍

- 다들 알고있겠지만, 객체 지향 프로그래밍은 프로그램을 명령어의 목록으로 보는 것에서 벗어나, "객체"(독립된 단위)들의 모임으로 파악하는 것이다.

- 각각 객체는 서로 메세지를 주고받고, 데이터를 처리하는 등 서로 협력한다.

 

- 객체 지향 프로그래밍은 프로그램을 유연하고, 변경에 용이하도록 만들어 주므로, 대규모 개발에 자주 사용된다.

  -> 유연하고 변경이 용이하다?

  -> 마치 레고 블럭을 조립하듯이, 컴포넌트를 유연하게 변경하면서 개발하는 방법

  -> 객체 지향의 핵심인, 다형성(Polymorphism)

 

2. 다향성이 왜 중요한가?

- 다향성에 대해 이해해 보기 위해 실생활의 상황을 역할과 구현으로 구분해보자.

 

ex1) 컴퓨터 사용자와 키보드를 예시로 들어보자. 유저는 컴퓨터에 문자를 입력하기 위해 키보드의 역할이 필요하며, 해당 키보드가 A회사인지, B회사인지는 중요하지 않다. 즉, 키보드의 종류(구현)은 다를 수 있다. 하지만 유저는 각 키보드의 내부적인 작동 원리를 이해할 필요 없이 키보드를 어떻게 사용하는가만 알고있으면, 사용할 수 있다.

 

ex2) 한 연극에 공주 역할이 필요하다고 해보자. 관객의 입장에서는 해당 역할의 배우가 A이든, B이든 상관없이 공연을 즐길 수 있을 것이다. (물론 연기 실력 등이 있지만, 기타 요소들은 제외하고 생각해보자)

 

- 따라서 역할, 구현으로 세상을 생각해본다면, 세상이 단순해지고, 유연/변경이 편리해진다.

 

이때의 장점

- 클라이언트는 대상의 역할만 알면 된다.

- 클라이언트는 대상의 내부 구조를 몰라도 된다.

- 클라이언트는 대상의 내부 구조가 변경되어도 영향을 받지 않는다.

- 클라이언트는 구현 대상 그 자체를 변경해도 영향을 받지 않는다.

 

 

자바 언어에서 한번 봐보자

  - 자바에서 역할 = 인터페이스

  - 자바에서 구현 = 인터페이스를 구현한 클래스, 구현 객체

(물론 클래스도 역할을 할 수 있지만, 다중 상속이 안되는 등 여러 불편한 점 있음)

 

- 즉, 객체를 설계할 때 역할과 구현을 명확히 분리하자

객체 설계시 역할(인터페이스)을 먼저 부여하고, 그 역할을 수행하는 구현 객체를 후에 만들기

 

2. 그래서 스프링 얘기하는데 다형성은 왜?

- 사실 스프링이 바로 이 다형성을 최대한 활용할 수 있도록 도와주는 것이라고 해도 과언이 아니다.

 

// MemberService는 MemberRepository와 직접적으로 연결되어있음
// 다형성 활용해서 MemoryMemberRepository에 접근
public class MemberService {

	private MemberRepository memberRepository = new MemoryMemberRepository();

}
// 혹은
public class MemberService {

	// private MemberRepository memberRepository = new MemoryMemberRepository();
    private MemberRepository memberRepository = new JdbcMemberRepository();

}

 

- 예를 들어 클라이언트가 MemberService, 그리고 MemberRepository interface에 save()라는 함수가 있다고 가정하자. 그리고 MemberRepository를 상속받는 MemoryMemberRepository, JdbcMemberRepository 클래스에서 save()함수를 오버라이딩 했다고 하자.

 

- 그럼 클라이언트, 즉 MemberService는 부모 타입인 MemberRepository에 접근할 수 있도록 설계하고, 필요에 따라 MemoryMemberRepository, JdbcMemberRepository를 할당한다면?

-> 클라이언트를 변경하지 않아도, 서버의 기능을 유연하게 변경할 수 있다.

 

- 정리

- 유연하고, 변경이 용이함

- 확장 가능한 설계

- 클라이언트에 영향을 주지 않으면서, 기능 변경 가능

- But, 인터페이스를 안정적으로 잘 설계하는 것이 중요

 

- 한계

- 인터페이스 자체가 변한다면?

  -> 클라이언트, 서버 모두 큰 변경이 일어남

- 따라서 인터페이스를 처음부터 잘 설계하는 것이 중요함

 


위 내용은 김영한 님의 인프런 강의 "스프링 핵심 원리 - 기본편"의 내용과 강의자료를 토대로 작성된 게시글입니다.

강의 링크:

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8

댓글