대답:
Wikipedia에는 함수 예제 에 대한 훌륭한 기사 가 있습니다. @Konrad Rudolph는 이미 OOP 기사에 대한 링크를 제공했습니다 .
한 패러다임이 다른 패러다임의 수퍼 세트라고 생각하지 않습니다. 그것들은 프로그래밍에 대한 다른 관점이며 일부 문제는 한 관점과 다른 관점에서 더 잘 해결됩니다.
귀하의 질문은 FP 및 OOP의 모든 구현 으로 인해 더욱 복잡합니다 . 각 언어에는 질문에 대한 정답과 관련된 고유 한 특징이 있습니다.
점점 접하는 램 블링 :
나는 스칼라와 같은 언어가 당신에게 두 세계의 최고를 제공하려고한다는 생각을 좋아합니다. 나는 그것이 당신에게도 두 세계의 합병증을 줄 것이라고 걱정합니다.
Java는 OO 언어이지만 버전 7에는 일종의 클로저를 모방하는 데 사용할 수있는 "자원을 사용하여 시도"기능이 추가되었습니다. 여기서는 다른 함수 중간에 로컬 변수 "a"를 업데이트하여 해당 함수에 표시하지 않습니다. 이 경우 다른 함수의 첫 번째 절반은 ClosureTry () 생성자이고 두 번째 절반은 close () 메서드입니다.
public class ClosureTry implements AutoCloseable {
public static void main(String[] args) {
int a = 1;
try(ClosureTry ct = new ClosureTry()) {
System.out.println("Middle Stuff...");
a = 2;
}
System.out.println("a: " + a);
}
public ClosureTry() {
System.out.println("Start Stuff Goes Here...");
}
/** Interface throws exception, but we don't have to. */
public void close() {
System.out.println("End Stuff Goes Here...");
}
}
산출:
Start Stuff Goes Here...
Middle Stuff...
End Stuff Goes Here...
a: 2
이것은 스트림을 열고, 스트림에 쓰고, 확실하게 닫거나, 두 함수를 서로 호출하는 것을 잊지 않는 방식으로 두 함수를 페어링하려는 의도 된 목적에 유용 할 수 있습니다. . 물론 다른 프로그래머가 무언가를 깨뜨리지 않고 try 블록을 제거 할 수있는 것은 매우 새롭고 특이한 일이므로 현재 일종의 반 패턴이지만 흥미로울 수 있습니다.
가장 필수적인 언어로 모든 루프를 재귀로 표현할 수 있습니다. 객체와 변수는 변경할 수 없습니다. 부작용을 최소화하기 위해 Procecures를 작성할 수 있습니다 (컴퓨터에서 진정한 기능을 수행 할 수는 없다고 주장하지만, 실행하는 데 걸리는 시간과 프로세서 / 디스크 / 시스템 리소스는 피할 수없는 부작용입니다). 일부 기능 언어는 모든 객체 지향 작업이 아니라도 많은 기능을 수행 할 수 있습니다. 일부 언어에는 가변 패턴과 같은 특정 패턴을 방지하는 제한 사항 (예 : 변수 업데이트 허용 안 함)이 있지만 상호 배타적 일 필요는 없습니다.
나에게있어 객체 지향 프로그래밍의 가장 유용한 부분은 데이터 숨기기 (캡슐화), 비슷한 개체를 동일하게 다형성 (다형성)하고 해당 데이터에서 함께 작동하는 데이터와 메서드 (객체 / 클래스)를 수집하는 것입니다. 상속은 OOP의 주력 일지 모르지만 나에게는 가장 중요하고 가장 적게 사용되는 부분입니다.
함수형 프로그래밍에서 가장 유용한 부분은 불변성 (변수 대신 토큰 / 값), 함수 (부작용 없음) 및 클로저입니다.
나는 그것이 객체 지향적이라고 생각하지 않지만, 컴퓨터 과학에서 가장 유용한 것 중 하나는 인터페이스를 선언하는 능력이며, 다양한 기능과 데이터가 그 인터페이스를 구현한다는 것입니다. 또한 몇 가지 변경 가능한 데이터 조각을 사용하고 싶습니다. 따라서 모든 프로그램 디자인에서 변경 가능성과 부작용을 제한하려고 시도하더라도 독점적으로 기능적인 언어로는 완전히 편안하지 않습니다.