선언형과 함수형 프로그래밍
선언형과 함수형 프로그래밍
선언형 프로그래밍 (Declarative Programming):
선언형 프로그래밍은 **무엇(What)**을 할 것인지에 집중하는 프로그래밍 스타일입니다.
이 스타일에서는 코드가 목표하는 상태를 명세하고, 시스템은 그 명세에 맞게 동작하도록 합니다.
프로그래머는 어떻게(How) 동작하는지에 대한 구체적인 세부 사항보다는 원하는 결과에 초점을
맞추게 됩니다.
예를 들어, SQL (Structured Query Language)은 선언형 프로그래밍의 좋은 예입니다.
SQL 쿼리를 사용하여 데이터베이스에서 원하는 데이터를 검색할 때, 당신은 어떤 데이터를 원하는지를
명시하고 데이터베이스 시스템이 그 요구사항을 처리합니다.
이때 어떻게 데이터가 가져와지는지에 대한 구체적인 단계를 프로그래머가 명시하지 않습니다.
함수형 프로그래밍 (Functional Programming):
함수형 프로그래밍은 프로그램을 수학적 함수의 조합으로 생각하고, 데이터와 함수의 상호작용에 초점을
두는 프로그래밍 스타일입니다.
여기서 함수는 일급 시민(first-class citizen)이며, 함수를 변수에 할당하고 매개변수로 전달하거나
반환할 수 있습니다.
이러한 함수들을 조합하여 프로그램을 구성합니다.
함수형 프로그래밍은 부작용(side effect)을 최소화하려고 합니다.
부작용이란 함수 호출로 인해 프로그램의 상태나 외부 환경에 변화가 일어나는 것을 의미합니다.
순수 함수(pure function)라는 개념을 중요시하며, 순수 함수는 같은 입력에 항상 같은 출력을 반환하며
외부 상태를 변경하지 않습니다.
이로써 프로그램의 예측 가능성과 테스트 용이성을 높일 수 있습니다.
요약하자면, 선언형 프로그래밍은 원하는 결과를 선언하고 시스템이 그 결과를 달성하도록 하는 스타일이며, 함수형 프로그래밍은 함수를 중심으로 데이터와 연산을 다루며 부작용을 피하고 프로그램을 조합 가능한 작은 단위로 구성하는 스타일입니다.
선언형 프로그래밍 장점
가독성과 유지 보수성 향상:
선언형 코드는 "무엇"을 하는지에 초점을 맞추기 때문에 코드가 직관적이며 가독성이 높습니다.
이는 코드를 이해하고 유지 보수하는 데 도움이 됩니다.
추상화와 모듈화:
선언형 스타일은 추상화 수준을 높여줍니다.
복잡한 과정을 하나의 단순한 명령어나 문장으로 표현할 수 있으며,
이로써 모듈화와 재사용성을 높일 수 있습니다.
코드 최적화:
선언형 코드는 무엇을 원하는지 명시하고, 시스템은 어떻게 동작해야 하는지를 최적화합니다.
이로 인해 런타임 최적화에 유리한 상황이 발생할 수 있습니다.
선언형 프로그래밍 단점
선언형 프로그래밍의 단점:
제한된 유연성: 선언형 코드는 명세에 따라 동작해야 하기 때문에, 특정 상황에 따른 세부 조작이
어려울 수 있습니다.
이로 인해 일부 복잡한 시나리오에서는 제한된 유연성을 보일 수 있습니다.
성능 문제:
선언형 코드가 추상화에 초점을 맞출 경우, 때로는 성능 측면에서 비효율적일 수 있습니다.
이는 세부 구현을 최적화하기 어려울 수 있음을 의미합니다.
함수형 프로그래밍 장점
부작용 제어와 예측 가능성:
함수형 프로그래밍은 부작용을 제어하고 순수 함수를 사용함으로써 예측 가능한 동작을 촉진합니다.
이는 디버깅과 테스트를 쉽게 만들어 줍니다.
병렬 처리와 동시성:
함수형 코드는 불변성을 유지하므로 상태 공유 문제가 줄어들어 병렬 처리와 동시성을 효과적으로
다룰 수 있습니다.
재사용성과 모듈화:
함수형 프로그래밍은 고차 함수와 컴포지션을 사용하여 모듈화 된 코드를 구축하고 재사용성을 높입니다.
함수형 프로그래밍 단점
러닝 커브:
함수형 프로그래밍은 명령형 프로그래밍과는 다른 사고 방식을 요구할 수 있습니다.
따라서 프로그래머들이 새로운 개념과 패턴을 익히는 데 시간이 걸릴 수 있습니다.
성능 문제:
함수형 코드가 재귀나 고차 함수를 자주 사용할 경우, 메모리 및 실행 시간 면에서 성능 문제가 발생할 수
있습니다.
결국, 프로그래밍 패러다임 선택은 프로젝트의 요구 사항과 프로그래머 개개인의 선호도에 따라 달라집니다. 선언형 프로그래밍은 가독성과 유지 보수성을 강조하며, 함수형 프로그래밍은 부작용 제어와 병렬 처리를
강조합니다.
선언형 프로그래밍 자세히 알기!!
해성이가 학교에서 친구들과 놀았던 시간을 찾는 경우, 선언형 프로그래밍 방식은 다음과 같이 작동합니다. 해성이의 놀이 시간 목록을 가져와 각 친구가 놀았던 시간을 순회하며 시간을 더해 총 놀이 시간을
계산합니다.
이때 코드는 무엇을 원하는지를 설명하며, 구체적인 계산 과정은 추상화되어 있습니다.
함수형 프로그래밍 자세히 알기!!
만약 해성이가 학교에서 2시간 이상 놀았던 시간을 찾는다면, 함수형 프로그래밍 방식은 다음과 같이
작동합니다.
해성이의 놀이 시간 목록에서 2시간 이상 놀았던 시간을 필터링하여 추출합니다.
이때 코드는 조건을 명시하고, 필터링 과정은 함수를 통해 이루어집니다.
결과적으로 해성이가 2시간 이상 놀았던 시간만 추출하여 나타냅니다.
두 예제 모두 놀이 시간을 찾는 과정에서 해성이가 놀았던 시간 목록을 사용하며 원하는 정보를 도출합니다. 선언형 방식은 놀이 시간을 모두 더하는 것에 초점을 맞추고, 함수형 방식은 조건에 맞는 시간을 필터링하여 결과를 얻는 것에 초점을 맞추는 것이 차이점입니다.
*바쁜 사람을 위한 깜찍한 정리
선언형 프로그래밍은 무엇을 할 것인지에 포커스가 집중하는 스타일입니다. 어떻게 동작하는지 보다는 원하는 결과에만 초점을 맞추면 되는 프로그래밍기법이라고 생각하면 되고 SQL쿼리문 같은 것이 대표적입니다. 함수형 프로그래밍은 데이터와 함수의 상호작용에 초점을 두는 프로그래밍 스타일입니다. 변수에 할당하고 매개변수로 전달하거나 반환할 수 있고 부작용을 최소화하는 방식이며 같은 값을 구하더라고 선언형은 그 결괏값만 가져오면 되는 거고 함수형은 그 결과값을 가져오더라도 부작용이 일어날 수 있는 것을 최소화하는 방식입니다. 예를 들어 슈퍼마켓에서 선언형 프로그래밍은 해당 품목을 알맞은 위치에 두기만 하면 되는 거고 함수형 프로그래밍은 해당 품목을 어떻게 진열 할 것이며 일어날 수 있는 부작용들 움직이다가 떨어질 수도 있는 계단 같은 것을 다 계산하고 그 위치에 나두기 위해 수학적 함수의 조합이라고 생각하면 이해하기 쉬울 거 같습니다.
'목차훔치기 > 면접을 위한 CS 전공지식 노트' 카테고리의 다른 글
절차형 프로그래밍 (면접을 위한 CS 전공지식 노트) (0) | 2023.08.19 |
---|---|
객체지향 프로그래밍(면접을 위한 CS 전공지식 노트) (0) | 2023.08.18 |
MVVM 패턴(면접을 위한 CS 전공지식 노트) (0) | 2023.08.16 |
MVP 패턴 패턴(면접을 위한 CS 전공지식 노트) (0) | 2023.08.15 |
MVC 패턴(면접을 위한 CS 전공지식 노트) (0) | 2023.08.14 |