기능 프로그래밍 대 OOP [닫기]


93

최근에 Haskell과 같은 기능적 언어를 사용하는 것에 대해 많은 이야기를 들었습니다. 함수형 프로그래밍과 객체 지향 프로그래밍의 큰 차이점, 장단점은 무엇입니까?


27
하나는 다른 것을 거부하지 않습니다.
mbq

1
@ mbq 나는 그들이 상호 배타적이지 않다는 것을 이해하지만 두 접근법의 차이점에 대해 더 잘 이해하려고했습니다.
GSto

좋은 질문입니다. 나도 이것에 대해 궁금했다.
JohnFx

기능 프로그래밍과 객체 지향 프로그래밍은 서로 직교합니다. 같은 언어로 둘 다 가질 수 있습니다. 예 : 스칼라, F #, OCaml 등. Jonas가 제안한 것처럼 기능적 대 명령형을 의미 했을 까요?
missingfaktor

4
진정한 대답은 그들 사이에 "대"가 없다는 것입니다. 이 질문은 StackOverflow에서 확인하십시오 .
missingfaktor

답변:


67

나는 그것이 기능적 프로그래밍명령형 프로그래밍 이라고 말합니다 .

가장 큰 차이점은 명령형 프로그래밍은 제어 흐름 에 관한 것이고 기능 형 프로그래밍은 데이터 흐름 에 관한 것 입니다. 그 말을하는 또 다른 방법은 프로그래밍 기능 만 사용한다는 것입니다 표현을 필수 프로그램 모두 동시에 표현문장이 사용된다.

예를 들어, 명령형 프로그래밍 에서는 상태를 처리 할 때 변수와 루프가 일반적이지만 기능적 프로그래밍에서는 상태가 매개 변수 전달을 통해 처리되므로 부작용과 할당을 피할 수 있습니다.

리스트의 합을 계산하는 함수의 명령형 의사 코드 (합은 변수에 유지됨) :

int sumList(List<int> list) {
    int sum = 0;
    for(int n = 0; n < list.size(); n++) {
        sum = sum + list.get(n);
    }

    return sum;
}

동일한 함수에 대한 함수 의사 코드 (합은 매개 변수로 전달됨) :

fun sumList([], sum) = sum
 |  sumList(v::lst, sum) = sumList(lst, v+sum)

기능적 개념에 대한 좋은 소개를 위해 Simon Peyton-Jones의 기능적 프로그래밍을 통한 테이밍 효과 프레젠테이션을 추천합니다 .


12
기능 버전은 테일 재귀이므로 스택 오버플로를 피하도록 최적화되어 있습니다. (어떤 사람들은 재귀를보고 기능적 프로그래밍이 그로 인해 나쁘다고 생각할 수도 있습니다)
대안

3
명령 대 기능의 가장 중요한 측면을 설명하기 위해 +1 : 제어 흐름 대 데이터 흐름. 내가 추가해야 할 한 가지는 기능적 패러다임과 OO 패러다임이 상호 배타적이지 않다는 것입니다 . OO 패러다임을 사용하여 객체 (데이터)가 상호 작용하는 방식을 모델링하고 기능적 패러다임을 사용하여 해당 객체를 변환 (조작) 할 수 있습니다.
Lie Ryan

1
흥미롭게도, 제어형 데이터 및 데이터 제어형을 모델링하고 혼합 할 수 있습니다. FP는 화살표 및 1 차 함수를 사용하여 제어 흐름을 전달하고 데이터처럼 조작 할 수 있습니다. OOP는 다양한 디자인 패턴을 사용하여 제어 흐름을 변경하기 위해 개체를 사용합니다.
CodexArcanum

또한 주요한 차이점은 동일한 프로그램을 작성하는 것이 아니라 루프를 꼬리 재귀 메서드 호출로 만드는 것입니다. 그것보다 훨씬 큽니다
sara

