프로그래밍에서 함수를 어떻게 이해하는 것이 친숙한가?
by
gg582 · 2026-10-25 11:34:26 · 1 view · 3 min read
Table of contents
우리는 "함수"의 정의를 어찌 이해할 수 있는가?
첫째, 우리에게 가장 익숙한 서구식 정의인 "Function"의 의미를 따져 보자.
어떠한 기능을 하는 것을 정의하기 위해, Functionality와 동계로 하여 "Function"으로 정의한다.
그러나, 이러한 비유보다 더 아름다운 비유야말로 "함수"라는 단어이다.
"함수", 무슨 뜻인가요?
함수는 한자어이기 때문에 바로 보면 이해하기 힘들다. 그러나 오래 전에 사장된 읽기 방식인 훈독을 살짝 개조해서 가져오면 이해하기 쉬워진다. 이를 위해 "함(函)"을 정통 훈독인 함 함이 아닌 상자 함으로 읽어 주자.
函: 상자 함 數: 셈 수
읽어 보자.
"상자셈"
말 그대로다.
처음 언급된 시절의 원문은 살짝 핀트가 다르긴 하지만, 감싸 둔다는 개념은 논리적으로 유사하다.
凡此變數中函彼變數者,則此爲彼之函數
무릇 이 변수가 저 변수를 포함하고 있다면, 즉 이 변수를 저 변수에 대한 함수라고 한다.
즉 "이것"이 "저것"을 싸고 있다는 개념을 조형적으로 표현하기를 "函"이라고 하는 것이 마땅하다.
예를 들어 이러한 함수가 있다고 하자.
\sum_{k=1}^{n} k = \frac{n(n+1)}{2}
이것을 "동전 N개를 받아서, N개, N-1개....1개가 되게끔 더 적은 개수의 동전을 만든 후, 각 실행 단계의 동전을 모두 합해서 쏟아주는 것"으로 정의해 보자.
참조: 이것은 한문으로 "삼각타"라고 불린다.
int sigma_k(int n) {
// 혹은 조금 더 오버플로우 안전하게 return (n & 1) ? ((n + 1) / 2) * n : (n / 2) * (n + 1);
return (n * (n + 1)) / 2;
}
그러하면 이 함수는 이렇게 한국어로 읽힌다.
우리는 sigma_k라는 이름의 상자를 가지고 있습니다. n개의 동전을 받아, n, n-1개, ... 1개가 되게끔 더 적은 동전을 만든 후, 각 실행 단계의 동전을 모두 합하여 쏟아줍니다.
우린 이런 수열은 너무 많이 다뤄 봤으니, 그냥 이렇게 말해도 된다.
sigma_k라는 이름의 상자에 n개의 동전을 넣으면 \frac{n(n+1)}{2} 공식을 따라 동전 개수가 쏟아진다.
그럼 이건 어떨까?
void hello() {
std::cout << "Hello World" << endl;
}
아무것도 넣지 않고, 툭 건드리기만 하면 "Hello World"라고 표준 출력에 쓰고, 아무것도 안 주는 상자
이건 또 다르다.
void log(std::string s, std::string loglevel) {
std::cerr << "[" << loglevel << "]" << " " << s << endl;
}
문자열 두 개를 넣으면 규칙에 따라 표준 출력에 쓰고, 아무것도 안 주는 상자
그럼 이 경우도 있다.
int counter() {
static std::atomic<unsigned int> cnt{0};
return ++cnt;
}
상자 안에 든 원자적 카운터로 자신을 호출한 횟수를 주는 상자
각각 상자 하나만 가지고 "자판기, 전광판, 모니터, 만보기" 라는 비유가 떠오른다.
그리고 이러한 이해 방식의 특장점은, 상자에 넣는 것, 상자, 상자에서 나오는 것, 상자 안과 밖을 의식하게 된다는 점이다.
"Function"은 함수를 기능으로 이해하게 만든다.
그러나 함수는 함수를 연산 상자로 이해하게 만든다.
여기서 AI 슬롭이냐, 소위 말하는 증강 코딩이냐는 결정적으로 갈리게 된다.
단순히 기능으로 생각하면 요청은 매우 거칠고 큰 범위로 떨어진다.
아주 극단적인 예시로는 "글을 쓸 수 있는 블로그를 하나 만들어줘"가 있다.
AI는 자바로 몇 시간만에 블로그를 만들어 줄 수 있다.
하지만 데스크톱/모바일 UI의 차이, 사용자 보안, XSS 공격에 대해 책임지지 않게 된다.
하지만 상자로 생각하면 말이 달라진다.
사용자 로그인을 구현하기 위해서 고유 사용자 정보라는 입력이 필요하고, 로그인이라는 몸통이 필요하고, 결과 반환이라는 출력이 필요하다. 상자 안과 밖의 경계는 뚜렷해야 하고, 누가 송곳을 들고 가서 상자를 뚫고 나가면 안 된다.
그리고 곁가지로 생각해 보자.
한번 입력한 사용자 정보를 받으면, 몸통에 로그아웃이 들어갈 때 역시 패턴이 일관적이게 구현되어야 한다는 것이 곧바로 떠오른다.
또한 사용자 회원가입에 대해서도 "입력이 아직 고윳값을 안 받았으니 비고유 사용자 정보겠구나!" 하면서 바로 가닥이 잡힌다.
상자에 다른 것이 들어간다는 것이 쉽게 연상된다는 뜻이다.
많은 경우 개발 용어는 영어가 더욱 직관적이며, 번역어는 그를 어설프게 모사할 뿐이라는 관념이 지배적이다.
그럼 미국이 이데아고, 동양과 유럽의 수많은 번역어, 그리고 그 번역을 위한 모든 몸부림까지 그림자나 신기루일 뿐이라는 것인가?
한 가지 생각해 보자. 그럼 왜 미국 "밖에서도" 좋은 기술들이 잘만 나오는가?
무릇 번역은 기본적으로 그 나라의 언어가 잘 인식하고 구체적으로 파고드는 장점을 드러내게 하는 것이 상책이고, 뜻을 보존하는 것이 중책이고, 의미를 흐리는 것이 하책이다.
그리고 하책은 애초에 학계에 나오지도 못한다는 것이 현대의 장점이다.
그렇다는 것은 어떤 용어는 글로벌 협업 시 영어를 쓰는 것과는 무관하게, 우리의 이해를 도울 수 있다는 뜻이 아닐까.
P.S
함수라는 단어는 중국의 수학자 이선란이 번역하면서 만든 단어이다.
처음에는 수학을 위한 번역어였지만, 생각보다 프로그래밍에 대입하니 매우 이해하기 좋다.