프로그래밍 패러다임(programming paradigm)이란?
특정 관점과 접근 방식에 따른 개발자의 코딩방식
프로그래밍(Programming) 이란?
하나 이상의 관련된 추상 알고리즘을 특정한 프로그래밍 언어를 이용해 구체적인 컴퓨터 프로그램으로 구현하는 기술을 의미한다.
패러다임(Paradigm) 이란?
어떤 한 시대 사람들의 견해나 사고를 근본적으로 규정하고 있는 테두리로서의 인식의 체계, 또는 사물에 대한 이론적인 틀이나 체계를 의미하는 개념을 의미한다.
프로그래밍 + 패러다임(Programming Paradigm)이란?
개발자가 프로그래밍을 위해 어떠한 '관점'을 가지고 개발을 할지에 대해서 결정을 하는데 도움을 주는 것을 의미한다.
프로그래밍 패러다임의 변화
'프로그래밍 패러다임'이라 하면 아래 3가지를 의미한다.
- 절차적 프로그래밍 (PP, Procedure Programming)
- 객체지향 프로그래밍 (OOP, Object Oriented Programming)
- 함수형 프로그래밍 (FP, Functional Programming)
프로그래밍 패러다임의 등장 순서
- 함수 지향 프로그래밍(FP) → 객체 지향 프로그래밍(OOP) → 절차 지향 프로그래밍(PP)
프로그래밍 패러다임의 성장 순서
- 절차 지향 프로그래밍(PP) → 객체 지향 프로그래밍(OOP) → 함수 지향 프로그래밍(FP)
프로그래밍 패러다임은 단순히 진화론적 관점에서 우열을 판단할 수 없다.
- 프로그래밍 패러다임은 '접근 방식'과 '사용 환경'에 따라 유동적으로 활용된다.
- 각각의 프로그래밍 패러다임은 장단점이 존재하며, 이에 상호 보완적 특성을 가진다.
프로그래밍 패러다임의 종류
3가지 주요 프로그래밍 패러다임은 [방법/목적]에 따라 재 분류된다.
- 명령형 프로그래밍 (Imperative Programming)
- 절차지향 프로그래밍
- 객체지향 프로그래밍
- 선언형 프로그래밍 (Declearative Programming)
- 함수형 프로그래밍
- 반응형 프로그래밍
명령형 프로그래밍 vs 선언형 프로그래밍
어떻게(How) 할것인가, 무엇(What)을 할 것인가?
명령형 프로그래밍(Imperative Programming)
어떤 일을 ‘어떻게(HOW) 수행을 할 것 인지’에 대해 관점을 두고 컴퓨터가 수행할 명령들을 순서대로 적어두는 프로그래밍 수행 기법을 의미한다.
- 객체 지향 프로그래밍 (OOP)
- 절차 지향 프로그래밍 (PP)
1) 객체 지향 프로그래밍(OOP: Object-Oriented Programming)
어떠한 일을 해결 하기 위해 수많은 ‘객체(Object)들’을 기본 단위로 나누고 ‘서로 간의 상호관계’ 작용으로 개발하는 것을 지향하는 프로그래밍 기법을 의미한다.
- 객체 지향 프로그래밍을 사용하는 언어: C++, JAVA, Python
객체지향 프로그래밍(OOP)의 장점
- 캡슐화로 코드의 재사용성이 높다.
- 코드의 변경이 용이하다.
- 직관적인 코드분석이 가능하다.
- 개발속도 향상된다.
- 상속을 통한 장점 극대화 된다.
객체지향 프로그래밍(OOP)의 단점
- 처리속도가 상대적으로 느리다.
- 객체가 많으면 용량이 커질 수 있다.
- 설계시 상대적으로 많은 시간이 필요하다.
객체지향 프로그래밍의 특징 (OOP)
1. 추상화
- 객체들의 공통적인 속성과 기능을 뽑아내는 작업, 즉 우리가 구현하는 객체들이 가진 공통적인 데이터와 기능을 묶어 이름을 붙이는 것을 말한다.
2. 캡슐화
- 관련된 데이터와 함수들을 클래스라는 하나의 ‘캡슐’속에 그룹화시켜주는 것으로 외부에는 실제 구현 내용을 감춘다.
- 기능과 특성별로 한 곳에 모으고 분류하기 때문에 언제든지 쉽게 불러올 수 있는 재사용성
- 외부에서는 ‘추상적인 것’으로 보이기에 정보 은닉화
3. 상속
- 상위클래스의 데이터와 함수를 하위클래스가 물려받는 것을 말한다.
- 하나의 클래스가 가지고 있는 데이터와 함수를 그대로 다른 클래스가 물려주고자 할 때 이를 이용한다.
- 상속 받은 것을 자식클래스에서 다시 재정의(오버라이딩)해서 사용하는 다형성과도 이어져있다.
4. 다형성
- 하나의 클래스 내부에 같은 이름의 기능을 여러 개 정의하거나, 상위 클래스의 기능을 하위 클래스에서 다시 정의할 수 있다.
- 대표적인 예로 오버라이딩과 오버로딩이 있다.
- 오버라이딩 : 부모클래스의 메서드와 같은 이름, 매개변수를 재정의 하는 것
- 오버로딩 : 같은 이름의 함수를 여러개 정의하고, 매개변수의 타입과 개수를 다르게 하여 매개변수에 따라 다르게 호출할 수 있게 하는 것
2) 절차 지향 프로그래밍(PP: Procedural Programming)
어떠한 일을 해결하기 위해 위에서 아래로 순차적으로 진행이 되어서 프로그램이 유기적으로 연결되도록 구성하는 개발 방식을 지향하는 프로그래밍 기법을 의미한다.
- 절차 지향 프로그래밍을 사용하는 언어: C
선언형 프로그래밍(Declarative Programming)
어떻게(How) 수행할 명령들을 순서대로 적어두는것이 아닌 무엇(What)을 나타낼지에 대해서 관점을 두어서 프로그래밍을 수행하는 기법을 의미한다.
- 논리형 프로그래밍(Logic)
- 함수형 프로그래밍(Function)
1) 논리 프로그래밍(Logic Programming)
어떤 일에 대해서 해결을 찾기 위한 단계들에 주목하기 보다는 해결의 '속성들’에 주목하는 프로그래밍 기법을 지향하는 프로그래밍 기법을 의미한다.
2) 함수형 프로그래밍(FP: Functional Programming)
상태 및 데이터 변경에는 사용하지 않으며 작은 문제를 해결 하기 위한 ‘함수’ 단위로 개발을 하는 기법을 지향하는 프로그래밍 기법을 의미한다.
- Java 1.8 버전부터 함수형 프로그래밍을 한다.
- 함수형 프로그래밍을 위해 람다식 (Lambda), Stream API, Functional Interface의 주요한 기능들을 사용한다.
- 가독성과 함수를 이용한 재 사용성이 장점이 있다.
- 함수형 프로그래밍을 사용하는 언어: SQL, HTML,Python
함수형 프로그래밍은 다음과 같은 전제로 동작한다.
- 모든 데이터는 불변상태(Immutab)이어야 한다.
- 함수형 프로그래밍에서는 데이터가 변할 수 없는데, 이를 불변성 데이터라고 한다.
- 데이터 변경이 필요한 경우, 원본 데이터 구조를 변경하지 않고 그 데이터를 복사본을 만들어 그 일부를 변경하고, 변경한 복사본을 사용해 작업을 진행한다.
- 함수는 순수 함수로 만든다.
- 순수 함수란 동일한 입력에 항상 같은 값을 반환해야하며 프로그램의 실행에 영향을 미치지 않는 함수(다른 말로 side effect가 없어야 한다.)를 뜻한다.
- 루프보다는 재귀를 사용한다.
- for나 while같은 루프보다는 함수안에 함수를 호출하는 재귀호출을 사용하는 방법을 사용한다.
- 코드를 간결하게 하고 가독성을 높여 로직에 집중시켜야한다.
- 람다식이나 Collection과 같은 API를 통해 가독성을 높힌다.
- 핵심은 순수 함수를 조합해 간결하게 만들어 SideEffect를 없애는 것이다.
참고 자료
'CS > 개발상식' 카테고리의 다른 글
[개발상식] API란 무엇인가? (0) | 2023.08.16 |
---|---|
[개발상식] 디자인 패턴 (0) | 2023.07.01 |
[개발상식] 객체 지향 프로그래밍 (OOP) (0) | 2023.06.29 |
[개발상식] 프레임워크와 라이브러리의 차이점 (0) | 2023.06.25 |