Java 좋은 객체 지향 프로그래밍 설계하기 요약
좋은 객체 지향 프로그래밍 요약
객체 지향 특징
- 상속
- 캡슐화
- 추상화
- 다형성
객체 지향이란?
- 컴퓨터 프로그램 명령어의 목록을 시각에서 벗어나 여러 개의 독립된 단위로 묶음.
- 객체에 추상화하여 객체들의 모임을 파악.
- 데이터 뿐 아니라 협력하여 기능을 처리함
- 객체 지향 프로그램은 유연하며 변경에 용이.
- 대규모 소프트웨어 개발에 사용
유연하고 변경 가능한 객체지향?
- 레고 조립과 같다
- 부품을 갈아 끼우는 설계가 있다.
- 컴포넌트 단위로 유연하게 변경하며 개발하기
객체 지향의 핵심은? - 다형성
다형성에 대해서 알아보기
실세계 비유
- 실물과 객체는 1:1 매칭X
- 객체 지향은 추상적으로 우리가 필요한 기능과 기능 처리에 필요한 데이터만으로 충분하다.
- 객체는 예시와 비유로 이해하는 것이 좋다.
- 객체를 바라보면 어떠한 기능을 수행 또는 동작할 것인지 예상할 수 있는 것이 좋다.
- 역할 과 구현으로 세상을 구분
- 객체 지향은 역할의 주체를 언제든 바꿀 수 있다.
- 동작을 세부적으로 구현한다.
실세계 비유 예시
- 운전자 - 자동차
- 운전자는 역할을 나타내고, 자동차의 엑셀, 브레이크가 구현을 나타낸다.
- 공연 무대
- 배우는 역할을 나타내고, 대사와 동작은 구현을 나타낸다.
- 표준 인터페이스
- 역할로 USB 단자를 가리키고, 키보드와 마우스 동작이 구현을 나타낸다.
- 정렬 알고리즘
- 역할로 알고리즘을 가리키고, 구현은 정렬한다.
- 더 빠른 정렬할 수 있는 로직이 있다면 구현만 바꾸면 된다.
- 할인 정책 로직
- 역할로 쿠폰을 가리키고, 구현은 고정 할인 금액, 차등 할인을 제공한다.
역할과 구현 분리
역할과 구현을 구분하면 단순해지며, 유연하고, 변경이 편리하다.
역할과 구현 분리의 장점
- 클라이언트는 역할만 알면 된다.
- 클라이언트는 구현 대상의 내부 구조를 몰라도 된다.
- 클라이언트는 구현 대상의 내부 구조가 변경되어도 영향을 받지 않아야 한다.
- 클라이언트는 대상 자체를 변경하여도 영향을 받지 않아야 한다.
자바에서의 역할과 구현 다형성 활용
- 역할 = 인터페이스
- 구현 = 인터페이스를 구현한 클래스와 구현 객체
- 객체를 설계한 경우 역할과 구현을 명확하게 분리
- 객체 설계는 인터페이스를 부여하며 그 부여된 인터페이스를 수행하는 구현 객체 만들기
객체의 협력 관계
- 혼자만의 객체는 없다.
- 클라이언트: 객체 요청
- 서버: 객체 응답
- 객체의 클라이언트와 서버는 서로 간 협력 관계
다형성 본질
- 인터페이스를 구현한 객체를 실행 시점에 유연하게 변경
- 협력이라는 객체 사이의 관계 확립
- 클라이언트는 변경되지 않고, 서버의 구현 기능을 유연하게 변경
자바 언어가 제공하는 다형성
- 다형적 참조와 메소드 오버라이딩
- 자바가 다형성을 이루게 하는 것이 오버라이딩
- 다형성으로 인터페이스로 구현한 객체를 실행 시점에 유연하게 변경
- 상속 관계 또한 오버라이딩을 제공
정리
- 실세계 역할 과 구현 컨셉으로 다형성을 통한 객체 세상
- 유연하고 변경 용이
- 확장 가능한 설계
- 클라이언트에 영향을 주지 않는 변경 서비스
- 인터페이스가 안정적인 설계
한계
- 인터페이스가 바뀌면 클라이언트, 서버 모두 큰 변경 발생
- 자동차를 없애고 비행기를 도입한 경우?
- 라이센스 재구매
- 대본 스크립트가 변경된 경우?
- 다시 학습
- USB 인터페이스가 변경된 경우?
- USB-3 키보드 생산 중단하고, USB-C 키보드 신규 제작 필요
- 인터페이스를 안정적으로 잘 설계하도록 한다.
스프링 부트에서는?
- 다형성으로 이루어진 프레임워크
- 디자인 패턴 대부분이 다형성을 활용
- 스프링의 핵심인 제어의 역전(IoC), 의존관계 주입(DI) 또한 다형성 활용
- 스프링은 레고 조립하듯, 무대 배우를 선택하듯이 구현을 편리하게 변경