← 블로그 목록

함수형 프로그래밍이 게임 개발에서 유용한 곳은 상태를 없애는 곳이 아니라 상태 변화를 분리하는 곳이다

함수형 프로그래밍은 게임 코드를 전부 다시 쓰라는 명령이 아니다. 불변 데이터와 순수 함수의 관점을 이용해 규칙 계산, 상태 전이, 서버 메시지 처리처럼 변화를 분리해야 하는 영역을 더 다루기 쉽게 만든다.

함수형 프로그래밍이 게임 개발에서 유용한 곳은 상태를 없애는 곳이 아니라 상태 변화를 분리하는 곳이다

함수형 프로그래밍이 게임 개발에서 유용한 곳은 상태를 없애는 곳이 아니라 상태 변화를 분리하는 곳이다

함수형 프로그래밍을 이야기하면 자주 나오는 오해가 있다. “변수가 없으니 게임처럼 상태가 많은 프로그램에는 안 맞지 않나?”라는 반응이다. 하지만 실제 핵심은 상태를 부정하는 데 있지 않다. 더 정확히는 상태와 상태 변화를 어떻게 다룰지 분리하는 태도에 가깝다.

그래서 함수형 프로그래밍이 게임 개발에 주는 도움도, 엔진 전체를 순수 함수로 바꾸는 데 있지 않다. 규칙 계산, 상태 전이, 메시지 처리처럼 복잡한 변화를 다뤄야 하는 구간을 더 예측 가능하게 만드는 데 있다.


불변성은 “상태가 없다”가 아니라 “함부로 바뀌지 않는다”에 가깝다

Clojure의 공식 문서는 컬렉션 자료구조가 immutable and persistent, 즉 불변이고 이전 버전을 유지하는 구조라고 설명한다. Microsoft의 C# records 문서도 레코드가 주로 불변 데이터 모델을 지원하기 위해 의도되었다고 설명한다.

이 관점이 게임 코드에서 유용한 이유는 분명하다.

즉 불변성은 상태를 없애는 기술이 아니라, 상태 변경의 책임을 더 또렷하게 보이게 하는 기술이다.


순수 함수 관점은 규칙 계산을 테스트하기 쉽게 만든다

게임에는 “입력을 받아 결과를 계산”하는 규칙이 많다.

이런 부분은 외부 IO나 전역 상태에 기대지 않고, 입력을 받아 결과만 돌려주는 함수로 분리하기 좋다. 그러면 테스트가 쉬워진다. 같은 입력에는 같은 결과가 나와야 하므로 버그를 좁혀 가기도 편하다.

즉 함수형 사고가 특히 잘 맞는 곳은 게임 세계의 규칙을 계산하는 레이어다.


동시성에서는 “공유 가변 상태를 줄인다”는 발상이 특히 강하다

Erlang의 공식 문서는 언어 자체를 동시성 프로그래밍과 함께 소개한다. 함수형 언어 전반이 공유 가변 상태를 줄이는 방향을 강조하는 이유도 여기 있다. 여러 작업이 동시에 돌 때, 모두가 같은 값을 제멋대로 바꾸는 구조는 버그를 만들기 쉽다.

게임 서버나 백엔드에서 이 관점이 유용한 이유는 명확하다.

이렇게 나누면 락과 경쟁 상태를 완전히 없애지 못하더라도, 적어도 어디에서 문제가 생기는지 훨씬 분명해진다.


게임 코드 전체를 함수형으로 만들 필요는 없다

여기서 조심해야 할 점도 있다. 렌더링, 입력 처리, 파일 IO, 네트워크 송수신처럼 게임 엔진 바깥과 맞닿는 부분은 본질적으로 부작용이 있다. 이런 곳까지 억지로 순수하게 만들려 하면 오히려 코드가 불편해질 수 있다.

그래서 현실적인 적용은 보통 이렇게 나뉜다.

즉 함수형 프로그래밍은 전체 종교가 아니라, 어디를 더 순수하게 유지할 것인가를 고르는 설계 감각으로 쓰는 편이 낫다.


핵심 정리

함수형 프로그래밍이 게임 개발에서 유용한 이유는 상태를 완전히 없애기 때문이 아니다. 불변 데이터와 순수 함수 관점을 이용해, 상태 변화가 많은 게임 코드의 일부를 더 예측 가능하고 테스트하기 쉽게 만들기 때문이다.

특히 규칙 계산, 상태 전이, 서버 메시지 처리 같은 영역에서는 이 관점이 강하다. 반대로 렌더링과 IO까지 억지로 순수하게 만들 필요는 없다. 결국 중요한 것은 함수형이라는 이름보다, 상태와 부작용을 어디서 어떻게 분리할 것인가다.

참고 자료

← 목록으로
Related

함께 읽으면 좋은 글

함수형 프로그래밍불변성자료구조
불변 자료구조가 비효율적으로 보이는데도 계속 쓰이는 이유

불변 자료구조는 매번 전체를 복사하는 비효율적인 방식처럼 보이지만, 실제 구현은 구조적 공유와 영속 자료구조를 바탕으로 훨씬 더 실용적으로 동작한다.

함수형 프로그래밍재귀순수 함수
함수형 프로그래밍에서 재귀가 중요한 이유는 루프를 금지해서가 아니라 상태를 드러내기 위해서다

함수형 프로그래밍에서 재귀는 루프의 대체재라기보다 상태 변화를 인자로 드러내는 방식에 가깝다. 특히 꼬리 재귀와 누산기 패턴을 이해하면 이 차이가 분명해진다.

리팩토링기술 부채프로그래밍
게임 프로젝트에서 리팩토링이 생존을 결정한다

출시 직전에 터지는 버그, 기능 추가할 때마다 무너지는 구조. 게임 프로젝트에서 리팩토링을 미루면 어떤 일이 벌어지는지, 그리고 실전에서 리팩토링을 언제, 어떻게 해야 하는지를 경험을 바탕으로 정리한다.