
프로그래밍 패러다임이란?
- 프로그래밍이나 소프트웨어 개발에 접근하는 특정한 방식, 철학 또는 관점
- 프로그래밍 언어는 하나 이상의 프로그래밍 패러다임을 지원
선언형 프로그래밍
- 프로그램이 “어떻게” 해야 하는지를 나타내기보다 “무엇”과 같은지가 중점
- “프로그램은 함수로 이루어진 것이다.” 라는 명제가 담겨 있음
- 선언형 프로그래밍의 한 종류로 함수형 프로그래밍이 있음
함수형 프로그래밍(Functional Programming)

- 자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임
- 순수한 함수를 작성하고 공유된 상태와 변경 가능한 데이터 및 부작용을 피해 소프트웨어를 작성하는 프로세스
- 대입문이 없는 프로그래밍 - Clean Code의 저자 Robert C.Martin
함수형 프로그래밍의 특징
부수 효과가 없는 순수 함수를 1급 객체로 간주하여 파라미터나 반환값으로 사용할 수 있으며, 참조 투명성을 지킬 수 있다.
부수 효과(Side Effect)
- 다음과 같은 변화 또는 변화가 발생하는 작업
- 변수의 값 변경
- 자료 구조를 제자리에서 수정
- 객체의 필드값을 설정
- 예외나 오류가 발생하며 실행이 중단
- 콘솔 또는 파일 I/O가 발생
순수 함수(Pure Function)
- 부수 효과가 없는 함수
- 함수의 실행이 외부에 영향을 끼치지 않는 함수
참조 투명성(Referential Transparency)
- 프로그램의 변경 없이 어떤 표현식을 값으로 대체할 수 있다는 의미
- 같은 입력에 있어서 항상 동일한 출력을 냄
불변성(Immutable)
- 함수 외부에서 데이터를 수정하지 않음
- 함수의 계산을 수행하는 동안 변수에 할당된 값들이 절대 변하지 않음
일급 객체(First-Class Object, First-Class Citizen)
- 다음과 같은 것들이 가능한 객체를 의미
- 변수나 데이터 구조 안에 담을 수 있음
- 파라미터로 전달 가능
- 반환값으로 사용 가능
- 할당에 사용된 이름과 무관하게 고유한 구별이 가능
- 함수형 프로그래밍에서 함수는 1급 객체로 취급
고차 함수(High Order Function)
- 함수를 다루는 함수
- 함수의 인자로 함수 전달 가능
- 함수의 리턴 값으로 함수 사용 가능
익명 함수(Anonymous Function)
- 이름이 없는 함수
- 람다식으로 표현되는 함수 구현
함수형 프로그래밍의 장점
- 높은 수준의 추상화 제공
- 함수 단위의 코드 재사용성이 높음
- 사용하는 모든 데이터가 변경 불가능(immutable)하고 함수는 부수 효과를 가지고 있지 않기 때문에 동시성과 관련된 문제를 원천적으로 차단
- 테스트가 쉽고 가독성이 좋아 유지보수가 용이함
함수형 프로그래밍의 단점
- 높은 수준의 추상화로 코드의 이해가 어려울 수 있음
- 불변성과 순수 함수를 사용해 상태 변경을 최소화하기 때문에 성능 면에서 좋지 않을 수 있음
- 명령형 프로그래밍과 상당히 다른 개념과 접근 방식이므로 러닝 커브가 존재
명령형 프로그래밍
- 프로그램이 “무엇을” 해야 하는지를 나타내기보다 “어떻게” 해야 하는지가 중점
- 선언형 프로그래밍에는 객체 지향 프로그래밍, 절차적 프로그래밍이 있음
객체 지향 프로그래밍(Object Oriented Programming)

- 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위인 “객체”의 모임으로 파악하는 패러다임
- 프로그래밍에서 필요한 데이터를 추상화시켜 상태(변수)와 행위(메소드)를 가진 객체를 만들고, 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법
객체 지향 프로그래밍의 특징

