[Spring] 01-2. 객체 지향 프로그래밍

지찬우·2022년 12월 16일
0

Spring

목록 보기
2/27
post-thumbnail

이 시리즈는 인프런 강의(김영한 님의 ‘스프링 핵심 원리 - 기본편’)로 공부하며 혼자 기록하고, 사람들과도 공유할 수 있도록 작성하는 글이다. 최대한 추가적인 정보는 공식 홈페이지, 문서를 보며 얻을 예정이다.
(개인적인 생각과 이해가 들어가 있기 때문에 저의 ‘무식함’이 있을 수 있습니다😜 혹시라도 이 글을 보게 되시는 분이 계시다면 잘못된 부분 댓글로 많이 알려주시면 너무 감사하겠습니다!!)


좋은 객체 지향 프로그래밍이란❓

객체 지향의 특징

  • 추상화
  • 캡슐화
  • 상속
  • 다형성

객체 지향에 대해 처음 배우면 꼭 들어보는 단어들이다. 익숙하면서도 익숙하지 않다..^^

🤔 객체 지향 프로그래밍

“컴퓨터 프로그램을 명령어의 목록으로 보는 것이 아닌, 여러 개의 독립 단위, 즉 ‘객체’들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고받으며, 데이터를 처리할 수 있다.”
wikipedia

즉 객체들 사이에 협력 관계가 존재한다는 의미이다.

유연하고 변경이 용이하기 때문에 대규모 소프트웨어 개발에 많이 사용된다고 한다. 유연하고 변경이 용이하다는 말은 ‘블록을 조립하고, 컴퓨터 부품을 갈아 끼우듯 컴포넌트를 쉽고 유연하게 변경하면서 개발할 수 있다’라는 뜻이다.

✨ 객체 지향의 핵심은 “다형성(Polymorphism)”이다.

(다형성을 공부하기 전에 위에서 언급했듯이 ‘객체들은 서로 협력 관계를 갖고 있다.’는 점을 잘 생각해야 한다.)

“다형성은 그 프로그래밍 언어의 자료형 체계의 성질을 나타내는 것으로, 프로그램 언어의 각 요소들(상수, 변수, 오브젝트, 메서드 등)이 다양한 자료형에 속하는 것이 허가되는 성질을 가리킨다.”
wikipedia

음.. 솔직히 무슨 말인지 확실하게 감이 잡히지는 않는다. 실세계와 비유해 보면 더 쉽게 이해할 수 있을 것이다.
(프로그래밍 언어를 실세계에 비유하는 것은 일대일로 딱 맞지는 않지만, 이해하기 쉽다고 한다.)

📌 다형성 Polymophism

실세계에 비유할 때, 역할(interface)구현(class)으로 세상을 구분할 수 있다. 운전자와 자동차로 예시를 들어보자.

운전자는 자동차를 운전하는 방법을 알고 있다. 이 자동차라는 인터페이스 즉 역할을 알고 있는 것이다. 자동차 역할을 구현하는(자동차를 제조하는) 기업은 매우 다양하다. 하지만 이 각각의 제조사들은 모두 자동차 역할을 구현하는 자동차를 만든다. 따라서 운전자는 자동차가 바뀌어도 자동차 역할을 구현한 것은 같기 때문에 새로 운전하는 법을 배우지 않아도 운전이 가능하다. → 클라이언트에 영향을 주지 않고 새로운 기능을 제공할 수 있다는 것이다.

(앞으로 언급하는 클라이언트와 서버는 객체 클라이언트(요청하는 객체)와 서버 객체(응답하는 객체)를 이야기한다고 생각하면 된다.)

포인트는 자동차 역할을 여러 개 구현할 수 있다는 점이 아니다. 새로운 기능이 추가될 때(여러 개 구현) 클라이언트(위의 예시에서는 운전자)가 새로운 것을 배우지 않아도 된다는 것이다.

⭐️ 역할과 구현의 분리

정리해 보면, 역할과 구현을 분리하는 것이 중요하다.

클라이언트는

  • 대상의 역할(인터페이스)만 알면 된다.
  • 구현 대상의 내부 구조를 몰라도 된다.

그럼 자바에서는❓

일단 한 번 더 상기시키자면 ‘객체들은 서로 협력 관계를 갖고 있다.’라는 점을 잊지 말자!

