프로그래밍 패러다임 종류

강다빈·2026년 7월 11일

golang 공부

목록 보기
6/11

참고
https://adjh54.tistory.com/97
https://velog.io/@yyjjvv/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%ED%8C%A8%EB%9F%AC%EB%8B%A4%EC%9E%84

프로그래밍 패러다임(Programming Paradigm)

프로그래머가 코드를 작성하고 문제를 해결할 때 취하는 관점이자 접근방식

프로그래밍 패러다임은 위 그림과 같이 나뉨.

1. 명령형

  • 단계적인 절차와 상태변경의 순서를 상세히 기술하는 방식을 의미
  • 어떻게(HOW)에 초점을 맞춤
  • 변수값을 수정하며 상태변경하거나 조건문 반복문을 사용해 코드 실행흐름을 직접 제어
  • 절차지향과 객체지향이 명령형에 해당

1-1. 절차지향형(PP, Procedural Programming)

어떠한 일을 해결하기 위해 일련의 작업 순서대로 프로그램이 유기적으로 연결되도록 구성하는 프로그래밍 기법

  • 대표언어: C언어
#include <stdio.h>

int main() {
    int sum = 0; // 상태(데이터)
    
    // 순서대로 명령을 실행 (어떻게 더할지 단계별로 명시)
    for(int i = 1; i <= 5; i++) {
        sum = sum + i; 
    }
    
    printf("%d", sum);
    return 0;
}

1-2. 객체지향형 (OOP, Object-Oriented Programming)

어떠한 일을 해결하기 위해 객체들(Object)를 기본단위로 나누고 서로 간의 상호작용으로 개발하는 프로그래밍 기법

  • 대표언어: Java
// 설계도(클래스) 정의
class Car {
    int speed = 0; // 데이터(상태)

    // 행동(메서드)
    void accelerate() {
        speed += 10;
        System.out.println("현재 속도: " + speed);
    }
}

public class Main {
    public static void main(String[] args) {
        // 객체 생성 및 상호작용
        Car myCar = new Car(); 
        myCar.accelerate(); 
    }
}

2. 선언형

  • 최종적인 결과를 명시하는 방식을 의미
  • 무엇을(WHAT)에 초점을 맞춤
  • 내부적인 순서나 제어흐름을 지시하지 않음(무엇에만 초점을 맞추고 어떻게는 신경쓰지 않음)
  • 함수형과 논리형이 선언형에 해당

2-1. 함수형 (FP, Functional Programming)

상태 및 데이터 변경에는 사용하지 않으며(함수는 외부의 상태를 참조하거나 변경하지 않음) 작은 문제를 해결하기 위한 '함수' 단위로 개발하는 프로그래밍 기법

  • 언어: Golang에서 함수형 일부 지원
    (아래 코드를 보면 main 함수 내부에서 반복문이나 제어문 없이 함수로 무엇을 할지 명시함)
package main

import "fmt"

// 1. Filter: 조건(predicate)을 만족하는 요소만 걸러내는 고차 함수
// 함수(func(int) bool)를 매개변수로 받습니다.
func Filter(numbers []int, predicate func(int) bool) []int {
    var result []int
    for _, n := range numbers {
        if predicate(n) {
            result = append(result, n) 
        }
    }
    // 원본 데이터를 수정하지 않고 새로운 슬라이스를 반환합니다. (불변성 유지)
    return result
}

// 2. Map: 각 요소에 변환 연산(transform)을 적용하는 고차 함수
// 함수(func(int) int)를 매개변수로 받습니다.
func Map(numbers []int, transform func(int) int) []int {
    var result []int
    for _, n := range numbers {
        result = append(result, transform(n))
    }
    return result
}

func main() {
    // 원본 데이터
    numbers := []int{1, 2, 3, 4, 5, 6}

    // [함수형 패러다임 적용]
    
    // 순수 함수들을 일급 함수 특성을 이용해 변수에 할당합니다.
    isEven := func(n int) bool { return n%2 == 0 }
    double := func(n int) int { return n * 2 }

    // '어떻게' 걸러낼지 반복문을 쓰지 않고, 
    // Filter와 Map을 이용해 '무엇을' 할지 선언적으로 작성합니다.
    evens := Filter(numbers, isEven)
    doubledEvens := Map(evens, double)

    // 결과 확인
    fmt.Println("원본 데이터:", numbers)         // 출력: [1 2 3 4 5 6] (원본이 훼손되지 않음)
    fmt.Println("짝수만 필터링:", evens)         // 출력: [2 4 6]
    fmt.Println("짝수를 두 배로:", doubledEvens) // 출력: [4 8 12]
}

2-2. 논리형 (Logic Programming)

컴퓨터에게 fact와 rule을 알려주면 추론하여 질문에 대한 답을 스스로 찾아내는 프로그래밍 기법

profile
하루살이

0개의 댓글