고차 함수와 데이터 분리는 게임 로직의 변경 비용을 낮춘다

게임 개발 이야기를 하다 보면 가끔 고차원적인 사고라는 표현이 너무 크게 쓰일 때가 있다. 마치 어떤 특별한 철학만 익히면 엔진이 스스로 생각하기 시작하는 것처럼 들리기도 한다. 하지만 실제로 개발에서 더 중요한 것은 거창한 수사가 아니라, 반복되는 패턴을 어디까지 추상화할 수 있느냐에 가깝다.
이때 자주 등장하는 두 축이 있다. 하나는 고차 함수이고, 다른 하나는 데이터와 로직의 분리다. 둘 다 새로운 개념은 아니지만, 게임처럼 규칙과 예외가 계속 늘어나는 분야에서는 여전히 효과가 크다.
고차 함수는 함수를 값처럼 다루는 방식이다
고차 함수는 함수를 인자로 받거나, 함수 자체를 결과로 돌려주는 함수를 말한다. MIT의 SICP 강의 노트도 map 같은 예를 통해, 공통 패턴을 절차 추상화로 묶을 수 있을 때 언어의 표현력이 크게 늘어난다고 설명한다.
이 개념은 리스프 계열 언어에서 특히 선명하게 드러난다. 리스프는 오래전부터 함수 조합과 절차 추상화를 강하게 밀어붙인 언어군이라, 같은 패턴을 여러 번 손으로 풀어 쓰기보다 공통 동작을 함수로 묶고 다시 조합하는 방식을 자연스럽게 보여 준다.
게임 코드에서는 이런 식으로 연결된다.
- 여러 유닛에 같은 규칙을 적용할 때
반복 구조를 공통 함수로 묶는다. - 이벤트 처리에서
조건과반응을 함수로 분리한다. - 같은 계산 흐름을 갖는 시스템을
조합 가능한 함수로 만든다.
즉 고차 함수의 장점은 코드가 더 어려워 보이게 만드는 데 있지 않다. 반복되는 사고를 함수 수준에서 재사용하게 만드는 데 있다.
게임 개발에서 더 자주 체감되는 것은 데이터와 로직의 분리다
두 번째 축은 설정값과 콘텐츠를 코드에서 분리하는 일이다. XML은 원래 W3C가 표준화한 구조화된 마크업 형식이고, 오늘날 게임 개발에서는 XML뿐 아니라 JSON, YAML, 엔진 전용 에셋 등 다양한 방식이 함께 쓰인다. 핵심은 형식 이름보다 게임 규칙의 일부를 코드 밖에서 다룰 수 있게 만드는 것이다.
이 방식이 중요한 이유는 간단하다. 몬스터 능력치, 상점 목록, 대사, 웨이브 구성, 지역별 드롭 테이블 같은 데이터는 자주 바뀌지만, 매번 엔진 코드를 다시 고치고 빌드하는 식으로 다루면 변경 비용이 너무 커지기 때문이다.
그래서 좋은 데이터 분리는 보통 이런 질문에서 시작한다.
- 이 값은 정말 코드에 박혀 있어야 하는가
- 디자이너나 기획자가 별도 에셋으로 만질 수 있는가
- 여러 오브젝트가 같은 데이터를 참조하게 만들 수 있는가
XML은 만능이 아니라 ‘구조화된 외부 데이터’의 한 사례다
예전 글들에서는 XML이 거의 만능 도구처럼 다뤄지곤 했지만, 그건 과장이다. XML의 장점은 태그 기반 구조가 명확하고 검증 체계를 붙이기 쉽다는 데 있다. 반면 문법이 장황하고, 사람이 자주 손으로 수정하기엔 불편한 경우도 많다.
그래서 요즘 게임 프로젝트에서는 XML만 고집하지 않는다. 대신 프로젝트 특성에 맞춰 더 단순한 JSON을 쓰거나, 엔진 안에서 다루기 편한 전용 에셋 시스템을 쓴다.
Unity의 ScriptableObject 문서도 같은 방향을 보여 준다. Unity는 이를 클래스 인스턴스와 독립적으로 큰 데이터를 저장할 수 있는 데이터 컨테이너로 설명하고, 값 복사를 줄여 메모리 사용을 낮추는 데 유용하다고 안내한다. 결국 핵심은 XML이냐 JSON이냐보다, 공통 데이터는 한 번 정의하고 여러 인스턴스가 참조하게 만드는 설계에 있다.
결국 중요한 것은 추상화가 바뀐다는 점이다
고차 함수와 데이터 분리는 서로 다른 기술처럼 보이지만, 둘 다 개발자의 시선을 한 단계 위로 올린다.
- 고차 함수는
세부 구현보다반복 패턴을 보게 만든다. - 데이터 분리는
객체 하나의 코드보다시스템 전체의 변경 흐름을 보게 만든다.
그래서 이 둘은 게임 개발에서 특히 잘 맞는다. 게임은 규칙이 계속 추가되고, 예외가 쌓이고, 콘텐츠가 반복적으로 수정되기 때문이다. 이런 환경에서 모든 것을 하드코딩으로 밀어붙이면 초반엔 빠르지만 중반부터 금세 경직된다.
핵심 정리
게임 개발에서 말하는 고차원적 사고는 프로그램이 스스로 생각하게 만든다는 뜻이 아니다. 반복되는 규칙을 함수로 추상화하고, 자주 바뀌는 설정을 코드 밖 데이터로 분리해 변경 비용을 낮추는 쪽에 더 가깝다.
고차 함수는 로직의 공통 패턴을 다루게 해 주고, 데이터 분리는 콘텐츠와 설정을 시스템적으로 관리하게 해 준다. 결국 중요한 것은 멋있어 보이는 용어가 아니라, 무엇을 코드로 둘지와 무엇을 데이터로 뺄지, 그리고 어떤 패턴을 재사용 가능한 단위로 묶을지를 분명하게 결정하는 일이다.