역할 = interface
구현 = interface를 구현한 class, 구현 객체

개체를 설계할 때 역할과 구현을 명확히 분리해야 하며, 역할 설계를 먼저 수행해야 한다.

자바의 다형성을 알아보기 위해 오버라이딩(Overriding)을 떠올려보자. 아마 자바를 공부했다면 알고 있을 내용이라고 생각한다.

“오버라이딩은 객체 지향 프로그래밍에서 자식 클래스(서브 클래스)가 자신의 부모 클래스들(슈퍼 클래스들) 중 하나에 의해 이미 제공된 메서드를 특정한 형태로 구현하는 것을 제공하는 언어의 특징이다.”
wikipedia

즉 메서드의 기능을 재정의 하는 것이다.

자바의 다형성

아래는 강의 내용 중에 나온 예시이다.
(인프런에서 김영한 님의 무료 강의 ‘스프링 입문’에서 이와 같은 내용을 실습을 통해 다룬다. 나는 스프링 공부를 제대로 시작하기 전에 그 강의를 들었는데 지금 공부하면서 굉장히 도움이 많이 되는 것 같다. 기회가 된다면 꼭 그 강의를 보면 좋을 것 같다. 홍보 아닙니다!!!)

위의 구조에 대해 설명을 조금 해보자면

  • Service : 핵심 비즈니스 로직 구현
  • Repository : DB 접근, 도메인 객체를 DB에 저장하고 관리

(앞에 붙은 Member는 Member 도메인 객체를 다룬다는 의미라고 생각하면 될 것 같다. 지금 당장 중요한 부분은 아니다.)

위의 그림을 보면 🔵MemberService가 MembmerRepository를 의존(알고 있다)한다. 🔴MemoryMemberRepository(데이터를 메모리에 저장하는 구현체)와 🟢JdbcMemberRepository(데이터를 DB에 저장하는 구현체)는 MemberRepository를 구현하고 있다.

아까 예시를 든 운전자와 자동차에 비유하자면 🔵는 운전자, MemberRepository는 자동차 역할, 🔴과 🟢은 자동차 구현이라고 생각하면 된다.

코드를 한 번 보도록 하자.

MemberRepository

public interface MemberRepository {

    void save(Member member);

 }

(🔴MemoryMemberRepository와 🟢JdbcMemberRepository는 MemberRepository를 구현해 놓았다고 가정하자.)

🔵MemberService

public class MemberService {

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

    public void joinMember(Member member) {
        memberRepository.save(member);
    }
}

이처럼 🔴이나 🟢을 쉽게 갈아끼울 수 있는 것이다.

다형성의 본질❗️

  • 인터페이스를 구현한 객체 인스턴스를 실행 시점에 유연하게 변경이 가능하다.

  • 본질을 이해하려면 협력이라는 객체 사이의 관계에서 시작해야 한다.

    ➡️ 클라이언트를 변경하지 않고, 서버의 구현 기능을 유연하게 바꿀 수 있다!

📝 정리

역할과 구현의 분리를 정리해보자.

역할과 구현을 분리하면 ‘클라이언트에 영향을 주지 않는 유연한 변경이 가능하며, 확장이 가능하도록 설계할 수 있다.’정도로 정리할 수 있을 것 같다.

하지만 한계도 존재할 수 밖에 없다. 역할(인터페이스) 자체가 변하면, 클라이언트와 서버 모두 큰 변경이 발생한다. 따라서 인터페이스를 안정적으로 잘 설계하는 것이 매우 중요하다.

🌱 스프링과 객체 지향

스프링은 다형성을 극대화하여 이용할 수 있도록 도와준다. 제어 역전(IoC), 의존관계 주입(DI)은 다형성을 활용하여 역할과 구현을 편리하게 다룰 수 있도록 해준다. (제어 역전과 의존관계 주입은 차차 공부하며 알게될테니 걱정하지 않아도 된다.)
➡️ 스프링을 사용하면 구현을 편리하게 변경할 수 있다!


오늘은 객체 지향에 관련하여 공부해봤는데, 역시 객체 지향은 하루아침에 깨닫고 이해할 수 있는 내용은 아닌 것 같다. 그만큼 글도 길었던 것 같다🤣 다음 시간에는 객체 지향 5가지 원칙(SOLID)에 대해 공부할 예정이다.

profile
좋은 개발자가 되자.

0개의 댓글