-
(3) 좋은 객체지향 프로그래밍자바 Study/Spring - 핵심원리 2021. 7. 13. 22:28
1. 객체 지향의 특징
자바 언어의 특징과 일치함
1-1) 특징
> 추캡상다
참조 자료 : https://korshika.tistory.com/94?category=962145
- 추상화
- 캡슐화
- 상속
- 다형성
1-2) 객체 지향 프로그래밍의 정의
(a) 정의
객체지향 프로그래밍은 컴퓨터 프로그램을 명령어 목록으로 보는 시각에서 벗어나
특정 기능을 수행하는 객체들의 모임으로 파악하고자 하는 것
각 객체는 메시지를 주고 받고, 데이터 처리를 할 수 있음(협력)
(b) 특징
프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 개발에 적합한 프로세스
※ 유연하고 변경이 용이?
존재하는 부분을 들어내고, 갈아끼우고 새로 추가하는 것이 용이한 것을 의미함
- 다형성의 의미2. 다형성
2-1) text 정의
- 다형성이란 하나의 이름(방법)으로 많은 상황에 대처하는 기법
== 프로그램 언어 각요소들(상수, 변수, 식, 객체, 메쏘드.. 등)이 다양한 자료형에 속하는 것이 허가되는 성질 - 개념적으로 동일한 작업을 하는 함수들에 똑같은 이름을 부여할 수 있으므로 코드가 더 간단해지는 효과
- Overloading, Overriding, Functional interface 등등...
참조 : 우아코스
참조 : korshika.tistory.com/62
- Overloading, Overriding, Functional interface 등등...
2-2) 실세계에 대한 비유
- 실세계와 객체 지향을 1:1로 매칭 X
- 그럼에도 실세계의 비유로 이해를 시도하기에는 좋음
- "역할"과 "구현"으로 세상을 구분
(a) 운전자 - 자동차 모델
자동차가 바뀌어도, 운전자에게 영향을 주지 않음(매우 미미)
→ 이것이 "유연하고 변경이 용이" 한 것의 의미
→ 자동차 인터페이스에 대해서만 운전자가 알고 있으면 어떤 차도 사용 가능
→ 운전자(클라이언트)가 운전자 내부 구조를 몰라도, 마지막 단에서 자유롭게 모델별로 이용 가능
→ 클라이언트에 영향을 주지 않고 새로운 기능을 제공할 수 있음 == 역할과 구현으로 구분했기 때문
(b) 공연 무대 - 배우 모델
역할과 그를 구현하는 배우로 구분
(c) 결론
사용자 / 클라이언트가 이용하는 endpoint의 "역할"과
그것을 이루는 내부적인 "구현"으로 구분될 때 다형성이 잘 구현되었다고 할 수 있음
- 역할 / 구현으로 구분할 시, 세상이 단순해지고 유연해지며 변경도 편리해짐
- 클라이언트는 대상의 역할(인터페이스만) 알면 됨
- 클라이언트는 구현 대상의 내부 구조를 몰라도 됨
- 클라이언트는 구현 대상의 내부 구조가 변경되어도 영향을 받지 않음
- 클라이언트는 구현 대상 자체를 변경해도 영향을 받지 않음
(d) 다른 예시
- 운전자 - 자동차
- 공연무대 - 배우
- 키보드 / 마우스 / 세상 표준 인터페이스들
- 정렬 알고리즘(역할은 같고 내부 성능개선이 이루어져도 같은 역할을 할것으로 기대)
- 할인 정책 로직
3. 자바 언어
3-1) 자바에서의 다형성 ①
- 자바언어의 다형성을 활용
- 역할 = 인터페이스
- 구현 = 인터페이스를 구현한 클래스 OR 구현 객체
※ 일반 상속관계도 역할/구현 구분이 가능하지만 상속은 단일 상속만 되는 차이점 존재 - 객체를 설계할 때 "역할" / "구현"을 명확히 분리
- 객체 설계시 역할(인터페이스)를 먼저 부여하고, 그 역할 수행의 객체를 생성
- 이 때, 추상화를 통해 일반적인 공통 개념을 객체로 구현하도록 한다
(ex 차량의 경우 honda, tesla 등의 variation이 있지만, 문짝과 네 바퀴같은 특성을 먼저 구현)
3-2) 자바에서의 다형성 ②
- 오버라이딩 : 상속 자식에서 메써드를 재정의함
- 오버로딩 : 같은 메써드를 여러번 정의하여 용도에 따라 사용하도록 하는 것
- 오버리이딩은 자바 기본 문법
- 다형성으로 인터페이스를 구현한 객체를 실행 시점에 메써드 / 객체 동작을 변경할 수 있음
- 마찬가지로 클래스-상속 관계에서도 다형성 and 오버라이딩 적용 가능
3-3) 클라이언트 의존
클라이언트는 memberRepository에 의존적 → 무엇인지 인지하고 있는 상태
다형성에 의해 유사한 역할을 하는것에 대해 위와 같이 다형성을 이용해 구현할 수 있음
4. 객체
4-1) 객체와 협력
> 3번에서 연장
혼자 있는 객체는 없음( 자명, 객체로 구분될 시 '나'란 객체와 '외부'로 구분되므로 )
ex) 클라이언트 : 요청, 서버 : 응답
- 수 많은 객체-클라이언트와 객체-서버는 서로 협력 관계로 묘사될 수 있음
4-2) 다형성의 본질
> 3번에서 연장
- 객체 인스턴스를 실행 시점에 유연하게 변경할 수 있음
- 다형성을 이해하려면, "협력"이라는 객체사이의 관계에서 시작해야 한다
- 클라이언트를 변경하지 않고, 서버의 구현 기능을 유연하게 변경할 수 있음
- 빌드 패턴 등을 사용하여 MemberRepository가 보고있는 객체를 유연하게 변경하여
메모리에만 저장하거나 알맞은 db 변경을 위한 객체를 그때그때 호출할 수 있음
5. Java 다형성 정리
5-1) 정리 & 장점
- 역할과 구현의 구분이라는 편리한 컨셉을 다형성을 통해 자바 객체로 구현할 수 있음
역할 + 구현 ≒ 다형성(하나의 방법으로 많은 상황에 대처)
≒ 자바(인터페이스/상속 + 오버라이딩) [※ 인터페이스 : 역할 == 오버라이딩-메서드 : 구현] - (1)번에 의해 유연하고, 변경 용이, 확장이 가능
또 클라이언트에 영향이 거의 없음 - 이를 위해 [인터페이스(역할)/추상화]를 안정적으로 잘 설계해서, 차후에 갑자기 인터페이스 메서드 추가를 하는
불상사가 없어야 함
→ 인터페이스 매서드 추가시 "역할"을 "구현"하는 구현부를 마찬가지로 바꿔주어야 하므로
5-2) 단점
- 인터페이스(역할) 자체가 변하면 클라이언트, 서버 모두 큰 변경이 발생
- 자동차를 비행기로?
- 역할(대본)이 변경된다면?
- USB 인터페이스가 변경된다면?...
6. 스프링과 객체지향(OOP)
> 추캡상다
- 다형성이 가장 중요 + SOLID
- 스프링은 다형성을 극대화해서 이용할 수 있게 도와줌
- (1) 제어의 역전(IoC)
(2) 의존관계 주입(DI) - DI 컨테이너
은 다형성을 활용해서 역할과 구현을 편리하게 다룰 수 있도록 지원 - 스프링을 통해 역할에 대한 "구현의 편리성"을 보장받을 수 있음
참조
목차 : 객체지향 설계와 스프링
- 좋은 객체 지향 프로그래밍이란?반응형'자바 Study > Spring - 핵심원리' 카테고리의 다른 글
(5) 객체 지향 설계와 스프링 (0) 2021.07.22 (4) 좋은 객체지향 설계 5원칙 (SOLID) (0) 2021.07.20 (2) 강의 입문 (0) 2021.07.10 (1) 강의 입문 (0) 2021.07.10