클래스형 프로그래밍 vs 함수형 프로그래밍

박영준·2023년 8월 21일
0

CS

목록 보기
6/16

클래스형과 함수형의 차이, 어떤 방식을 주로 사용했는지와 그 이유에 대한 것은 개발자 면접에서 자주 나오는 질문 중의 하나!

최근의 프로그래밍 패러다임은 크게 2가지로 나눌 수 있다.

  • 명령형 프로그래밍 : 무엇(What)을 할 것인지 나타내기보다 어떻게(How) 할 건지를 설명하는 방식

    • 절차지향 프로그래밍: 수행되어야 할 순차적인 처리 과정을 포함하는 방식 (C, C++)

    • 객체지향 프로그래밍: 객체들의 집합으로 프로그램의 상호작용을 표현 (C++, Java, C#)

  • 선언형 프로그래밍 : 어떻게 할건지(How)를 나타내기보다 무엇(What)을 할 건지를 설명하는 방식

    • 함수형 프로그래밍: 순수 함수를 조합하고 소프트웨어를 만드는 방식 (클로저, 하스켈, 리스프)

클래스형 프로그래밍

1. 정의

  • 객체 지향 프로그래밍(OOP)의 기본 개념에 따라, 클래스를 사용하여 객체를 생성하고 관리하는 방식
  • 주로 Java, C#, C++ 등의 언어에서 사용
  • 대규모 애플리케이션 개발에 적합

2. 사용 목적

  • 객체 지향적인 설계와 모델링이 필요한 경우에 주로 선택

  • 복잡한 시스템의 구조를 나타내고 관리하기에 적합

함수형 프로그래밍

1. 정의

  • 등장 배경

    • 명령형 프로그래밍을 기반으로 개발했으나, 소프트웨어의 크기가 커짐에 따라 스파게티 코드를 유지보수하는 것이 매우 힘들었다.
  • 함수를 주요한 구성 요소로 사용하여 프로그램을 작성하는 방식

  • 대입문을 사용하지 않는 프로그래밍

    • 대입문이 없기 때문에, 메모리에 한 번 할당된 값은 새로운 값으로 변할 수 없다.
  • 작은 문제를 해결하기 위한 함수를 작성

    • 가독성을 높이고 유지보수를 용이하게 해준다.
  • 주로 JavaScript, Haskell, Scala 등의 언어에서 사용

3. 사용 목적

  • 병렬 처리와 동시성을 강조하며, 상태 변화를 줄여 예측 가능한 동작을 지향하는 경우에 사용

  • 코드의 간결성과 재사용성을 중요시하는 경우

3. 특징

'부수 효과'가 없는 '순수 함수'를 '1급 객체'로 간주하여 파라미터나 반환값으로 사용할 수 있으며, '참조 투명성'을 지킬 수 있다.

1) 순수 함수(Pure Function)

① 정의

  • 부수 효과(Side Effect)들을 제거한 함수들

    • Memory or I/O의 관점에서 부수 효과가 없는 함수

    • 함수의 실행이 외부에 영향을 끼치지 않는 함수

    부수효과(Side Effect) 란?

    • 변수의 값이 변경됨
    • 자료 구조를 제자리에서 수정함
    • 객체의 필드값을 설정함
    • 예외나 오류가 발생하며 실행이 중단됨
    • 콘솔 또는 파일 I/O가 발생함

② 장점

  • 함수 자체가 독립적이며 부수 효과가 없기 때문에, Thread에 안전성을 보장받을 수 있다.

  • Thread에 안정성을 보장 받아, 병렬 처리를 동기화 없이 진행할 수 있다.

2) 1급 객체(First-Class Object)

일반적으로 알고 개발했던 함수들은 함수형 프로그래밍에서 정의하는 순수 함수들과는 다르다.

  • 변수나 데이터 구조 안에 담을 수 있다.
  • 파라미터로 전달 할 수 있다.
  • 반환값으로 사용할 수 있다.
  • 할당에 사용된 이름과 무관하게 고유한 구별이 가능하다.

3) 참조 투명성(Referential Transparency)

  • 동일한 인자에 대해 항상 동일한 결과를 반환해야 한다.
  • 참조 투명성을 통해 기존의 값은 변경되지 않고 유지된다.(Immutable Data)

현대 프로그래밍에서는 클래스형과 함수형을 조합하여 사용하는 "함수형 객체 지향 프로그래밍"이라는 개념도 등장하여, 두 방식의 장점을 함께 활용하는 경우도 있다.

선택하는 방식은 개발자의 선호도, 프로젝트의 요구사항, 언어 및 프레임워크 등 다양한 요소에 의해 결정된다.


참고: [프로그래밍] 함수형 프로그래밍(Functional Programming) 이란?
참고: 클래스형과 함수형

profile
개발자로 거듭나기!

0개의 댓글