하나의 주제에 대해 생각을 쓰는 시간을 가져봤습니다.
최근에 이런 질문을 받았다.
"미션을 진행할 때 OOP 관점에서 하세요? FP 관점에서 하세요?"
쉽게 대답하지 못했다.
나는 『객체지향의 사실과 오해』도 읽었고, 최근에는 관련 스터디도 하고 있는데도 여전히 어려운 주제였다.
둘의 차이는 정확히 무엇일까?
나는 어떤 패러다임을 지향하고 있을까?
OOP(객체지향 프로그래밍)는 객체 간의 역할, 책임, 협력, 소통을 중심으로 설계하는 패러다임이다.
이때 객체란 무엇일까? 함수, 클래스, 모듈, 파일 등도 객체가 될 수 있다. 즉, 함수를 써도 OOP를 할 수 있고, 클래스를 써도 OOP를 할 수 있는 것이다.
하지만 많은 사람들이 "클래스로 구현해야만 OOP다"라는 오해를 하고 있다.
왜 이런 오해가 생겼을까?
일단 OOP에서 중요한 네 가지 개념은 다음과 같다.
나는 위 네 가지를 잘 지킨다면 OOP라고 본다. 즉, OOP는 '클래스를 사용하느냐'가 아니라 '객체 간의 협력과 역할 분배'가 핵심이다. 클래스는 OOP를 하기 위한 여러 수단 중 하나일 뿐이다. 오해는 Java가 객체 지향 언어인데 class를 사용해서 생긴 듯 싶다.
"하지만 역할이 있으면 그 역할에 맞는 상태가 필요한데, 그건 클래스에서만 가능한 거 아니야?"라고 생각할 수도 있다.
하지만 함수에서도 클로저를 이용하면 상태를 가질 수 있다. 즉, 클래스가 없어도 OOP를 실현할 수 있다.
그렇다면 나는 오직 OOP 관점에서만 프로그래밍을 할까?
곰곰이 생각해보니 그렇지 않다. 나는 OOP와 FP를 함께 사용하고 있다.
어떤 미션이든 크게 보면 OOP, 작게 보면 FP라고 볼 수 있다.
왜냐하면 나는 클래스, 함수, 모듈, 파일 안에 작은 함수들을 작성하게 되고,
그 함수들은 side effect(부수효과)를 줄이기 위해 순수 함수로 만들고,
일급 객체로 다루기 때문이다.
이러한 접근 자체가 FP 관점에서 사고하고 있다는 증거다.
그렇다면 React는 어떤 관점에서 사용하고 있을까?
React는 함수로 구성되어 있으니 FP(함수형 프로그래밍)일까?
반은 맞고 반은 틀리다.
React에서도 OOP와 FP를 자연스럽게 함께 사용하고 있다.
예를 들어, setState를 보면 OOP의 중요한 개념인 다형성을 활용한다.
같은 인터페이스(메서드명)를 공유하면서도 전달하는 인자에 따라 다른 동작을 수행한다. 이는 "메서드 오버로딩"(다형성의 한 형태) 로 볼 수 있다.
즉, 함수로 작성했다고 무조건 FP는 아니며,
클래스를 사용하지 않았다고 OOP가 아니라는 것도 아니다.
프로그래밍 패러다임은 흑백논리가 아니라 서로 융합될 수 있다.
나는 OOP와 FP를 적절히 활용하며 개발하고 있다는 걸 깨달았다.
그리고 둘다 '어떻게 구조를 더 개선할 수 있을까'라는 목표를 해결하기 위한 수단이라는 것도 말이다.
👨🦰 ??: "클래스 안에 담기면 객체고, 클래스 안에 안 담기면 함수형 프로그래밍입니다."
👀 나: (나는 OOP와 FP에 대한 생각을 정리한 상태였기에 이 말이 틀리게 들려서 반박했다.) "~라고 말씀해주셨는데, 저는 함수도 각자의 역할이 있고 함수끼리 상호작용을 하면서 스스로 책임을 가진다면 OOP 관점이라고 보여져요. 이 부분에 대해서는 어떻게 생각하세요?"
👨🦰 ?? : "객체는 행위 뿐만 아니라 상태를 가지고 있으니까요"
👀 나: "함수도 클로저를 가지고 있으니까 상태를 가질 수 있어서 마찬가지 아닐까요?"
👨🦰 ?? : "함수도 클로저를 가지고 있으니까 객체라고 볼 수 있네요."
"객체를 어떻게 표현할 수 있느냐 표현의 차인 것 같아요."
추가로 OOP와 FP의 차이를 묻는다면, 상태를 다루는 여부로 구분할 수 있다.