스프링과 객체 지향 프로그래밍 - 다형성 관점
객체 지향 프로그래밍
프로그램을 유연하고 변경이 용이하게 만들음. → 대규모 소프트웨어 개발에 많이 사용.
컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나,
여러개의 독립된 단위,
즉 "객체들의 모임"으로 파악하고자 하는 것.
각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있음.
역할과 구현의 분리
세상을,
역할 & 구현으로 구분해보자.
→ 세상이 단순해지고, 유연해지며, 변경도 편리해진다!
클라이언트에게는 다음의 장점이 있다.
- 대상의 역할(인터페이스)만 알면 된다. (이거 자동차?ㅇㅇ 그럼 됐음. 운전 가능.)
- 구현 대상의 내부 구조를 몰라도 된다. (내부구조 알아야만 운전을 할 수 있는게 아니니까)
- 구현 대상의 내부 구조가 변경되어도 영향을 받지 않는다. (내부구조 바뀌어도 자동차 역할만 하면 됨)
- 구현 대상 자체를 변경해도 영향을 받지 않는다. (k5나, 아반떼나~ 노상관)
자바 언어를
역할 & 구현으로 구분해보자.
실세계의 '역할·구현'이라는 편리한 컨셉을, 다형성을 통해 객체 세상으로 가져올 수 있다.
이제, 자바 언어의 다형성을 활용하여 객체 세상으로 가져와보자.
역할 = 인터페이스
구현 = 인터페이스를 구현한 클래스, 구현 객체.
객체 설계시 역할과 구현을 명확히 분리하여 설계할것.
→ 역할(인터페이스)을 먼저 부여하고, 그 역할을 수행하는 구현 객체 만들것. (중요도 : 역할 >>>> 구현)
→ 먼저, 인터페이스를 안정적으로 잘 설계할것.
위 분리를 통해 다음의 장점을 얻을 수 있다.
- 유연하고, 변경이 용이하다.
- 확장 가능한 설계.
- 클라이언트에게 영향을 주지 않는 변경이 가능하다.
한계
역할(인터페이스) 자체가 변하면, 클라이언트, 서버 모두에 큰 변경이 발생한다.
ex) 자동차가 비행기가 된다?(기능, 운전기사,···) / 연극 자체가 변경된다?(대본,배우,···) / USB 인터페이스
∴ 인터페이스를 안정적으로 잘 설계하는 것이 중요하다.(변화가 없는 방식으로 설계, 변화있더라도 인터페이스 자체는 안흔들리게)
다형성
자바 언어의 다형성 = 객체지향의 꽃
{ 오버로딩 : 메서드를 여러개 정의한다. ("여러개 많이, 초과해서 로딩했다.") }
오버라이딩 : 메서드를 재정의한다. ("기능을 타서 넘어버린다.")
메서드 실행시 오버라이딩 된 메서드가 실행됨.
다형성으로 인터페이스를 구현한 객체를 실행 시점에 유연하게 변경 가능.
(물론, 클래스 상속 관계도 다형성, 오버라이딩 적용 가능.)
다형성의 본질
인터페이스를 구현한, 객체 인스턴스를 실행 시점에 유연하게 변경할 수 있다.
클라이언트를 변경하지 않고, 서버의 구현 기능을 유연하게 변경할 수 있다.
다형성 본질을 이해하려면 '협력'이라는 객체사이의 관계에서 시작해야한다.
객체의 협력 관계
혼자 있는 객체는 없다.
클라이언트 : 요청
서버 : 응답
수많은 '객체 클라이언트'와 '객체 서버'는 서로 협력 관계를 가진다.
스프링과 객체 지향
'객체지향'에서는 '다형성'이 가장 중요하다.
'스프링'의 사용으로 '구현을 편리하게 변경'할 수 있다.
스프링은 다형성을 극대화해서 이용할 수 있게 도와준다(역할과 구현을 편리하게 다룰 수 있도록 지원한다.)
→ 제어의 역전(IoC)과 의존관계 주입(DI)
근데 사실 다형성말고 중요한게 하나 더 있음ㅋ
그게 뭐냐면,,,
설계 원칙 다섯가지, 'SOLID'.....
는 다음편에~~