클래스형과 함수형의 차이, 어떤 방식을 주로 사용했는지와 그 이유에 대한 것은 개발자 면접에서 자주 나오는 질문 중의 하나!
최근의 프로그래밍 패러다임은 크게 2가지로 나눌 수 있다.
명령형 프로그래밍 : 무엇(What)을 할 것인지 나타내기보다 어떻게(How) 할 건지를 설명하는 방식
절차지향 프로그래밍: 수행되어야 할 순차적인 처리 과정을 포함하는 방식 (C, C++)
객체지향 프로그래밍: 객체들의 집합으로 프로그램의 상호작용을 표현 (C++, Java, C#)
선언형 프로그래밍 : 어떻게 할건지(How)를 나타내기보다 무엇(What)을 할 건지를 설명하는 방식
객체 지향적인 설계와 모델링이 필요한 경우에 주로 선택
복잡한 시스템의 구조를 나타내고 관리하기에 적합
등장 배경
함수를 주요한 구성 요소로 사용하여 프로그램을 작성하는 방식
대입문을 사용하지 않는 프로그래밍
작은 문제를 해결하기 위한 함수를 작성
주로 JavaScript, Haskell, Scala 등의 언어에서 사용
병렬 처리와 동시성을 강조하며, 상태 변화를 줄여 예측 가능한 동작을 지향하는 경우에 사용
코드의 간결성과 재사용성을 중요시하는 경우
'부수 효과'가 없는 '순수 함수'를 '1급 객체'로 간주하여 파라미터나 반환값으로 사용할 수 있으며, '참조 투명성'을 지킬 수 있다.
부수 효과(Side Effect)들을 제거한 함수들
Memory or I/O의 관점에서 부수 효과가 없는 함수
함수의 실행이 외부에 영향을 끼치지 않는 함수
부수효과(Side Effect) 란?
- 변수의 값이 변경됨
- 자료 구조를 제자리에서 수정함
- 객체의 필드값을 설정함
- 예외나 오류가 발생하며 실행이 중단됨
- 콘솔 또는 파일 I/O가 발생함
함수 자체가 독립적이며 부수 효과가 없기 때문에, Thread에 안전성을 보장받을 수 있다.
Thread에 안정성을 보장 받아, 병렬 처리를 동기화 없이 진행할 수 있다.
일반적으로 알고 개발했던 함수들은 함수형 프로그래밍에서 정의하는 순수 함수들과는 다르다.
현대 프로그래밍에서는 클래스형과 함수형을 조합하여 사용하는 "함수형 객체 지향 프로그래밍"이라는 개념도 등장하여, 두 방식의 장점을 함께 활용하는 경우도 있다.
선택하는 방식은 개발자의 선호도, 프로젝트의 요구사항, 언어 및 프레임워크 등 다양한 요소에 의해 결정된다.
참고: [프로그래밍] 함수형 프로그래밍(Functional Programming) 이란?
참고: 클래스형과 함수형