참고
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
프로그래머가 코드를 작성하고 문제를 해결할 때 취하는 관점이자 접근방식

프로그래밍 패러다임은 위 그림과 같이 나뉨.
어떠한 일을 해결하기 위해 일련의 작업 순서대로 프로그램이 유기적으로 연결되도록 구성하는 프로그래밍 기법
#include <stdio.h>
int main() {
int sum = 0; // 상태(데이터)
// 순서대로 명령을 실행 (어떻게 더할지 단계별로 명시)
for(int i = 1; i <= 5; i++) {
sum = sum + i;
}
printf("%d", sum);
return 0;
}
어떠한 일을 해결하기 위해 객체들(Object)를 기본단위로 나누고 서로 간의 상호작용으로 개발하는 프로그래밍 기법
// 설계도(클래스) 정의
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();
}
}
상태 및 데이터 변경에는 사용하지 않으며(함수는 외부의 상태를 참조하거나 변경하지 않음) 작은 문제를 해결하기 위한 '함수' 단위로 개발하는 프로그래밍 기법
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]
}
컴퓨터에게 fact와 rule을 알려주면 추론하여 질문에 대한 답을 스스로 찾아내는 프로그래밍 기법