객체 지향 특징
- 추상화
- 캡슐화
- 상속
- 다형성
다형성의 실세계 비유
- 실세계와 객체 지향을 1:1로 매칭 x
- 그래도 실세계의 비유로 이해는 해보자.
- 역할과 구현으로 구분
=>
- 운전자 - 자동차
- 공연 무대
- 키보드(ex 기계식 쓰다가 리얼포스 무접점 키보드 씀), 마우스 세상의 표준 인터페이스들
- 정렬 알고리즘
- 할인 정책 로직
역할과 구현을 분리
- 역할과 구현 구분하면 세상이 단순, 유연 변경도 편리해진다.
장점
- 클라이언트는 대상의 역할(인터페이스)만 알면 된다.
- 클라이언트는 구현 대상의 내부 구조 몰라도 된다.
- 클라이언트는 대상의 내부 구조가 변경되도 영향을 받지 않는다.
- 클라이언트는 대상 자체를 변경해도 영항을 안받는다.(소유한 차가 k3에서 테슬라 , 테슬라에서 k3 바꿔도 세상은 변하지 않음)
즉 자바언어에서는
- 자바 언어의 다형성을 활용
- 역할 = 인터페이스
- 구현 = 인터페이스를 구현한 클래스, 구현 객체
- 객체를 설계할 때 역할과 구현을 명확히 분리
- 객체 설계시 역할(인터페이스)을 먼저 부여하고, 역할을 수행하는 구현 객체 만들기
객체의 협력이라는 관계부터 생각
- 혼자 있는 객체는 없음.
- 클라이언트: 요청, 서버: 응답
- 수 많은 객체 클라이언트와 객체 서버는 서로 협력 관계를 가진다.
오버로딩 vs 오버라이딩
오버로딩은 여러 개 많이 초과해서 로딩했다.(메서드 여러개 정의)
오버라이딩은 기능을 넘어서 타버린다. (재정의 한다.)
자바 언어의 다형성
오버라이딩을 떠올려보면
오버라이딩은 자바 기본 문법이고
오버라이딩 된 메서드가 실행
다형성으로 인터페이스를 구현한 객체를 실행 시점에 유연하게 변경할 수 있고
클래스 상속 관계도 다형성, 오버라이딩 적용이 가능하다.
클라이언트가 MemberService라고 하고 MemberRepository에 의존한다 하자.(얘를 알고 있다 = 의존한다)
MemberRepository에다가 MemberRepository를 구현한 MemoryMemberRepository랑 JdbcMemberRepository를 할당할 수 있을까?
MemberService가 MemberRepository 인터페이스를 선언해놓고 값을 MemoryMemberRepository로 대입을 할 수 있다.
그리고 이걸 JdbcMemberRepository로 넣을 수 있다. 다형성이기 때문에 가능함. 즉 부모타입으로 다 받아들일 수 있다.
하지만 MemberRepository 인터페이스랑 전혀 관계없는 것은 할당할 수가 없다.
결론적으로는 파란색 클라이언트에 MemberRepository인터페이스가 있는데 여기에 빨간색 MemoryMemberRepository를 넣어서 save()를 하게 되면 MemoryMemberRepository이 호출되고
초록색 JdbcMemberRepository를 넣어 save()를 하게되면 JdbcMemberRepository이 호출이 된다.
다형성의 본질
- 인터페이스를 구현한 객체 인스턴스를 실행 시점에 유연하게 변경할 수 있다.
- 다형성의 본질을 이해하려면 협력이라는 객체 사이의 관계에서 시작해야한다.
- 클라이언트를 변경안하고, 서버의 구현 기능을 유연하게 변경할 수 있다.
역할과 구현을 분리
- 실세계의 역할과 구현이라는 편리한 컨셉을 다형성을 통해 객체 세상으로 가져오는게 가능
- 유연 & 변경이 용이
- 확장 가능한 설계
- 클라이언트에 영향 안주는 변경이 가능
- 인터페이스를 안정적으로 잘 설계하는 것이 가장 중요
스프링과 객체 지향
- 다형성이 가장 중요하다
- 스프링은 다형성을 극대화해서 이용하게 도와준다.
- 제어의 역전 IOC / 의존관계 주입 DI 은 다형성을 활용해서 역할과 구현을 편리하게 다룰 수 있도록 지원
- 스프링을 사용하면 레고 블럭 조립하듯이 무대의 배우를 선택하듯이 구현을 편리하게 변경 가능
다음에는 SOLID라고 하는 객체 지향 설계의 원칙에 대해서 알아보자.
<출처 김영한: 스프링 핵심 원리 - 기본편 >
'Spring > SpringCore' 카테고리의 다른 글
스프링 핵심 원리 이해1 - 회원 도메인 설계 (0) | 2022.03.24 |
---|---|
스프링 핵심 원리 이해1 - 비즈니스 요구사항 설계 (0) | 2022.03.24 |
스프링 핵심 원리 이해1 - 프로젝트 생성 (0) | 2022.03.23 |
스프링 DB 접근 기술 - 스프링 데이터 JPA error (0) | 2022.03.23 |
스프링 DB 접근 기술 - H2 데이터베이스 설치 (0) | 2022.03.22 |