함수 예제는 매개 변수 패턴 일치를 사용합니다. 이것은 함수형 프로그래밍에 국한된 것이 아니며, 유사하게 함수형 프로그램은 모든 반복 알고리즘을 재귀 알고리즘으로 공식화 할 필요없이 모나드 및 명령형 구조를 사용할 수 있습니다.
Dai

16

함수형 프로그래밍은 선언적 모델을 기반으로하며 람다 미적분에서 유래합니다. C ++ 및 C #과 같은보다 필수적인 언어에서 빌릴 수있는 많은 훌륭한 개념을 제공합니다.

참조 투명성, 람다 함수, 퍼스트 클래스 함수, 게으르고 간절한 평가, 불변성 등이 있습니다.

기능 프로그래밍을 배우는 것이 아무것도 없다면 그것이 포함 된 개념에 유용합니다. 프로그래밍 방식을 바꾸고 프로그래밍에 대해 생각합니다. 그리고 미래에는 기능 지향 프로그래밍이 객체 지향 프로그래밍만큼 중요 할 것이라고 생각합니다.

시작하려면 Haskell과 같은 순수한 기능 언어를 사용하거나 F # 과 같은 하이브리드 언어를 사용할 수 있습니다 .

대부분의 훌륭한 대학은 기능적 프로그래밍을 다루며 학교에 가면 그 과정을 수강 할 것을 강력히 권합니다.


함수형 프로그래밍과 객체 지향 프로그래밍의 큰 차이점, 장단점은 무엇입니까?

객체 지향 프로그래밍은 복잡한 문제를 계층 구조로 모델링하여 문제를 단순화 할 수 있기 때문에 좋습니다. 그러나 가변 객체를 사용하는 동안 다중 스레드 프로그래밍을 고려하기 시작하면 매우 어려워집니다. 이러한 경우 동기화 개체를 많이 사용해야하며 대규모 응용 프로그램을 완벽하게 구현하는 것은 거의 불가능합니다.

그것이 바로 함수형 프로그래밍이 시작되는 곳입니다. 불변성과 같은 것 때문에 함수형 프로그래밍은 다중 스레드 프로그램을 단순화시킵니다. 입력 X를 함수에 제공하면 항상 Y를 출력한다는 것을 알 때 무언가를 병렬화하는 것이 거의 쉽습니다. 또한 변수 (또는 함수형 프로그래밍의 값)는 다른 스레드에서 사용 중일 때 변경할 수 없다는 것을 알고 있습니다.


2
분명히, Scheme은 결코 순수한 기능적 언어는 아닙니다.
Jonathan Sterling

5
두 번째 마지막 단락은 완전히 bs입니다. OO는 멀티 스레딩에서 문제를 일으키지 않으며, 변경 가능성도 있습니다. 명령형 프로그래밍과 객체 지향 프로그래밍을 혼동하는 것 같습니다. 그 경우입니까?
missingfaktor

5
@missingfaktor : 아니요 나는 개념을 혼동하지 않습니다. 객체에는 일반적으로 접근 자, 수정 자, 데이터 멤버 및 멤버 함수가 있습니다. 예, 모든 객체에 수정자가 필요하지는 않으며 변경할 수없는 것으로 구현할 수 있습니다. 그러나 임의의 OO 프로그램을 보면 수정자가 있지만 여전히 다중 스레드에서 사용되는 여러 객체가 있습니다. 즉, OOP 패러다임에서는 모든 것을 변경할 수없는 경우가 거의 없습니다.
Brian R. Bondy

이 질문에 대한 답변을 읽어야합니다. stackoverflow.com/questions/3949618/fp-and-oo-orthogonal/…
missingfaktor

또한 Frank Shearar의 답변을 확인하십시오. programmers.stackexchange.com/questions/12423/…
missingfaktor

8

(이 답변은 StackOverflow의 비공개 질문에 대한 답변 에서 수정되었습니다 .)

