객체 지향 프로그래밍이란
- 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다.
- 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다.
- 객체지향 프로그래밍은 프로그램을 유연하고 변경을 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용된다.
-> 컴포넌트를 쉽고 유연하게 변경하면서 개발할 수 있는 방법
객체 지향의 핵심 원리
1. 다형성
프로그램 언어의 다형성은 그 프로그래밍 언어의 자료형 체계의 성질을 나타내는 것으로, 프로그램 언어의 각 요소들이 다양한 자료형에 속하는 것이 허가되는 성질을 가리킨다.

다형성은 역할과 구현을 분리하는 것에서 출발한다.
자동차의 역할을 하는 인터페이스가 있다면 클라이언트는 내부 구조를 몰라도 같은 기능을 하는 객체를 마음껏 골라서 쓸 수가 있다. 클라이언트는 구현 대상의 내부 구조가 변경되어도 영향을 받지 않으며, 구현 대상 자체를 변경해도 영향을 받지 않는다. 새로운 기능을 하는 객체를 무한히 만들 수 있게 되는 것이다.
이러한 특성이 객체 지향 프로그래밍을 유연하고 변경이 쉽게 만들어준다.
여기서 역할은 인터페이스를 뜻하고, 기능 즉 구현은 인터페이스를 구현한 클래스, 구현 객체를 뜻한다.
객체를 설계할 때 역할과 구현을 명확히 분리하는 것, 역할을 먼저 부여하고 그 역할을 수행하는 구현 객체를 만드는 것이
다형성이다.
-> 인터페이스를 구현한 객체 인스턴스를 실행 시점에서 유연하게 변경할 수 있다.
-> 클라이언트를 변경하지 않고 서버의 기능을 변경 가능하다.
자바 언어의 다형성
- 오버라이딩이란
메소드 오버라이딩, 은 객체 지향 프로그래밍에서 서브클래스 또는 자식 클래스가 자신의 슈퍼클래스들 또는 부모 클래스들 중 하나에 의해 이미 제공된 메소드를 특정한 형태로 구현하는 것을 제공하는 언어의 특징이다.
즉 부모 클래스로부터 상속받은 메소드를 자식 클래스에서 재정의하여 사용하는 것이 허용되는 것이다.
2. 캡슐화
캡슐화는 객체 지향 프로그래밍에서 다음 2가지 측면이 있다: 객체의 속성과 행위를 하나로 묶고, 실제 구현 내용 일부를 외부에 감추어 은닉한다.
연관 있는 변수와 함수를 클래스로 묶는 작업을 말한다. 클래스에 담는 내용 중 중요한 데이터나 기능을 외부에서 접근하지 못하게 하는 은닉성을 제공한다.
- public
- protected
- private
3. 상속
상속(inheritance)은 객체들 간의 관계를 구축하는 방법이다. 클래스로 객체가 정의되는 고전 상속에서, 클래스는 기반 클래스, 수퍼클래스, 또는 부모 클래스 등의 기존의 클래스로부터 속성과 동작을 상속받을 수 있다. 그 결과로 생기는 클래스를 파생 클래스, 서브클래스, 또는 자식 클래스라고 한다. 상속을 통한 클래스들의 관계는 계층을 형성한다.
SOLID
- 좋은 객체 지향 설계의 5가지 원칙
1. SRP(Single Responsibility Principle) , 단일 책임 원칙
- 한 클래스는 하나의 책임만 가져야 한다.
- 중요한 기준은 변경이다, 변경이 있을 때 파급 효과가 적으면 단일 책임 원칙을 잘 지킨 것이다.
ex) UI 변경, 객체의 생성과 사용을 분리
2. OCP(Open/Closed Principle) , 개방-폐쇄 원칙
- 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.
- 인터페이스를 구현한 새로운 클래스를 다시 만들어서 새로운 기능을 구현하는 것 (다형성)
클라이언트가 구현 클래스를 직접 선택 할 때, 구현 객체를 변경하려면 클라이언트 코드를 변경해야 한다.
다형성을 사용한 것은 맞지만 OCP 원칙을 지킬 수가 없어지게 된다
-> 객체를 생성하고, 연관관게를 맺어주는 별도의 조립, 설정자가 필요하다! => 스프링 컨테이너
3. LSP(LIskov substitution principle) , 리스코프 치환 원칙
- 프로그램 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.
- 다형성에서 하위 클래스는 인터페이스 규약을 다 지켜야 한다.
- 다형성을 지원하기 위한 원칙, 인터페이스를 구현한 구현체를 믿고 사용할 수 있게 하는 원칙.
4. ISP(Interface segregation principle) , 인터페이스 분리 원칙
- 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.
- 인터페이스를 분리하면 인터페이스 자체가 변해도 운전자 클라이언트에 영향을 주지 않음
- 인터페이스가 명확해지고, 대체 가능성이 높아진다
5. DIP(Dependency inversion principle) , 의존관계 역전 원칙
- 프로그래머는 "추상화에 의존해야지, 구체화에 의존하면 안된다"
- 의존성 주입은 이 원칙을 따르는 방법 중 하나이다.
- 구현 클래스에 의존하지 않고 인터페이스에 의존해야 한다는 뜻.
- 다형성에서 역할에 의존해야 한다는 개념과 같은 의미이다. 구현체에 의존하게 되면 변경이 어려워지기 때문이다.
다형성 만으로는 구현 객체를 변경할 떄 클라이언트 코드도 함께 변경되기 때문에, OCP와 DIP를 지킬 수가 없다.
스프링과 객체 지향
- 스프링은 다형성을 극대화해서 이용할 수 있게 도와준다
-스프링은 DI와 DI 컨테이너로 OCP, DIP를 가능하게 지원해준다
DI(Dependency Injection) : 의존관계, 의존성 주입
DI 컨테이너 제공
- IoC, DI 는 다형성을 활용해서 역할과 구현을 편리하게 다룰 수 있도록 지원한다
'CSE > Spring' 카테고리의 다른 글
| Spring이 제공하는 싱글톤 컨테이너 (0) | 2021.03.01 |
|---|---|
| IoC, DI, 컨테이너 (0) | 2021.02.24 |
| AppConfig - 애플리케이션 동작 방식을 Configuration ! (0) | 2021.02.22 |
| 기본적인 자바 문법 + IntelliJ 단축키 @계속 추가 예정 (0) | 2021.02.20 |
| Spring 공부 1일차 - IntelliJ로 스프링 시작하기 (0) | 2021.01.09 |