📖 구조 노트 목차 Chapter 6 읽는 중

6. 함수는 연결이다

구조 노트 Chapter 6 2026. 07. 12.

order.getUser()라는 메서드를 호출하면 주문 객체 하나가 사용자 객체 하나로 바뀌어 돌아온다. 이 함수 안을 들여다보면 사실 하는 일은 단순하다. 주문에 저장된 user_id를 꺼내서 users 테이블에서 그 값과 일치하는 행을 찾아 돌려주는 것뿐이다. 계산이라고 부르기도 민망할 정도로 소박한 조회다. 하지만 이 소박한 동작이 5장에서 이야기한 관계를 실제로 걸어서 따라가는 유일한 방법이다. user_id라는 숫자는 관계가 존재한다는 사실만 기록하고 있을 뿐, 그 관계를 따라가서 진짜 사용자 객체를 찾아 주는 것은 함수다.

이 관점으로 보면 함수의 정의도 조금 다르게 읽힌다. 학교에서는 함수를 입력을 받아 출력을 내놓는 상자로 배운다. 틀린 말은 아니지만, 그 상자 안에서 정확히 무슨 일이 일어나는지는 이 정의만으로는 흐릿하다. getUser()처럼 관계를 따라가는 함수를 기준으로 다시 보면, 함수란 한 대상의 집합에서 다른 대상의 집합으로 이어 주는 대응에 더 가깝다. 입력값 하나마다 정확히 하나의 도착지를 정해 주는 지도라고 해도 좋다. 주문 하나를 넣으면 그 주문에 대응하는 사용자 하나가 나온다.

이 대응이라는 관점은 수학에서 말하는 함수의 정의와도 잘 맞아떨어진다. f(x) = x + 1 같은 수식도 사실은 정수 하나를 골라서 다시 다른 정수 하나로 대응시키는 규칙이다. 다만 프로그래밍의 함수는 출발지와 도착지가 정수처럼 단순한 집합일 필요가 없다. 주문에서 사용자로, 커밋에서 부모 커밋으로, 파일 경로에서 그 파일의 내용으로. 대응하는 대상의 종류가 달라져도 함수가 하는 일은 같다. 한쪽 대상을 다른 쪽 대상에 정확히 하나씩 짝지어 주는 것이다.

이 대응은 한 번으로 끝나지 않는다. 주문에서 사용자를 찾아냈다면, 그 사용자에서 다시 그가 속한 회사를 찾아낼 수도 있다. order.getUser().getCompany()라고 이어 쓰면 주문 하나가 곧바로 회사 하나로 이어진다. 중간에 사용자를 거쳤다는 사실은 코드 한 줄 안에 묻혀 버리고, 결과만 보면 마치 주문에서 회사로 곧장 건너간 것처럼 보인다. 두 개의 대응을 이어 붙이면 새로운 하나의 대응이 만들어진다는 사실이 여기서 이미 드러나 있다.

그렇다면 이렇게 이어 붙이는 일은 아무 함수끼리나 가능한 걸까. 아니면 여기에도 지켜야 할 규칙이 있는 걸까. 다음 화에서는 함수들이 사슬처럼 이어질 때 프로그램 전체가 어떤 하나의 지도로 완성되는지 살펴본다.