[Spring] 객체지향 프로그래밍
객체지향 프로그래밍
정의
Object-oriented programming (OOP) is a computer programming model that organizes software design around data, or objects, rather than functions and logic. An object can be defined as a data field that has unique attributes and behavior.
객체지향 프로그래밍은 기능과 로직보다는 데이터, 객체를 중심으로 소프트웨어를 설계하는 컴퓨터 프로그래밍 모델을 말한다. 여기서 말하는 객체는 고유한 속성(필드)과 동작(메소드)을 가진다.
특성
추상화 (Abstraction)
여러 가지 사물이나 개념에서 핵심적인 속성, 기능들을 추출하는 작업을 말한다.
스마트폰을 생각해보자. 현재 우리가 사용하는 스마트폰의 종류는 굉장히 많다. (아이폰 시리즈, 갤럭시 .. etc)
각각을 모두 클래스로 만들고 맴버 변수, 메소드를 각각 만드는 것은 효율적이지 않다. 때문에 공통되는 것을 추출하고 추상화하는 것이 좋다.
스마트폰의 기종이 다르더라도 전원, 메시지, 전화 기능과 같은 것은 동일할 것이다. 이들을 추출하여 클래스로 묶는 것을 추상화라고 생각하면 된다.
캡슐화 (Encapsulation)
데이터, 함수를 클래스 안에 담고 사용자가 사용할 수 있는 부분만 외부에 노출하고 나머지는 내부에 감추는 것을 말한다.
우리가 컴퓨터 게임을 하는데 컴퓨터 내부 동작을 알아야 한다면 어떨까? 듣기만 해도 어지럽다. 우리는 컴퓨터 내부 동작을 몰라도 게임을 하고 싶을 것이다. 캡슐화는 이런 외부에 노출될 필요가 없는 데이터(여기서는 내부 동작)를 감추고 필요한 정보(게임 화면)만 외부로 노출하는 기법을 의미한다.
상속 (Inheritance)
대상을 객체로 추상화할 때, 기존에 구현한 클래스를 재활용하는 것을 말한다.
학생이라는 클래스를 생각해보자. 학생은 이름과 나이, 취미라는 맴버 변수가 있다. 우리는 여기에 대학생이라는 클래스를 추가하려 한다.
그리고 대학생은 이름, 나이, 취미, 학과라는 필드를 가진다고 가정하자. 여기서 대학생을 학생을 상속하여 만들게 되면 학생의 속성을 물려받고 학과라는 기능만 추가하여 손쉽게 확장할 수 있다. 이와 같이 기존의 코드를 재사용하여 손쉽게 확장할 수 있게 하는 개념이 상속이다.
다형성 (Polymorphism)
객체의 속성이나 기능이 상황에 따라 다양한 형태로 변할 수 있는 것을 말한다.
다형성은 오버로딩과 오버라이딩으로 실현한다.
오버로딩은 메소드 이름은 같지만 다른 동작을 하게 하는 것을 의미한다. 오버로딩은 매개변수, 리턴타입을 통해 구분된다.
오버라이딩은 부모 클래스의 메소드를 자식 클래스에서 재정의 함으로써 적용할 수 있다.
SOLID
이제 SOLID 설계 원칙에 대해서 알아보자.
SOLID는 이해하기 쉽고, 유연하며, 유지 보수가 쉬운 소프트웨어 개발을 위한 설계 원칙이다.
단일 책임 원칙 (SRP)
SRP는 각 객체는 하나의 책임만 가져야 한다는 원칙이다. 클래스의 역할을 한 가지로 구성함으로써 변경파급을 낮춘다.
개방-폐쇄 원칙 (OCP)
OCP는 기존의 코드를 수정하지 않고 시스템을 확장할 수 있어야 한다는 원칙이다. 변경되지 않는 부분(Closed)와 변경될 부분(Open)을 잘 분리해서 설계하는 것이 중요하다.
리스코프 치환 원칙 (LSP)
자식 클래스는 부모 클래스를 대체할 수 있어야 한다는 원칙이다. 부모 클래스 객체 대신에 자식 클래스 또는 후손 클래스 객체를 사용했을 때 문제없이 프로그램이 동작해야 한다.
인터페이스 분리 원칙 (ISP)
여러 클라이언트에 필요한 기능을 가지고 있는 일반화된 인터페이스보다는 각 클라이언트에 특화된 인터페이스를 사용하라는 원칙이다.
의존 역전 원칙 (DIP)
기능을 직접 구현한 구체 클래스 또는 함수 보다는 추상 클래스나 인터페이스를 사용해야 한다.
구체 클래스(A)가 구체 클래스(B)를 의존하게 되면 B가 변경되면 A를 변경해야 한다. 하지만 구체 클래스(A)가 인터페이스(C)에 의존하게 되면 C의 구현체가 변경되도 A를 변경할 필요가 없다.
스프링의 역할
스프링은 위에서 설명한 객체지향 특성과 SOLID 원칙을 통해 좋은 객체 지향 애플리케이션을 만들 수 있게 도와주는 프레임워크이다.