공부해봅시당

[CS] '명령형' 프로그래밍 vs '선언적' 프로그래밍 본문

STUDY/CS

[CS] '명령형' 프로그래밍 vs '선언적' 프로그래밍

tngus 2024. 2. 12. 18:59

명령형 프로그래밍 = 어떻게

명령형 프로그래밍에서는 '어떻게' 해야하는지 처리 방식을 모두 설명함

 

예시

루프를 사용하여 각 요소를 순회하고, 각 단계에서 무엇을 해야 하는지 명시적으로 지정함

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = 0;
for (int number : numbers) {
    sum += number; // 각 숫자를 sum에 더함
}
System.out.println(sum); // 출력: 15

 

장단점

장점

1. 명확한 흐름 제어

명령형 프로그래밍은 알고리즘의 각 단계와 작업 흐름을 명확하게 제어할 수 있게 해줌

특히 복잡한 알고리즘과 로직을 구현할 때 유용할 수 있음

2. 직관적인 이해

프로그래밍 경험이 많지 않은 사람들에게는 명령형 접근 방식이 더 직관적으로 느껴질 수 있음

3. 세밀한 최적화 가능

개발자가 코드의 각 부분을 세밀하게 제어할 수 있기 때문에 성능 최적화를 위해 코드를 미세하게 조정할 수 있음

 

단점

1. 코드 길이와 복잡성

명령형 코드는 같은 작업을 수행하기 위해 더 많은 코드를 필요로 할 수 있으며, 이는 코드의 복잡성을 증가시킬 수 있음

2. 유지보수의 어려움

알고리즘 각 단계를 명시적으로 기술해야하기 때문에 코드가 길어지고 복잡해질 경우 유지보수가 어려워질 수 있음

3. 재사용성 감소

특정 문제에 대한 해결 방식을 구체적으로 명시하기 때문에 코드 재사용성이 감소할 수 있음

 

 

선언적 프로그래밍 = 무엇을

선언적 프로그래밍에서는 '무엇을' 해야하는지에 초점을 맞춤

 

예시

Java의 Stream API를 사용하여 '무엇을' 해야 하는지 명시하고, '어떻게' 그 작업을 수행할지에 대한 세부 사항은 추상화하여 숨김

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream() // 스트림 생성
                 .mapToInt(Integer::intValue) // 각 요소를 int로 변환
                 .sum(); // 모든 요소의 합을 계산
System.out.println(sum); // 출력: 15

 

 

장단점

장점

1. 가독성 향상

선언적 프로그래밍은 '무엇을' 해야 하는지에 집중하기 때문에 읽기 쉽고 이해하기 쉬운 코드 작성 가능

2. 코드 길이 감소

일반적으로 선언적 접근 방식은 더 적은 코드로 동일한 작업을 수행할 수 있게 해줌

덕분에 유지보수가 쉽고, 코드 간결성 유지에 도움을 줌

3. 재사용성 및 모듈성 향상

고수준의 추상화 덕분에 코드의 재사용성과 모듈성이 향상됨

더 큰 프로젝트와 라이브러리에서 특히 유용함

4. 병렬 처리 용이

선언적 프로그래밍은 데이터의 흐름에 중점을 두기 때문에 병렬 처리와 같은 고급 최적화를 적용하기가 더 쉬움

 

단점

1. 성능 최적화의 한계

추상화된 수준이 높기 때문에 성능 최적화에 제한이 있을 수 있음

명령형 프로그래밍에 비해 세밀한 성능 조정이 더 어려울 수 있음

2. 학습 곡선

스트림 API나 SQL과 같은 선언적 프로그래밍 패러다임을 처음 접하는 개발자에게는 학습 곡선이 있을 수 있음

3. 디버깅의 어려움

코드의 구체적인 실행 흐름을 직접 제어하지 않기 때문에 디버깅이 더 어려울 수 있음

오류의 원인을 파악하기 위해 추상화 레벨을 넘나들어야 할 수 있음