[CS] 12. 객체지향, 절차지향, 함수형 프로그래밍
순차적, 비구조적 프로그래밍
단어 그대로 순차적으로 프로그래밍을 하는 것을 순차적 프로그래밍이라고 한다. 필요한 게 있으면 계속 순서대로 추가해가며 구현하는 방식이다. 이러한 비구조적 프로그래밍에서는 goto문을 이용한다. 이러한 방식은 직관적이긴 하지만 코드 규모가 커질수록 유지보수가 매우 힘들다는 단점이 존재한다.
절차적, 구조적 프로그래밍
반복될 가능성이 있는 것들을 재사용할 수 있도록 함수(프로시저)로 만들어 사용하는 프로그래밍 방식을 의미한다. 절차 지향 프로그래밍에서는 코드를 함수(function) 또는 서브루틴(subroutine)으로 나누어 작성한다. 이 함수와 서브루틴은 각각 명령문을 수행하는 블록으로, 순차적으로 실행된다. 또한, 변수(variable)를 사용하여 데이터를 저장하고 처리할 수 있다. 절차 지향 프로그래밍은 데이터와 처리를 분리하여 프로그램의 구조화를 쉽게 할 수 있으며, 빠르고 효율적인 코드를 작성할 수 있다. 또한, 하드웨어에 가까운 접근이 가능하여 하드웨어 제어나 시스템 프로그래밍 등에 적합하다.
이러한 패러다임은 너무 추상적인 것에 비해 실제 사용하는 프로그램은 추상적이지만은 않다. 실제 데이터에 해당하는 변수와 상수 값들이 물리적 요소로 되어있기 때문이다. 절차 지향 프로그램은 특정한 개념의 함수와 자료형을 함께 묶어서 관리할 수 없다. 또한 코드의 재사용성이 낮고 유지 보수성이 떨어질 수 있으며, 코드의 크기가 커질수록 코드의 이해와 관리가 어렵다는 단점이 존재한다.
객체 지향 프로그래밍(Object-Oriented Programming, OOP)
객체 지향 프로그래밍은 객체, 클래스, 상속 등의 개념을 기반으로 한다. 객체는 현실 세계의 대상을 모델 링한 것으로, 객체 내부에 자료형(필드)와 함수(메소드)가 같이 존재한다. 클래스는 이러한 객체를 정의한다. 모든 논리적, 물리적 요소를 객체로 만드려는 것이 객체 지향 프로그래밍이다. 객체지향으로 구현하게 되면, 객체 간 독립성이 생기고, 중복 코드의 양이 줄어들며, 유지보수에 유리하다는 장점이 존재한다. Java, Python, C++, Ruby 등이 객체 지향 프로그래밍 언어이다.
객체 지향 프로그래밍의 특징
1. 추상화
공통적인 특성을 파악한 후 하나의 집합으로 만들어내는 것을 추상화라고 한다.
2. 캡슐화
낮은 결합도를 유지할 수 있도록 설계하는 것을 말한다. 즉, 한 곳에서 변화가 일어나도 다른 곳에 미치는 영향을 최소화하는 것을 말한다. 객체 안의 모듈의 요소가 밀접한 관련이 있는 것으로 구성해 응집도를 높이고 결합도를 줄여야 요구사항 변경에 대처하는 좋은 설계 방법이다. (객체 안 필드를 선언할 때 private로 선언하여 외부에서 접근하지 못하도록 한다.)
3. 다형성
서로 다른 유형의 객체가 같은 메세지를 받았을 때 각자의 방식으로 동작하는 능력을 의미한다. 부모 클래스의 메소드를 자식 클래스가 오버라이딩해 자신의 역할에 맞게 사용하는 것이 다형성이다.
4. 상속
여러 개체들이 지닌 공통 특성을 부각시켜 하나의 법칙이나 개념으로 성립하는 과정을 말한다. 자식 클래스를 외부로부터 숨기는 캡슐화의 일종이라고도 할 수 있다. 상속을 하면 상위 클래스의 변경에 어려움을 겪고, 불필요한 클래스가 증가할 수 있다. 또한 상속이 잘못 사용될 수 있다는 단점이 존재한다. 상속은 재사용의 관점이 아닌, 기능의 확장 관점일 때 이용하는 것이 좋다.
객체 지향 설계 과정
- 제공해야 할 기능을 찾고 세분화 후 그 기능을 알맞은 객체에 할당한다.
- 기능을 구현하는데 필요한 데이터를 객체에 추가한다.
- 데이터를 이용하는 기능을 캡슐화하여 구현한다.
- 객체 간 어떻게 메소드 요청을 주고 받을지 결정한다.
객체 지향 설계 원칙
SOLID라고 부르는 5가지 설계 원칙이 존재한다.
1. SRP(Single Responsibility) - 단일 책임 원칙
클래스를 변경하는 이유는 단 하나여야 한다. 이를 지키지 않으면, 한 책임의 변경에 의해 다른 책임과 관련된 코드에 영향이 갈 수 있다.
2.OCP(Open-Closed) - 개방-폐쇄 원칙
활장에는 열려 있어야 하고, 변경에는 닫혀 있어야 한다. 기능을 변경하거나 확장할 수 있으면서, 그 기능을 사용하는 코드는 수정하지 않는다.
3. LSP(Liskov Substitution) - 리스코프 치환 원칙
상위 타입의 객체를 하위 타입의 객체로 치환해도, 상위 타입을 사용하는 프로그램은 정상적으로 동작해야 한다는 원칙이다. 상속 관계가 아닌 클래스들을 상속 관계로 설정하게 되면, 이 원칙을 위배하게 된다.
4. ISP(Interface Segregation) - 인터페이스 분리 원칙
각 클라이언트가 필요로 하는 인터페이스들을 분리함으로써, 각 클라이언트가 사용하지 않는 인터페이스에 변경이 발생하더라도 영향을 받지 않도록 만들어야 한다.
5. DIP(Dependency Inversion) - 의존 역전 원칙
고수준 모듈은 저수준 모듈의 구현에 의존해서는 안된다. 저수준 모듈이 고수준 모듈에서 정의한 추상 타입에 의존해야 한다는 것을 의미한다. 즉, 저수준 모듈이 변경되어도 고수준 모듈은 변경할 필요가 없다
함수형 프로그래밍
순수 함수를 조합하고 공유 상태, 변경 가능한 데이터 및 부작용을 피해 소프트웨어를 만드는 프로세스이다. '선언형' 프로그래밍으로, 어플리케이션의 상태는 순수 함수를 통해 전달된다. 부수효과(주어진 값 외의 외부 변수 및 프로그래밍 실행에 영향을 끼치는 것)를 없애고 순수 함수(반드시 하나 이상의 인자를 받고, 받은 인자를 처리해 결과물을 돌려주는 것. 인자 외 다른 변수를 사용하지 않는다)를 만들어 모듈화 수준을 높이는 프로그래밍 패러다임을 말한다.
구현한 사람이 무엇을 구현했는지 명확히 알 수 있다는 장점이 존재한다.
명령형 프로그래밍(절차지향, 객체지향)
상태와 상태를 변경시키는 관점에서 연산을 설명하는 방식으로, 알고리즘을 명시하고 목표는 명시하지 않는다
선언형 프로그래밍
알고리즘을 명시하지 않고 목표를 명시
대표적인 Javascript 함수형 프로그래밍 함수는 map, filter, reduce가 있다.
Reference
https://gyoogle.dev/blog/computer-science/software-engineering/Object-Oriented%20Programming.html
객체지향 프로그래밍 | 👨🏻💻 Tech Interview
객체지향 프로그래밍 보통 OOP라고 많이 부른다. 객체지향은 수 없이 많이 들어왔지만, 이게 뭔지 설명해달라고 하면 말문이 막힐 때가 많다. 개념부터 살펴보자. 객체지향 패러다임이 나오기 이
gyoogle.dev
https://gyoogle.dev/blog/computer-science/software-engineering/Fuctional%20Programming.html
함수형 프로그래밍 | 👨🏻💻 Tech Interview
함수형 프로그래밍 순수 함수를 조합하고 공유 상태, 변경 가능한 데이터 및 부작용을 피해 소프트웨어를 만드는 프로세스 '선언형' 프로그래밍으로, 애플리케이션의 상태는 순수 함수를 통해
gyoogle.dev
'CS' 카테고리의 다른 글
| [CS]14. 디자인 패턴 & UML 다이어그램 (0) | 2023.05.11 |
|---|---|
| [CS] 13. Agile 방법론 (0) | 2023.04.25 |
| [CS] 11. 선형 자료 구조 (0) | 2023.04.13 |
| [CS] 10. DB 정규화 (0) | 2023.04.05 |
| [CS] 9. 트랜잭션, 쿼리문 정리 (0) | 2023.03.30 |
