객체? 순수함수? 개발자의 선택은!
#OOP
#FP
#개발패러다임
#INFCON
#인프콘
개발자들이 함께 모여 서로의 경험과 인사이트를 나누는 축제, 인프콘! 8월 15일, 드디어 많은 분들이 기다려 주신 두 번째 인프콘이 개최됩니다. 인프콘을 기다리는 인프러너 여러분들을 위해 인프런이 준비한 <Tech Series>! 인프콘에서 만날 수 있는 여러 기술에 대해 미리 알아볼 수 있도록 소개해 드릴게요.
<INFCON Tech Series> 세 번째 이야기는 프로그래밍 패러다임 중에서도 자주 언급되는 두 가지, 객체지향 프로그래밍과 함수형 프로그래밍에 대해 다룹니다. 프로그램을 작성하는 관점과 방식을 결정하는 두 패러다임이 서로 어떻게 다른지, 어떤 특징이 있을지 궁금하셨나요? 인프런이 간단히 정리해보았습니다.
INFCON Tech Series #3 🔎
“객체지향 & 함수형 프로그래밍이 대체 뭐지?”
5분 안에 빠르게 요약해드려요!
헤쳐 모여! 객체로 묶고 나눠요
객체지향 프로그래밍
‘내 아이폰14(객체)’도 거슬러 올라가면 아이폰14, 아이폰, 스마트폰... 이라는 상위 개념(클래스)으로 포괄되어 있죠. 각각의 상위 개념은 특정한 속성을 가지고, 하위 개념들에게 속성을 공통적으로 물려주게 됩니다(상속).
객체지향 프로그래밍(Object-Oriented Programming, OOP)은 말 그대로 프로그램을 객체(Object)들의 집합으로 구성하는 방법입니다.
초기 프로그래밍 패러다임의 주류는 작은 규모의 함수(프로시저)를 생성하고 이를 호출하는 구조로 작업을 진행하는 절차적 프로그래밍(Procedural Programming, PP)이었는데요. 하지만 절차적 프로그래밍은 함수를 구조화할 뿐 데이터 자체를 구조화하지 못하기 때문에 코드 규모가 커지거나 변화가 생기면 각각의 함수에 의존하는 부분을 매번 고쳐야 하는 등 작업이 복잡해진다는 단점이 있었어요.
이런 어려움을 보완하기 위해 등장한 객체지향 프로그래밍은 데이터와 해당 데이터를 조작하는 함수를 객체 단위로 묶습니다. 각각의 객체는 데이터와 함께 관련된 동작을 가지고 있고, 서로 상호작용하며 프로그램을 구성해요. 이때 객체의 속성(데이터)과 동작(메서드)을 정의하는 단위를 ‘클래스(Class)’라고 부르죠.
이렇게 한번 정의해 둔 클래스는 언제든지 호출해서 쓸 수 있어요. 때문에 객체지향 프로그래밍은 코드 재사용성이 높고, 대규모 프로젝트에서의 코드 유지 보수나 확장에도 이점이 있죠. C++과 C#, Java(자바), Python(파이썬) 등이 대표적인 객체지향 언어입니다.
객체지향 설계의 특징 4가지
캡슐화 (Encapsulation)
데이터의 구조와 역할, 기능(메서드)을 하나의 캡슐 형태로 묶는 개념입니다. 클래스 내부에서만 데이터에 접근할 수 있도록 정보를 은닉하고, 외부에 영향을 받지 않고 객체 내부 구현을 변경할 수 있도록 함으로써 유지보수성을 높여요.
추상화 (Abstraction)
데이터나 프로세스 등을 특성에 따라 따로 묶어 정의하는 과정입니다. 목적에 불필요한 부분을 제거하고 객체들의 공통적인 특징이나 특정한 성질만을 정의함으로써 코드를 단순화하고 프로그램의 유연성을 향상시켜요.
상속 (Inheritance)
하나의 자식 클래스가 상위에 있는 부모 클래스의 속성과 동작을 물려받는 개념입니다. 기존 클래스를 확장하거나 변경하지 않고도 새 클래스를 쉽게 정의할 수 있어 코드 재사용성이 높아지고, 클래스 간 계층 관계를 구조적으로 형성할 수 있어요.
다형성 (Polymorphism)
하나의 변수나 함수가 상황에 따라 다른 의미로 해석되어 동작할 수 있게 하는 성질입니다. 동일한 인터페이스를 쓰면서도 객체의 타입에 따라 여러 다른 기능을 제공하게 함으로써 객체 간의 상호작용을 손쉽게 구현하고 코드 유연성을 높이는 역할을 해요.
깨끗한 함수, 우아한 구조
함수형 프로그래밍
함수형 프로그래밍의 상징처럼 여겨지는 람다(λ, Lambda)와 프로그래밍 언어 클로저, 스칼라, 하스켈.
함수형 프로그래밍(Functional Programming, FP)은 이름에서 알 수 있듯 프로그램을 순수 함수들의 조합으로 작성하는 방법입니다.
절차적 프로그래밍, 객체지향 프로그래밍 등이 속하는 명령형 프로그래밍(Imperative Programming, IP)이 무엇을 ‘어떻게’ 할 것인지에 집중한다면, 함수형 프로그래밍은 ‘무엇을’ 할 것인지에 주목하는 선언형 프로그래밍(Declarative Programming, DP)의 한 갈래예요. 객체 중심으로 프로그램을 설계하는 객체지향 프로그래밍과 다르게, 무엇을 할지를 정하는 함수 중심으로 결과를 만들어내죠.
함수형 프로그래밍에서 순수 함수(Pure Functions)는 함수가 가진 인자 외에 다른 외부 상태에 영향을 받지 않아요. 항상 동일한 입력에 대해 동일한 결과를 출력하도록 되어있죠. 이렇게 함수형 프로그래밍은 변경 가능한 데이터나 상태 대신 불변성과 독립성을 강조합니다. 함수를 블록처럼 쌓아 프로그램을 모듈화하면 일일이 예측되는 상태에 맞춰 부작용이 있는지 테스트할 필요도 없고, 안정적이면서도 간결한 코드를 추구할 수 있죠. 상태 변경을 최소화하기 때문에 동시성 프로그램을 작성할 때 생기는 스레드(Thread) 문제에도 자유롭고요.
오늘날 함수형 프로그래밍 패러다임을 활용할 수 있는 언어로는 클로저(Clojure), 스칼라(Scala) 그리고 하스켈(Haskell)이 주로 꼽힙니다.
함수형 설계의 특징 3가지
순수 함수와 불변성 (Immutable)
외부의 상태에 동작을 의존하거나 영향을 끼치지 않는 함수를 순수 함수라고 해요. 함수형 프로그래밍에서는 순수 함수를 조합해 더 큰 기능을 구현합니다. 변경 가능한 상태를 없앰으로써 프로그램 동작을 단순하게 하고, 예측하게 쉽게 만들어 코드 안정성과 신뢰성을 높여요.
고차 함수 (Higher-Order Functions)
함수를 인자로 다루거나 반환하는 함수인 고차 함수는, 다른 함수를 조작하고 결합해 유연한 동작을 구현하는 데 쓰여요. 필요에 따라 함수를 변수에 할당하고 호출할 수 있기 때문에 함수를 데이터 다루듯 다룰 수 있고, 코드 재사용성과 추상화 수준을 끌어올려주죠.
재귀 (Recursion)
함수형 프로그래밍에서는 for, while 같은 반복문 대신 함수가 자기 자신을 호출하는 재귀 함수를 통해 문제를 해결합니다. 재귀로 하여금 루프 단계마다 갱신되는 반복 변수를 제거함으로써 코드를 간결하고 가독성 좋게 만들 수 있어요.
OOP와 FP, 실무에선 어떤 고민이 있을까?
인프콘 2023에서 만나보세요!
OOP와 FP는 상호 배타적이거나 1:1 대응하는 관계는 아니에요. 많은 프로그래밍 언어가 다중 패러다임을 지원하거나 관련 기능을 탑재하고 있는 만큼 상황에 따라 적합하다고 여겨지는 패러다임을 따를 수 있고요. 중요한 건 ‘문제를 효과적으로 해결’하기 위한 방법을 찾고 또 잘 쓰는 데 있겠죠.
인프콘 2023에서 객체지향 프로그래밍과 함수형 프로그래밍에 대한 생생한 경험담을 만나보세요! 객체지향 프로그래밍에서 추상화가 줄 수 있는 이점은 무엇인지에 대한 인사이트부터, 함수형 프로그래밍 언어를 실무 프로젝트에 사용하며 느낀 점까지 흥미롭고 솔직한 이야기가 여러분을 기다립니다.
4년차 개발자가 바라보는 추상화
이승천 | 토스증권
어렵고 비용이 많이 드는 추상화, 그렇다면 ‘좋은 추상화’가 실무에 가져다주는 혜택은 어떤 것들이 있을까요? 4년차 서버 개발자 관점에서 경험하고 느낀 추상화에 대한 이야기를 전해드립니다.
함수형 프로그래밍 3대장 경험기: 클로저, 스칼라, 하스켈
김대현 | 컨스택츠
함수형 프로그래밍에 관심이 있으신가요? 한국에서는 실무에서 본격적으로 함수형 프로그래밍 언어를 적용한 사례를 접하기 쉽지 않은데요. 지난 몇 년 동안 대표적인 함수형 프로그래밍 언어인 클로저, 스칼라, 하스켈을 도입한 경험과 그 과정에서 느낀 점을 소개합니다.
OOP/FP 프로그래밍을 좀 더 알고 싶다면?
cart_rudolf님, 코멘트 남겨주셔서 감사합니다!
오늘 인프콘 2023 다시보기 영상이 공개되었어요. 두 발표 모두 볼 수 있으니, 모쪼록 즐겁게 시청해 주시면 좋겠습니다 😄 감사합니다!