명령형 프로그래밍과 선언형 프로그래밍, 객체 지향 프로그래밍은 명령형 프로그래밍, 함수형 프로그래밍은 선언형 프로그래밍에 속한다.
객체 지향 프로그래밍은 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모일으로 파악하고자 하는 프로그래밍 패러다임 중 하나이다.
객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 컴퓨터 프로그래밍의 패러다임 중 하나이다.
캡슐화란 하나의 객체를 특정한 목적을 위해 필요한 변수나 메서드를 하나로 묶는 것이다.
캡슐화를 위한 메소드 설계방법
1) 속성이 선언되었으나 이를 변경하는 메서드가 없다면 잘못된 속성이다.
2) 실물 객체가 가진 모든 기능을 제공해야 한다.
3) 각각의 메소드는 서로 관련성이 있어야 한다.
4) 객체의 변경은 객체 안에 있는 메서드로 처리해야 한다.
상속성은 기존 상위클래스에 근거하여 새로운 하위 클래스와 행위를 정의할 수 있는 속성이다.
OOP에서 상속성은 재사용성(reuse)을 향상해준다.
또한 상속성은 상위 클래스의 변셩 한 번으로 여러 개의 하위 클래스들의 변경이 가능해 유지보수성이 향상된다.
다향성은 서로 다른 클래스의 객체가 같은 동작 수행 명령을 받았을 댸, 각자의 특성에 맞게 동작하는 것을 말한다.
다형성은 상속을 통해 기능을 확장하거나 변경하는 것을 가능하게 해 준다. 이를 통해 코드의 재사용을 가능케하여 유지보수가 용이하도록 도와줄 수 있다.
예를 들어 람보르기니, 페라리, 마세라티 등의 객체들이 있다면 "자동차"라는 개념으로 묶고 "바퀴가 4개 달려있다", "도로를 달린다" 등의 속성을 추출할 수 있을 것이다.
재사용성을 높이고 유지보수가 용이하다.
어떻게 동작하는지 몰라도 여러 기능을 사용할 수 있다.
객체 단위로 데이터를 모델링하여 요구사항을 보다 명확하게 파악할 수 있다.
객체 간의 정보 교환이 메시지 교환을 통해 일어나 실행 시간의 오버헤드가 크다. 즉, 실행이 느리다.
객체의 설계가 쉽지 않다.
함수형 프로그래밍은 자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임의 함수이다.
함수형 프로그래밍은 최근 들어 각광 받는 프로그래밍 패러다임으로 개발 속도를 높여 생산성을 높이고, 가독성을 높이는 등 다양한 장점을 함수형 프로그래밍을 통해 얻을 수 있다.
수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임의 하나이다.
함수형 프로그래밍은 객체지향 프로그래밍 혹은 절차적 프로그래밍의 반대 개념이 아닌 서로 상호 배타적이지 않으며 대부분의 시스템은 이 세가지를 모두 사용하는 경향이 있다.
함수형 프로그래밍 언어로 분류되는 대표적인 언어로는 SQL, Scala, Clojure등이 존재한다.
함수형 프로그래밍의 원칙 중 하나는 데이터를 함수 밖에서 변형(modify) 하지 않는 것이다. 다만, 함수의 반환 값(Return Value)은 함수 내에서 수행된 작업을 반영해야 한다.
이것은 부수 효과(Side Effect)를 방지할 수 있는 방법이며 함수의 영향에 대해 추론하는 것을 더 쉽게 만들어준다.
클로저란 부모 함수가 실행되었더라도 부모 함수의 변수에 접근할 수 있는 내부 함수(inner function)를 뜻한다.
함수형 프로그래밍의 이상(ideal)은 순수 함수라고 알려져있다. 순수 함수는 입력 파라미터에만 의존하며, 부수 효과를 일으키지 않는 함수를 뜻한다. 함수형 프로그래밍은 순수 함수를 통해 불변하는 데이터의 특징을 가질 수 있다.
이러한 순수 함수의 아름다움은 단순함에 있다. 순수 함수는 오직 인수(arguments)와 반환 값으로만 환원된다. 즉, 순수 함수는 정의된 API를 통해서만 외부 시스템과 상호 작용하여 결과를 만들어낸다. 쉽게 말해 정해진 입력 값을 주면 정해진 반환 값을 주기만 할 뿐, 부수 효과가 발생하지 않는 단순한 구조를 가지고 있는 것이다.
바로 이점이 객체 지향 프로그래밍(이하 OOP)과 다른 점이다. OOP는 객체의 메서드가 객체의 상태(혹은 객체의 멤버)와 상호작용하며 외부 상태가 함수 내에서 조작되고는 한다.
순수 함수라는 이상(ideal)을 넘어, 실제 함수형 프로그래밍은 일급 객체 함수에 의존한다. 일급 객체란 다음과 같은 특징을 가진 객체를 뜻한다.
이러한 일급 객체 함수는 사용에 제한이 없기 때문에 프로그램 내 어디서든 사용할 수 있어 유연(flexible)하고 유용하다.
유지 관리 가능성이란 함수 밖에서 의도치 않게 어떠한 것이 바뀌지 않으므로(=부수 효과가 발생하지 않기 때문에) 프로그램을 유지 관리하기 용이하다는 뜻이다.
모듈화는 생산성을 증가시킨다. 작은 모듈은 빠르게 작성할 수 있으며 재사용하기 용이하여 프로그램 개발 속도를 높일 수 있다. 또한 모듈은 분리하여 테스트하기에도 유용하여 디버깅과 테스트 시간을 줄일 수 있다.
함수형 프로그래밍에서 함수는 항상 같은 동작을 진행한다. 따라서 프로그래머는 함수의 실행으로 인해 어떠한 결과를 반환할지 예측할 수 있다. 동일한 인자에 대해서는 항상 동일한 결과를 반환한다는 뜻으로 해석해도 된다.
함수형 프로그래밍을 사용하면 다음과 같은 장점들이 존재한다.
함수형 프로그래밍은 그 유연성과 유용함을 인정받아 대표적인 OOP 언어인 JAVA와 C# 에서 조차 일급 객체 함수를 지원한다. Java 8에서부터 람다(Lamda)를 지원하는 것이 그 예이다.
하지만 다음과 같은 한계점도 존재한다.