프로그래밍 패러다임
프로그래밍 패러다임이란 프로그래밍을 어떤 방식으로 접근하고 문제를 해결할 것인가에 대한 철학이나 스타일을 의미한다.
대표적인 프로그래밍 패러다임은 아래와 같이 구분할 수 있다.
- 명령형 프로그래밍 : 프로그램이 어떻게 동작해야 하는지 자세히 설명하는 방법
- 절차지향 프로그래밍 : 프로시저나 함수를 통해 프로그램을 순차적으로 절차(과정) 중심으로 작성하는 방법 (C, Pascal)
- 객체지향 프로그래밍 : 각각 역할과 행동을 부여한 객체들 간의 상호작용을 통해 문제를 해결하는 방법 (Java, C++)
- 선언형 프로그래밍 : 프로그램이 무엇을 해야 하는지 자세히 설명하는 방법
- 함수형 프로그래밍 : 상태 변경 없는 순수 함수를 조합하여 작성하는 방법 (SQL, HTML)
명령형 프로그래밍
명령형 프로그래밍이란 컴퓨터에게 어떻게 할 것 인지 명령하는 방식으로 프로그램의 상태(state)를 어떻게 변경할지를 순서대로 하나하나 기술하는 것을 의미한다.
변수의 값이 바뀌면서 상태(변수, 메모리, 프로그램의 현재 상황)가 변함
프로그램이 어떤 순서로 동작해야 하는지를 if, for, while, switch 같은 흐름 제어문으로 결정
이는 메모리에서 명령어 가져오고 (Fetch) → 해당 명령어를 해석 (Decode) → 실제 명령어 실행하여 메모리 값을 바꾸는 (Execute) CPU의 동작 방식과 유사하다는 특징이 있다.
따라서 명령형 프로그래밍은 컴퓨터 시스템의 동작 방식과 유사하므로 직관적이고 흐름 제어가 쉽다는 장점이 있지만, 프로그램 규모가 커진다면 상태 변경에 따른 복잡도가 증가하여 유지보수가 어려워질 수 있다는 단점이 있다.
절차지향 프로그래밍
명령형 프로그래밍의 하위 개념 중 하나로 프로그램을 함수나 프로시저 단위로 나눠서 순서대로 처리하는 방식을 의미한다.
함수와 프로시저 둘 다 일련의 명령어들을 묶어놓은 것으로 코드의 재사용과 구조화를 도와주지만 약간의 차이가 존재한다.
프로시저(Procedure)
특정 작업이나 행동을 수행하는 것이 목적으로 반환 값이 없거나 중요하지 않다. (void 메서드와 비슷)
주로 상태를 변경하거나 특정 작업을 수행하는 것에 초점을 맞춘다.
함수(Function)
입력값을 받아서 처리하고 값을 반환하는 것이 목적이다.
아래는 C언어의 코드로 평균 점수를 구하는 함수와 이를 출력하는 함수를 별도로 정의해서 사용하고 있다.
#include <stdio.h>
float getAverage(int scores[], int size) {
int sum = 0;
for(int i = 0; i < size; i++) {
sum += scores[i];
}
return (float)sum / size;
}
void printResult(float average) {
printf("평균 점수: %.2f\n", average);
}
int main() {
int scores[5] = {85, 90, 78, 92, 88};
float avg = getAverage(scores, 5);
printResult(avg);
return 0;
}
이처럼 함수화를 통해 코드의 재사용성이 올라가고 가독성이 올라가게 되었다. 또한 위에서 부터 순서대로 실행하기 때문에 직관적이라는 장점이 있지만 데이터(변수, 배열 등)와 로직(함수들)이 따로따로 존재하므로 프로그램의 규모가 커진다면 유지보수가 어려워진다.
객체지향 프로그래밍
상태(필드 속성)와 동작(메서드)을 객체라는 단위로 묶어서, 그 객체들 간의 상호작용으로 프로그램을 구성하는 방식을 의미한다.
객체지향 프로그래밍은 크게 4가지의 특징이 있다.
1. 캡슐화 : 데이터와 메서드를 하나의 단위로 묶어 외부에서 직접 접근하지 못하도록 보호
2. 상속 : 기존 클래스(부모 클래스)의 특성을 새로운 클래스(자식 클래스)가 물려받아 재사용할 수 있는 기능
3. 다형성 : 동일한 인터페이스가 서로 다른 형태로 동작할 수 있는 기능으로 메서드 오버로딩과 메서드 오버라이딩을 통해 구현
4. 추상화 : 실세계의 복잡한 상황을 간결하고 명확하게 핵심 위주로 간추려 내는 것
abstract class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
public void makeSound() {
System.out.println(name + "가 소리를 낸다.");
}
public String toString() {
return "동물 이름: " + name;
}
}
class Dog extends Animal {
public Dog(String name) {
super(name);
}
@Override
public void makeSound() {
System.out.println(super.toString() + " 멍멍하고 소리를 낸다.");
}
}
name 필드는 private으로 선언되어 외부에서 직접 접근할 수 없다. (캡슐화)
Dog 클래스는 Animal 클래스를 상속받아 기본적인 동물의 특성을 재사용한다. (상속)
makeSound() 메서드를 재정의하여 부모 클래스와 다른 기능을 구현하였다. 또한 Animal 타입으로 Dog 객체를 참조할 수 있다. (다형성)
Animal 추상 클래스는 동물이라는 개념으로 간추려서 정의 (추상화)
따라서 객체지향 프로그래밍은 객체라는 단위로 묶이게 되면서 코드 재사용성, 확장성, 유지보수가 용이하다.
하지만 초기 설계가 복잡하고며, 과도하게 객체를 분리하거나 복잡한 상속 구조 등으로 인해서 오히려 복잡도가 증가할 수 있다.
선언형 프로그래밍
선언형 프로그래밍이란 무엇을 할 것인지만 설명하고, 어떻게 할지는 신경 쓰지 않는 프로그래밍 스타일을 의미한다.
즉 결과를 얻기 위한 구체적인 방법이나 절차를 명시하는 것이 아니라, 원하는 결과나 조건에 대해 선언적으로 표현하면 시스템(언어, 프레임워크)이 자체적으로 처리하는 방식이다.
화면 구조나 컨텐츠를 기술하기만 하면 어떻게 그려지는지는 브라우저 렌더링 엔진이 결정하는 HTML이나 쿼리로 원하는 데이터를 선언하면 조건에 맞는 데이터를 어떻게 가져올지는 DB가 처리하는 SQL이 대표적인 예이다.
이는 개발자가 코드의 복잡한 로직을 신경 쓸 필요 없이 원하는 결과에만 집중할 수 있으며, 상태 변경이 적으므로 사이드 이펙트 발생 가능성이 적다는 장점이 있지만 시스템(언어, 환경)이 제공하는 추상화 수준에 의존적이고 내부 동작을 모르므로 디버깅과 세밀한 제어가 어렵다는 단점이 있다.
함수형 프로그래밍
무엇을 할 것인지 상태 변화 없는 순수 함수를 조합하여 문제를 해결하는 프로그래밍 방식을 의미한다.
함수형 프로그래밍은 다음과 같은 특징이 있다.
순수 함수 : 같은 입력에 대해서 항상 같은 출력을 반환하며, 외부 상태를 변경하지 않거나, 외부 상태에 의존하지 않는 함수
불변성 : 상태 변경이 필요할 경우 새로운 데이터 구조를 생성해서 반환
함수를 일급 객체로 취급되기 때문에 함수를 인자로 전달하거나 반환하는 고차 함수 구현이 가능
함수형 프로그래밍은 상태 변경이 없으므로 디버깅이 용이하고, 스레드 간 충돌이 없어 병렬 처리가 쉽다. 또한 재사용성이 뛰어나며, 복잡한 로직도 쉽게 표현할 수 있다는 장점이 있다.
함수형 프로그래밍이란?
함수형 프로그래밍이란? 무엇을 할 것인지 상태 변화 없는 순수 함수를 조합하여 문제를 해결하는 프로그래밍 방식을 의미한다. 함수형 프로그래밍은 다음과 같은 특징이 있다.순수 함수 : 같
hbb-devlog.tistory.com