함수형 프로그래밍이란?
프로그래밍 패러다임
명령형 프로그래밍
- 애플리케이션의 상태와 상태를 변경시키는 구문의 관점에서 연산을 설명하는 방식, 어떻게 할 것인지 표현
(상태와 상태를 변경시키는 관점, 명령을 통해 어떤 동작을 할지에 대한 표현) - 절차지향 프로그래밍(순차적으로 위에서 아래로 진행되듯 표현), 객체지향 프로그래밍
선언형 프로그래밍
- 무엇을 할 것인지 표현(모든 동작에 대한 기능을 전부 선언하고 무엇을 할지 표현)
- 논리적 프로그래밍(논리 문장을 이용하여 프로그램을 표현하고 계산을 수행하는 개념), 함수형 프로그래밍
객체지향 프로그래밍
상태(변수)와 행동(메소드)으로 이루어진 객체로 레고 블럭을 쌓듯 프로그래밍을 짜는 것.
컴퓨터의 사고방식에 따라 짜인 절차지향 프로그래밍에 비해 사물과 같이 하나의 객체단위로 나눈 프로그래밍이다.
- 장점 : 코드에 대한 재사용성이 높고 내부적으로 어떻게 작동하는지 몰라도 라이브러리의 기능들을 사용할 수 있어 생산성도 높다. 객체 단위로 코드가 나누어져 있어 디버깅이 쉽고 유지보수가 쉽다.
- 단점 : 객체 간의 정보 교환이 모두 메시지 교환을 통해 일어나 많은 overhead가 발생. 상위 클래스를 상속받는 경우 상위 클래스 변경이 어려움. 유사한 기능의 클래스가 중복으로 만들어진다. 객체지향은 상태를 저장해 에러를 발생하므로 함수형 프로그래밍으로 보완하기도 한다.
(객체지향 프로그래밍의 경우 객체들의 관계를 중심으로 코드가 작성됨, 따라서 변수, 메서드 등이 긴밀한 관계를 가지고 있어 인스턴스 변수 값이 객체의 상태가 되고 메소드는 상태에 의해 행동을 하게 된다. 그에 따라 결과가 달라질 수 있다)
함수형 프로그래밍의 탄생
함수형 프로그래밍의 경우, 값의 연산 및 결과 도출 중심으로 코드작성이 이루어진다. 함수 내부에서 인자로 받은 값을 별도로 저장하거나 하지 않고, 간결한 과정으로 처리하고 매핑하는데에 주 목적을 둔다. 같은 인풋은 같은 아웃풋을 내고 상태에 따른 부작용을 방지한다. 객체지향의 단점을 보완하기 위해 탄생한 개념.
특징
부수효과가 없는 순수 함수를 1급객체로 간주, 참조 투명성을 지킬 수 있음
부수효과(side effect)
- 변수의 값 변경, 자료 구조를 제자리에서 수정, 객체의 필드값 설정, 예외나 오류로 실행 중단, 콘솔 또는 파일 I/O 발생
- 부수효과가 없는 함수를 순수함수라고 하며, Thread에 안전성을 보장받을 수 있고 이에 따라 병렬 처리를 동기화 없이 진행할 수 있음
일급객체
- 변수나 데이터 구조 안에 담을 수 있음
- 파라미터로 전달 할 수 있음
- 반환값 가능
- 할당에 사용된 이름과 무관하게 고유한 구별이 가능
참조투명성
- 동일 인자에 대해 동일한 값을 반환함
- 데이터가 변하지 않고 기존의 값을 유지함
함수형 프로그래밍의 장점
- 상태를 불변으로 만들어 상태에 따라 결과가 달라지는 부작용 방지(불변성, 함수형 프로그래밍의 핵심)
- 자료 처리를 수학적인 함수의 계산으로 취급하고 상태와 가변적인 데이터를 배제
- 고차함수를 통한 재사용성 증가(상태의 변화를 강조하는 대신 함수의 응용을 강조)
- 코드가 간결해 가독성이 높음
- 동시 작업이 용이
참고
추상화란?
- 사전적 의미 : 법칙을 뽑아내는 것, 본떠서 뽑아내는 것
- 추상화를 적절히 시키면 코드의 재사용성, 가독성, 생산성, 에러 방지 등 효과가 있음
- 함수, 상속, 인터페이스 등도 추상화의 예
- 즉, 구현하고자 하는 것(구체적인 현실세계 및 프로그램, 어플리케이션 등)의 '특성'을 잘 뽑아내 코드로 작성하는 것
- 데이터를 적절히 변수와 상수로 나누고 각 요소들의 연고나성을 고려하여 적절한 알고리즘을 이용해 함수를 작성한다.
상속(Inheritance)과 조합(Composition)
상속
- 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것
- 코드 재사용 가능, 코드를 공통적으로 관리해 코드의 추가 및 변경이 쉬움(확장성)
- 일반적인(general) 클래스가 이미 구현이 되어 있는 상태에서 상위 클래스 로직을 사용해 좀 더 구체적인 클래스를 구현하기 위해 사용
- 상속 관계 중 IS-A 관계
상속의 문제점
- 상위 클래스의 구현이 하위 클래스에 노출돼 캡슐화가 깨진다, 자식클래스가 부모클래스에 의존성이 강해지고 상위 클래스 코드 변경에 따라 하위클래스가 영향을 받게 됨
- 상위 클래스가 어떻게 구현되느냐에 따라 하위 클래스의 동작에 이상이 생길 수 있음
조합
- 코드의 재사용(단순히 다른 클래스의 기능이 필요한 경우), 유연성
- 주로 클래스의 멤버변수로 선언하고 생성하여 사용
- 기존 클래스가 새로운 클래스의 구성 요소로 쓰이는 것(Forwarding)
- 기존 클래스에 새로운 메서드가 추가되도 영향받지 않음, 메소드를 호출하는 방식으로 작동해 캡슐화를 깨지 않음,
- 상속 관계 중 Has-A 관계
객체지향의 캡슐화
- 캡슐화는 중요한 데이터를 보존,보호하는 것
- 캡슐화(encapsulation)는 일반적으로 연관 있는 변수와 함수를 클래스로 묶는 작업
- 은닉성, 클래스에 담는 내용 중 중요한 데이터나 기능을 외부에서 접근하지 못하게 함
'CS' 카테고리의 다른 글
[네트워크]Web 서버와 WAS 차이 (0) | 2021.04.22 |
---|---|
[CS]디자인 패턴 (0) | 2021.04.21 |
[CS]TDD란? (0) | 2021.04.20 |
[OS]스레드 동기화 기법 (0) | 2021.04.18 |
[CS]로드밸런싱, LoadBalancer(L2, L4, L7) (0) | 2021.04.17 |