추상화
- 객체의 공통적인 속성과 기능을 추출하여 정의하는 것
- Java에서는 추상 클래스와 인터페이스를 통해 추상화를 구현할 수 있음
캡슐화
- 서로 연관 있는 속성과 기능들을 하나의 캡슐로 만들어 데이터를 외부로부터 보호하는 것
- 캡슐화의 목적
- 데이터 보호 - 외부로부터 클래스에 정의된 속성과 기능을 보호
- 데이터 은닉 - 내부의 동작을 감추고 외부에는 필요한 부분만 노출
- Java에서는 Class의 접근 제어자와 Getter/Setter 등으로 캡슐화를 구현할 수 있음
상속
- 기존의 객체의 속성과 기능을 그대로 이어받아 사용할 수 있게 하고, 기능의 일부분을 변경 및 확장하는 것
- 코드의 재사용성, 유지보수성이 증가하고 중복이 줄어듦
- Java에서는 extends 키워드를 통해 상속이 가능
다형성
- 어떤 객체의 속성이나 기능이 상황에 따라 여러 가지 형태를 가질 수 있는 성질
- Java에서는 오버라이딩과 오버로딩이 다형성을 구현하는 대표적인 방식
- 오버라이딩(Overriding) : 부모클래스의 메소드와 같은 이름, 매개변수를 재정의하는 것
- 오버로딩(Overloading) : 같은 이름의 함수를 여러 개 정의하고, 매개변수의 타입과 개수를 다르게 하여 매개변수에 따라 다르게 호출할 수 있게 하는 것
객체 지향 프로그래밍의 5가지 설계 원칙
SOLID

- SRP(Single Responsibility Principle, 단일 책임 원칙) : 클래스는 단 하나의 목적을 가져야 하며, 클래스를 변경하는 이유는 단 하나의 이유여야 한다.
- OCP(Open-Closed Principle, 개방-폐쇄 원칙) : 클래스는 확장에는 열려 있고, 변경헤는 닫혀 있어야 한다.
- LSP(Liskov’s Substitution Principle, 리스코프 치환 원칙) : 상위 타입의 객체를 하위 타입으로 바꾸어도 프로그램은 일관되게 동작해야 한다.
- ISP(Interface Segregation Principle, 인터페이스 분리 원칙) : 클라이언트는 이용하지 않는 메소드에 의존하지 않도록 인터페이스를 분리해야 한다.
- DIP(Dependency Inversion Principle, 의존관계 역전 법칙) : 클라이언트는 추상화(인터페이스)에 의존해야 하며, 구체화(구현 클래스)에 의존하면 안된다.
객체 지향 프로그래밍의 장점
- 코드의 재사용성이 높음
- 유지보수가 용이함
- 테스트가 쉬움
객체 지향 프로그래밍의 단점
- 속도가 느림
- 코드를 나누고 설계하는 것이 어려움
절차적 프로그래밍(Procedural Programming)

- 프로시저(함수)를 호출함으로서, 추상화와 코드의 재사용성을 목표로 하는 패러다임
- 일련의 처리 절차를 정해진 문법에 따라 순서대로 수행하는 것을 중요시함
절차적 프로그래밍의 장점
- 컴퓨터의 처리 구조와 유사하여 실행 속도가 빠름
- 코드의 재사용성이 높음
- 모듈 구성이 용이하고 구조적인 프로그래밍이 가능함
절차적 프로그래밍의 단점
- 프로그램을 분석하기 어려움
- 코드의 수정이 어려움
- 유지보수가 어려움
References
선언형 프로그래밍과 함수형 프로그래밍
https://mangkyu.tistory.com/111
https://boxfoxs.tistory.com/430
https://yoondii.tistory.com/124
https://cocoon1787.tistory.com/739
객체 지향 프로그래밍
https://ko.wikipedia.org/wiki/객체지향프로그래밍
https://jeong-pro.tistory.com/95
https://mangkyu.tistory.com/88
https://www.codestates.com/blog/content/객체-지향-프로그래밍-특징
https://sanghyuk.dev/development/2/
절차적 프로그래밍
https://iosdevlime.tistory.com/entry/CSBasic-객체지향-프로그래밍OOP-Object-oriented-Language
https://m.blog.naver.com/wook2124/222108810433