함수형 프로그래밍과 객체 지향 프로그래밍의 큰 차이점 중 하나는 각기 다른 종류의 소프트웨어 진화에서 더 낫다는 것입니다.

  • 객체 지향 언어는 사물 에 대한 고정 된 조작 세트가있을 때 유용 하며 코드가 발전함에 따라 주로 새로운 사물을 추가합니다. 기존 메소드를 구현하는 새 클래스를 추가하면 기존 클래스를 그대로 유지할 수 있습니다.

  • 함수형 언어는 고정 된 사물 집합이있을 때 유용 하며 코드가 발전함에 따라 기존 사물에 대한 새로운 작업 을 주로 추가 합니다. 기존 데이터 형식으로 계산하는 새 함수를 추가하면 기존 함수가 그대로 유지됩니다.

진화가 잘못되면 문제가 있습니다.

  • 객체 지향 프로그램에 새로운 작업을 추가하려면 새로운 메소드를 추가하기 위해 많은 클래스 정의를 편집해야 할 수도 있습니다.

  • 기능 프로그램에 새로운 종류의 것을 추가하려면 새로운 기능을 추가하기 위해 많은 기능 정의를 편집해야합니다.

이 문제는 수년간 잘 알려져있다. 1998 년 Phil Wadler는이를 "표현 문제"라고 불렀습니다 . 일부 연구자들은 믹스 인과 같은 언어 기능으로 표현 문제를 해결할 수 있다고 생각하지만 널리 받아 들여지는 솔루션은 아직 주류에 미치지 못했습니다.


나는 당신의 대답, 지혜의 말씀을 좋아합니다. 나는 몇 달 전에 그것을 만났고 그것을 북마크하지 않았기 때문에 30 분을 특별히 찾았습니다. 기술보다는 개념 이해의 이점을 이해하는 사람들을위한 OOP 대 FP에 대한 최고의 설명. 표현 문제에 관한 논문도 환상적입니다. 귀하의 통찰력을 공유해 주셔서 감사합니다. 귀하의 답변은 매우 저평가되었습니다.
tobiak777

4

실제 대는 없습니다. 그들은 완벽하게 보완적일 수 있습니다. OOP를 지원하는 FP 언어가 있습니다. 그러나 커뮤니티는 모듈성을 처리하는 방식이 다릅니다.

FP 언어 사용자는 수학 법칙을 통해 모듈성을 달성하는 경향이 있습니다. 또한 법을 준수한다는 증거를 선호합니다.

명령형 OOP 사용자는 테스트 사례에서 개체의 동작을 캡처하는 경향이 있으며, 개체가 변경되고 모듈 방식으로 변경되면 다시 실행할 수 있습니다.

그것은 단지 작은 측면이지만 언급 할 가치가 있다고 생각합니다.


2

유추 :

구직 신청을하셨습니다. 당신은 당신의 이름, 연락처 정보 및 작업 내역을 입력합니다. 완료되면 더 이상 빈 응용 프로그램이 없습니다.

대신 글을 쓰기 전에 명확한 셀로판으로 오버레이한다고 상상해보십시오. 당신은 당신의 이름을 씁니다. 다른 셀로판 시트를 추가합니다. 당신은 당신의 연락처 정보를 작성합니다. 더 많은 셀로판. 당신은 당신의 작업 기록을 작성합니다. 완료 한 후에도 빈 응용 프로그램은 그대로 유지됩니다. 또한 단일, 별개의 변화의 효과를 포착 한 세 장의 셀로판이 있습니다.

전자 (OOP)는 상황을 바꾸는 아이디어를 수용하는 반면 후자 (FP)는이를 피한다. 둘 다 상태 관리 패러다임입니다. 두 가지 모두 다른 전략을 사용하여 구직 신청 완료의 효과를 포착 할 수 있습니다. OOP는 시작 기기를 직접 변경하고 FP 는 변경 모양에 영향을주기 위해 이전 온 것을 오버레이합니다 .


아름다운 비유, thx! 이 두 가지 접근 방식의 장단점 으로이 비유를 확장 할 수 있습니까?
Rahul Agarwal
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.