함수

{{{#!wiki style="margin-right:10px;margin-left:30px"

이 문서는 비로그인 사용자의 편집이 제한되어 있습니다. 자세한 사유는 여기를 참고하시기 바랍니다.

}}}

  수학에서의 함수 외의 다른 의미에 대한 내용은 함수(동음이의어) 문서를 참조하십시오.

한자

영어

Function

1. 개요
2. 기본적(집합론적) 성질
2.1. 함수의 전사와 단사
2.2. 함수의 합성, 항등함수, 역함수
2.2.1. 멱등함수
2.3. 집합론에서의 엄밀한 정의
3. 실함수
3.1.1. 양함수와 음함수
3.2. 감소, 증가 함수
3.3. 짝함수/홀함수(Even/Odd Function)
3.4. 주기함수(Periodic Function)
3.5. 실함수의 종류
3.5.1. 일차함수(linear function)
3.5.2. 멱함수(power functions)
3.5.3. 다항함수(polynomials)
3.5.4. 이산함수(Discrete Function)
3.5.5. 일변수 함수의 극한
4. 다변수 함수
4.1. 이변수 함수
5. 해석함수(Analytic function)
9. 함수의 역사
9.1. 함수 개념의 태동
9.2. 해석함수에 대한 의문
9.3. 함수의 정의 이후
10. 여담
11. 프로그래밍에서의 함수
11.1. 함수의 장점
11.2. 함수 호출 시 오버헤드
11.3. 수학 함수와의 관계
11.4. 호출 규약
12. 관련 문서

1. 개요

두 집합 사이의 관계를 설명하는 수학의 개념으로, 수학적 구조들의 정의나 수학의 현실 응용을 포함한 다양한 분야에서 활용된다.

함수(函數, function):

집합 X,Y에 대한 함수(function) f[1]는 다음을 만족하는 대응 관계로 정의된다.

  • 임의의 원소 x \in X에 대해, 그에 대응하는 원소 y \in Y가 유일하게 존재한다.[2]
  • 집합 X정의역(domain), Y공역(codomain)이라 말한다. 함수의 정의역과 공역을 강조하려면 'fX에서 Y로의 함수(function from X to Y)이다'는 표현을 사용하고, 보통 f:X \rightarrow Y라는 표기가 이를 의미한다.
  • 원소 x에 대응되는 원소를 x함수값(value of the function) 혹은 상(image)이라 하고, f(x)[3]라 표기한다.
  • 모든 함수값들을 모은 집합을 치역(range)이라 부르고, 종종 f\left(X\right)로 표기된다.

대부분의 경우 보통 함수 하면 실수 집합(의 부분집합)을 정의역과 공역으로 갖는 실함수(real-valued function)를 떠올리게 되고, 이는 실생활에서 기대하는 함수의 역할인 변수에 대한 다른 변수의 변화의 기술에 사용된다. 역사적으로 함수는 미적분학의 주 목적인 시간에 따른 물체의 위치의 변화를 기술하면서 따라나왔고, 이것이 단순히 시간적 변화뿐만이 아니라 관련있는 숫자 둘로 일반화된 것으로 볼 수 있다. 과학에서 나오는 법칙이라고 이름 붙은 것들 대부분은 따지고 보면 뭐가 변할 때 다른 하나가 변하는 함수의 형태로 나온다는 것을 관찰할 수 있다. 비단 과학법칙이 아니라도 연관있어 보이는 두 변수가 함수로 연관되어 있다고 생각하고, 그 함수를 식으로 나타내어 결과나 경향을 예측하는 것이 함수의 주된 쓰임 중 하나인 모델링(modeling)이다. 이 함수의 증감추세를 그림으로 한눈에 표현하는 그래프(graph)는 덤이다. 이런 상황에선 x, y를 각각 독립변수(independent variable), 종속변수(dependent variable)라 부르는 경우가 많다. 흔히 말하는 '다변수함수'의 경우에도 독립변수와 종속변수가 실수 여러 개로 늘어났다는 거 말고는 여기서 크게 벗어나지 않는다.

하지만 이렇게만 함수를 생각하며 저 위의 정의를 보면 적잖은 괴리감을 느낄 수도 있을 것이다. 일반적인 함수는 정의역과 공역이 수의 집합일 필요도 없고, 따라서 그래프는커녕 '변수'니 '변화'니 하는 말부터가 의미가 없다. 위의 현대적인 함수의 정의는 수학자 디리클레 혹은 데데킨트의 정의[4]로, 굳이 식이니 변화니 하는 부분을 다 쳐내고 저렇게 추상적인 부분만 남긴 이유는 수학 중 해석학의 발전에 따른 수학자들의 수요가 일차적 원인이긴 하다. 정말 간단히 말하면 식이나 변화(미분)의 요소가 없는 함수들도 같이 생각을 해주는 게 더 일관성이 있었다고 볼 수 있다. 자세한 이야기는 아래의 '함수의 역사' 부분에 서술되어 있다.

물론 그렇다고 해석학 하나 때문에 저렇게 바꾼 건 아니다. 함수의 추상적 정의는 해석학 이외의 수학 여러 분야에서도 수가 포함되지 않는 광범위한 개념들을 함수로 편입시키며 큰 영향을 끼쳤다. 대학수학 정도만 가도 '함수의 공간'에서 '함수의 공간'으로의 '함수'[5]와 이상해 보이는 함수들이 마구 튀어나오는데, 익숙해지면 생각보다 유용하게 써먹는 경우가 많다. 일상생활과 비교적 관련이 많은 이산수학에서도 알고리즘, 관계, 분류 등을 생각할 때 여기저기서 나온다. 아래 프로그래밍의 함수도 따지고 보면 여기서 비롯되었다고 할 수 있다.

2. 기본적(집합론적) 성질

2.1. 함수의 전사와 단사

  • f\left(a\right)=f\left(b\right)\Rightarrow a=b : 단사(單射, injective) 또는 일대일이라 하고 일대일인 함수를 단사함수 또는 일대일함수이라 한다.
함수가 일대일 함수임을 보일 때는 정의를 사용하기도 하지만, 명제의 대우로 a\ne b \Rightarrow f\left(a\right) \ne f\left(b\right)를 사용하기도 한다.
  • \forall y\in Y,\exists x\in X, f\left(x\right)=y. 즉 치역과 공역이 같을 때를 전사(全射, surjective) 또는 (X에서) Y 위로(onto)의 함수라 한다. 전사인 함수를 전사함수이라 한다. [6]
  • f:X\to Y가 전사이고 단사일 때 f전단사(全單射, bijective)라 한다. 전단사인 함수를 전단사함수 또는 일대일 대응(one-to-one correspondence)이라 한다. one-to-one & onto라고도 많이 사용한다.

유럽에서 사용하는 단사 (injectif), 전사(sejectif), 전단사(bijectif) 등의 용어는 부르바키가 처음으로 도입했다.

2.2. 함수의 합성, 항등함수, 역함수

간혹 함수를 f\left(g\left(x\right)\right)처럼 겹쳐 써야 할 때가 있는데 바로 합성함수라는 것이다. 대개 f\left(g\left(x\right)\right)=(f\circ g\left)(x\right)와 같이 나타낸다. 계산 과정상 제일 안쪽(오른쪽) 함수부터 계산 과정이 진행된다.

함수의 합성은 기본적으로 f\circ g\ne g\circ f, 즉 교환법칙이 성립하지 않는다. 수학적인 방법으로 예를 든다면, 다음과 같다.

f\left(x\right)=2x, g\left(x\right)=x+1 일 때

\left(f \circ g\right)\left(x\right)=2\left(x+1\right)=2x+2, \left(g \circ f\right)\left(x\right)=2x+1 이다.

특별한 이유가 없다면 교환법칙은 성립하지 않는 것이 당연하므로 주의하는 것이 좋다. 사실 정식대로라면 g의 공역과 f의 정의역이 일치할 때만 f \circ g의 합성을 할 수 있으므로, f \circ g가 있어도 g \circ f는 존재하지 않는 경우가 더 많다. 함수의 합성에서 유일하게 성립하는 법칙은 거의 결합법칙 f\circ \left(g\circ h\right)= \left(f\circ g\right)\circ h 뿐이라고 보면 무방하다.

동일 함수가 합성됐을 경우 f\circ f\left(x\right)=f^2\left(x\right)와 같이 지수 꼴로 합성한 횟수를 나타내기도 한다. 단, 삼각함수로그함수에는 적용되지 않는다. 예컨대 \sin^2 x라 하면 \sin \left(\sin x\right)가 아니라 \left(\sin x\right)\times \left(\sin x\right)를 나타낸다.

함수 f:X\to X가 원소를 자기 자신으로 대응시키면, 즉 모든 x\in X에 대해 f\left(x\right)=x라면, fX에서의 항등함수라고 한다. 표기법은 i_X, I_X, \text{id}_X 등으로 다양하다. 함수의 합성에서 항등함수는 항등원과 비슷한 역할을 한다. 즉 f\circ i=i\circ f=f. 다만 주의할 점은 모든 x에 대해 f\left(x\right)=x이기만 하면 항등함수가 될 수 없고, 반드시 정의역과 공역이 같아야 한다는 것이다.

함수 f:X\to Y가 전단사이면 그 역함수 f^{-1} :Y\to X를 생각할 수 있는데, 이는 Y의 원소 y에 대해 f\left(x\right)=y인 유일하게 존재하는 x를 대응시키는 것이다. 다시 말해서 f\left(x\right)=y\Leftrightarrow f^{-1}\left(y\right)=x. 함수의 정의에 비추어 보면 이는 f가 전단사일 때밖에 생각할 수 없다는 것을 알 수 있다. 만약 gf의 역함수라면 f\circ gY에서의 항등함수이고 g\circ fX에서의 항등함수가 되고, 이는 함수의 합성에선 역함수가 역원과 비슷한 역할을 한다는 것을 말해준다. 단 f\circ gg\circ f가 다르다는 것은 주의해야 한다. 둘 다 항등함수라지만 전자는 Y에서, 후자는 X에서의 항등함수이다.

2.2.1. 멱등함수

f\circ f\left(x\right)=f^2\left(x\right) = f\left(x\right)를 만족하는 함수를 멱등함수라고 한다. 대표적으로 부호함수 [math(\mathrm{sgn}\left(x\right))], 항등함수 [math(x)], 상수함수 [math(c)], 실수부 함수 [math(\Re\left(z\right))], 자연수 판별 함수 [math(\bold{1}_{\mathbb{N}}\left(x\right))], 절댓값 [math(|x|)], 그리고 최대 정수 함수 [math(\left\lfloor x \right\rfloor)] 등이 있다.

2.3. 집합론에서의 엄밀한 정의

함수는 관계, 즉 순서쌍들의 집합이다. 각 순서쌍의 왼편이 함수에 넣어지는 값, 오른쪽이 함숫값을 나타낸다. 즉, 집합론에서의 함수의 정의는 함수를 식이 아닌 그래프로서 바라본 것이다. 예를 들어, 함수 f : \mathbb{R} \rightarrow \mathbb{R} , f(x)=x^2 는 집합론에서의 정의에 따르면 이 함수의 그래프 위의 점들 (x, y) = (x, x^2) 의 집합 f= \left\{ (x, x^2) : x \in \mathbb{R} \right\} 그 자체이다. 만약 함수에 넣어지는 값이 여러 개이면 왼편은 그 값들의 순서쌍이 된다. 이때, (a,b)와 (a,c)가 모두 함수의 원소이면 b = c이어야 한다. 즉, 하나의 값에 하나에 함수값이 대응되어야 한다. 이 함수에 속한 순서쌍들 중 왼편의 것을 모두 모은 집합을 함수의 정의역, 오른편의 것을 모두 모은 집합을 함수의 치역이라고 한다. 이 정의를 이용해 함수 합성의 교환법칙과 결합법칙도 증명할 수 있다. ...사실 이건 좀 덜 엄밀한 이야기이다. 실제 함수는 이 순서쌍들의 집합 말고도 정의역, 공역이 순서쌍들의 집합과 3-tuple을 이룬 것을 말한다. 즉, D를 정의역, R을 공역이라고 하고 f(x) \in Rx \in D에 대하여 빠짐없이 딱 하나만 주어져 있을 때 P = \left\{ (x, f(x)) : x \in D \right\} 로 정의하면 f = (D, R, P)로 정의된다는 것이다.[7] 공리적 집합론을 공부했다면 이 정의는 (공리적) 집합이 아닌 것들에 함수를 주는 일을 방지하기 위한 안전장치로 볼 수 있고, 즉 ZFC 공리계 같은 걸 진지하게 파고들지 않는 이상은 일상생활에서까지 이렇게까지 할 필요는 없다.

3. 실함수

우리가 보통 생각하는 함수로, 실수집합의 부분집합을 정의역으로 하고, 실수집합을 공역으로 하는 함수이다. 더욱 엄밀하게 표현한다면 '정의역이 실수인 실가함수(real-valued function)'라 할 수 있는데 특히 정의역이 실수이지만 공역이 복소수인 경우(complex-valued function)과 구별하기 위해 이 용어를 사용한다.

많은 경우에는 함수가 수식으로만 주어진 경우가 많은데, 이럴 경우에는 함수가 식을 만족시키며 정의될 수 있는 최대의 영역인 '자연스러운 정의역'(natural domain)을 정의역으로 생각한다. 다항함수, 삼각함수 같으면 자연스러운 정의역은 실수집합 전체겠지만, f(x) = \sqrt{x}의 자연스러운 정의역은 x \ge 0 정도로 간주될 수 있다. 별다른 언급이 없으면 정의역은 이 자연스러운 정의역으로, 공역은 실수집합으로 간주한다. 물론 정의역으로 어떤 부분집합을 생각해도 문제는 없다.

때때로 정의역의 다른 부분에서 다른 식을 사용함으로써 함수를 묘사하는 경우가 있는데, 이를 '조각적 정의'(piecewise definition)라 부르기도 한다. 한 예로 절댓값 함수는 다음처럼 조각적으로 정의될 수 있다.

\left | x \right |=\begin{cases} x & \mathsf{if} \ x \ge 0 \\ -x & \mathsf{if} \ x < 0\end{cases}

이 방정식의 우변은 함수가 x \geq 0이면 x, x<0이면 -x임을 의미한다. 이렇게 정의되는 함수를 조각적으로 정의된 함수(piecewise-defined function)라 부르기도 한다. 이러한 조각적 정의 함수는 부호 함수 [math(\mathrm{sgn} \left(x\right))], 디리클레 함수 [math(\bold{1}_{\mathbb{Q}} \left(x\right))] 등이 존재한다.

3.1. 그래프

만약 f가 정의역이 D인 함수라면, f의 그래프는 \{\left(x,\ f\left(x\right)\right)\ |\ x\in D\}이다. 그래프는 일반적인 함수에 대해서도 정의되긴 하지만(사실 위의 함수의 집합론적 정의에서는 이 '그래프' 자체가 함수의 정의이다) 보통은 실함수에 대해서 주로 생각한다. 실함수의 경우는 정의역과 공역이 실수이므로 그 그래프는 곱집합 \mathbb{R} \times \mathbb{R}, 즉 평면의 부분집합으로 나타낼 수 있다.

예를 들어 함수 f(x)=x+2의 그래프는 y=x+2인 점 \left(x,\ y\right)들의 집합이다.

좌표 평면의 x축을 독립변수로 하고 각각의 x값에 대응하는 y값으로 수많은 점 \left(x,y\right)을 찍어 선으로 연결하면 그래프를 만들 수 있는데, 이런 식으로 좌표평면 위에서 만들어지는 도형들에 대해 연구하는 학문이 해석기하학이다. y=ax+b 꼴의 함수로 그래프를 그리면 직선이 되고, y=\left(x-a\right)^2+b포물선, \left(x-a\right)^2+\left(y-b\right)^2=r^2이 되는 식. 물론 초등적인 의미에서 원은 함수가 아니다. x^2+y^2=1이라는 원의 방정식에 대해 x={1\over 2} 에 대응하는 값이 두 개가 나오기 때문. 이에 대해서는 보통 다음 음함수(implicit function)의 개념을 통해 함수로 이해하게 된다.

3.1.1. 양함수와 음함수

양함수는 우리가 원래 알고 있는 꼴인 y = f \left( x \right) 가 맞는다. 종속변수를 독립변수에 대하여 표현한 것이다. 이 함수가 우리가 보고 이해하기 쉬운 꼴이다. 함수에 대한 정보가 꼴을 보면 바로바로 튀어나오기 때문이다.

음함수는 f \left( x, y \right) = 0 꼴로 정리되는 x, y 에 대한 모든 식을 말한다. 알다시피 이런 꼴로 정리 되는 유명한 방정식인 원의 방정식은 함수가 아니다. x^2 + y^2 - 1=0을 생각해보면 x = {1 \over 2}에 대응하는 값이 두 개가 나오기 때문에 일반적인 함수는 아니다. 그러나 저 방정식은 y = \sqrt{1-x^2}y = - \sqrt{1-x^2}의 두 개 함수를 은연 중에 포함하고 있다. 그래서 저러한 형태의 함수를 음함수라고 부르는 것이다.

주어진 식이 함수인지 아닌지 판단하는 방법은 정의역에 속하는 임의의 x 값에 오직 하나의 y 값의 대응하는지 확인하면 된다.[8][9]

3.2. 감소, 증가 함수

f가 구간 I에서 정의된 함수이고 x_1,\ x_2I의 임의의 두 점이라고 하자.

1. 만약 x_1<x_2일 때 f\left(x_1\right) \le f\left(x_2\right)이면 함수 fI에서 증가 혹은 단조증가한다고 말한다. 만약 f(x_1) < f(x_2)가 만족된다면 강증가라고 말한다.

2. 만약 x_1<x_2일 때 f\left(x_1\right) \ge f\left(x_2\right)이면 함수 fI에서 감소 혹은 단조감소한다고 말한다. 만약 f(x_1) > f(x_2)가 만족된다면 강감소라고 말한다.

증가, 감소 함수의 정의가 x_1<x_2인 구간 I의 모든 쌍 x_1,\ x_2에 대해서 만족되어야 한다는 것을 아는 것이 중요하다. 구간 I는 유한할 수도, 무한할 수도 있다.

3.3. 짝함수/홀함수(Even/Odd Function)

함수 y=f\left(x\right)가 정의역의 모든 x에 대하여

f\left(-x\right)=f\left(x\right)이면 짝함수(우함수),

f\left(-x\right)=-f\left(x\right)이면 홀함수(기함수)

이다.

yy=x^2 또는 y=x^4와 같이 x의 차수가 짝수이면 짝함수이고, y=\dfrac{1}{x} 또는 y=x^3와 같이 x의 차수가 홀수이면 홀함수이다.

이외에도 다음과 같은 함수가 있다.

홀함수

짝함수

[math(\mathrm{sgn}(x))]
[math(\sin(x))]
[math(\tan(x))]
[math(\csc(x))]
[math(\cot(x))
]
[math(\sinh(x))]
[math(\tanh(x))]
[math(\mathrm{csch}(x))]
[math(\coth(x))
]
[math(\mathrm{Si}(x))]
[math(\mathrm{Shi}(x))]
[math(\mathrm{erf}\left( x \right))]

[math(|x|)]
[math(\cos(x))]
[math(\sec(x))]
[math(\dfrac{\sin(x)}{x})
]
[math(\cosh(x))]
[math(\mathrm{sech}(x))
]
[math(\mathrm{Ci}(x))]
[math(\mathrm{Chi}(x))]
[math(\displaystyle e^{-x^2})]
[math(\delta(x))]
[math(\bold{1}_{\mathbb Z}(x))]
[math(\bold{1}_{\mathbb Q}(x))]
[math(\bold{1}_{\mathbb I}(x))]
[math(\bold{1}_{\mathbb R}(x))]

f\left(-x\right)=f\left(x\right)에서 점 (x,\ y)가 그래프 위의 점이면 점 (-x,\ y)도 그래프 위의 점이기 때문에 짝함수의 그래프는 y축에 대하여 대칭이고, f\left(-x\right)=-f\left(x\right)에서 점 (x,\ y)가 그래프 위의 점이면 점 (-x,\ -y)도 그래프 위의 점이기 때문에 홀함수의 그래프는 원점에 대하여 대칭이다.

수에서의 홀짝과는 특성이 다른데, 이는 다음과 같다.

  • 홀함수×홀함수=짝함수, 홀함수/홀함수=짝함수
  • 홀함수×짝함수=홀함수, 홀함수/짝함수=홀함수, 짝함수/홀함수=홀함수
  • 짝함수×짝함수=짝함수, 짝함수/짝함수=짝함수

홀함수를 미분하면 짝함수가 되고, 짝함수를 미분하면 홀함수가 된다. 부정적분의 경우 홀함수를 적분하면 짝함수가 되지만, 적분상수의 존재 때문에 짝함수를 적분한다고 해서 반드시 홀함수가 되리라는 보장은 없다. 단 y축 위의 한 점에 대하여 점대칭인 그래프를 갖는다.

3.4. 주기함수(Periodic Function)

대표적인 주기함수인 사인함수.

함숫값이 일정 주기로 반복되는 함수. 기본적으로 전단사가 아니기 때문에 역함수를 만들기 위해서는 정의역을 주기 길이로 잘라내야 한다. 가령 위의 사인함수의 역함수 [math(\arcsin (x))]는 함숫값이 [math(\left[-\dfrac{\pi}{2},\dfrac{\pi}{2}\right])]가 되고 이로 인해 정의역이 [math([-1,1])]이 된다.

3.5. 실함수의 종류

3.5.1. 일차함수(linear function)[10]

상수 mb에 대하여 f(x)=mx+b형태의 함수를 일차함수라고 부른다. b=0일 때 함수 f(x)=mx는 원점을 지나고 특히 m=1일 때 함수 f(x)=x를 항등함수라고 부른다. m=0일 때는 상수함수라고 부른다. 그리고 원점을 지나고 기울기가 양수인 일차함수를 비례 관계라고 부른다.

한 변수가 항상 다른 한 변수의 상수배라면, 즉 0이 아닌 상수 k에 대하여 y=kx라면, 두 변수 y,\ x가 비례한다고 말한다.

만약 변수 y1/x에 비례하면 yx에 반비례한다고 말한다.

선형대수학은 이 일차함수를 집중적으로 연구하는 학문이다.

3.5.2. 멱함수(power functions)

a가 상수일 때, 함수 f(x)=x^a를 멱함수라고 부른다. 대표적으로 다음과 같은 경우가 있다.

  • a=n(양의 정수)일 때
함수 f(x)=x^n는 모든 실수에 대하여 정의되고 n이 커질수록 구간 (-1,\ 1)에서는 x축에 점점 가까워지고나중에는 거의 달라붙는다. |x|>1에서는 더 가파르게 증가한다. 항상 (1,\ 1)과 원점을 지난다.
  • 짝수 차수 함수는 (-\infty,\ 0]에서 감소하고 [0,\ \infty)에서 증가한다.
  • 홀수 차수 함수는 (-\infty,\ \infty)에서 증가한다.
  • a=-n(음의 정수)일 때
함수 \displaystyle f(x)=x^{-1}=\frac{1}{x}, \displaystyle f(x)=x^{-2}=\frac{1}{x^2}, ...는 0으로 나눌 수 없으므로 x \neq 0인 모든 x에서 정의된다. 원점에서 멀어질수록 축에 점점 가까워진다.
  • n이 홀수일 때 \displaystyle y=\frac{1}{x^n}의 그래프는 원점에 대하여 대칭이고 (-\infty,\ 0),\ (0,\ \infty)에서 감소한다. 특히 n=1일 때의 그래프는 쌍곡선 xy=1이다.
  • n이 짝수일 때 \displaystyle y=\frac{1}{x^n}의 그래프는 y축에 대하여 대칭이고 (-\infty,\ 0)에서는 증가, (0,\ \infty)에서는 감소한다.
  • \displaystyle a=\frac{1}{n}(양의 정수의 역수)일 때
함수 \displaystyle f(x)=x^{\frac{1}{n}}=\sqrt[n]{x}거듭제곱근 함수이다. 특히 함수 \displaystyle f(x)=x^{\frac{1}{2}}=\sqrt{x},\ g(x)=x^{\frac{1}{3}}=\sqrt[3]{x}제곱근 함수와 세제곱근 함수이다.
  • n이 짝수일 때의 정의역은 [0,\ \infty)이다.
  • n이 홀수일 때의 정의역은 (-\infty,\ \infty)이다.

3.5.3. 다항함수(polynomials)

음이 아닌 정수 n과 실수 a_0 ,\ a_1 ,\ a_2 ,\ \cdots \ a_n(다항식의 계수라고 부른다.)에 대하여 함수 p(x)=a_n x^n + a_{n-1} x^{n-1} +\ \cdots\ + a_1 x + a_0다항함수라 한다. 모든 다항함수는 (-\infty,\ \infty)를 정의역으로 가진다. n>0이고 a_n \neq 0일 때 n을 다항식의 최고차수라고 한다. 기울기가 0이 아닌 일차함수는 차수가 1인 다항함수이다. 모든 다항함수는 연속이며 미분가능하다.

중학교 3학년에서 x^2 , 즉 2차 함수가 처음 등장하며, 3차 함수는 고등학교 1학년[11], 4차 함수는 고등학교 2학년[12]부터 나오기 시작한다.

3.5.4. 이산함수(Discrete Function)

함숫값의 집합이 연속이 아닌 함수를 뜻한다. 연속이 아니므로 미분이 불가능하기 때문에 해석학에서는 다뤄지지 않다시피 하지만, 이산수학에서는 비중있게 다뤄진다. 이산함수 중 값이 정체되어 있다가 일정 주기로 증가하는 함수는 따로 계단 함수(Step Function)로 일컫기도 한다.

대표적인 이산함수로 소수 계량 함수가 있다.

3.5.5. 일변수 함수의 극한

  자세한 내용은 극한 문서를 참고하십시오.

4. 다변수 함수

함수는 위에서 말했듯이 집합 X 의 각 원소 x 에 집합 Y 의 원소 y 가 오직 하나만 대응할 때 X 에서 Y 로의 함수라고 한다. 그리고 집합 X 정의역이라 하고 집합 Y 공역이라 한다. 여기서 X 의 원소들의 상의 집합 \left\{ f \left ( x \right ) | x\in X \right\} Y 의 부분집합으로 치역이라 한다. 이때 x 독립변수라 하고 y 종속변수라 한다. 여기서 일변수 함수인지 이변수 함수인지 판별하는 것은 간단히 독립 변수의 개수가 되겠다. 독립변수가 1개면 일변수 함수, 2개면 이변수 함수, n개면 n변수 함수, 변수가 무한히 많으면 무한 다변수 함수가 되겠다.

대표적인 다변수 함수로 초기하함수가 있다.

4.1. 이변수 함수

이변수 함수는 말 그대로 독립변수가 2개인 함수이다. 일변수 함수와 다르게 꼴이 z = f \left( x, y \right) 처럼 생겼다.[13] 음함수와 헷갈리면 안 된다. 음함수는 f \left( x, y \right) = 0 이다. 굳이 생각 하자면 음함수는 x, y, z 공간의 이변수 함수 z = f \left( x, y \right) 와 평면 z = 0 의 교선이라고 생각해도 된다. 어쨌든 이변수 함수는 일변수 함수와 다르게 실수가 실수에 대응하는 게 아니라 실수의 순서쌍 \left( x, y \right) 이 실수에 대응하는 것이다.

f : R \subset \mathbb{R^2} \to \mathbb{R}

여기서 R 이 함수 f 의 정의역이고 공역이 실수 집합 \mathbb{R}이 되겠다. 여기서 x, y 가 독립변수, z 가 종속변수가 된다.

일변수 함수가 x, y 축이 직교하는 평면인 2차원에서 자취가 그려지는 것처럼, 이변수 함수는 x, y, z 축이 모두 직교하는 공간인 3차원에서 자취가 그려진다.

이변수 함수는 공간상에서 그려지기 때문에 울프럼알파지오지브라 같은 것들을 동원하지 않은 이상 그리기가 쉽지는 않다. 보통 우리는 이변수 함수의 곡면의 개형을 그릴 때는 평면상에서 등고선과 등위선으로 접근한다. z 축을 일정한 상수 c 로 고정시키면 z = c z = f \left( x, y \right) 의 교선이 생긴다. 이 교선을 xy 평면에 사영한다. 여기서 교선의 사영을 등위선, 이러한 곡선의 모임을 등고선이라 한다.

그런데, 일변수 함수처럼 보이는데도 이변수 함수인 함수가 있다. 바로 복소함수. 복소함수의 정의역은 \mathbb{R}이 아니라 \mathbb{C}인데, \mathbb{R}^2\to\mathbb{C}로 대응되는 함수[14]가 존재하기 때문에, \mathbb{R}^2\sim\mathbb{C}이 될 수 있고, 따라서 틀림없이 함수가 f(z)로 변수는 z 하나뿐인데도, z=\Re(z)+i\Im(z)=x+iy이므로 사실상 변수가 2개인 함수인 g(x,y)로 대응시킬 수 있기 때문. 게다가 복소함수는 평범한 실함수와는 다르게, 특정 경우가 아니라면 4차원 공간에서 그려지는 함수이기 때문에, 울프럼알파지오지브라를 동원한다고 해도 완벽하게 그리는 건 불가능하다. 주로 이런 경우 그래프의 개형은 절댓값을 취해서 그리는 게 일반적. 실제로 복소함수는 일반적으로 이렇게 표현한다. f(z)=f(x+iy)=u(x,y)+iv(x,y)

이렇게 낯설어 보이는 개념이지만, 의외로 일상생활에도 쓰는 곳이 있는데 대표적으로 반올림이 있다. 변수 하나는 반올림할 수, 다른 변수 하나는 소수점 자릿수로 생각하면 반올림이 2변수 함수라는 것을 알 수 있다.

4.2. 동차함수

동차함수 문서 참조.

5. 해석함수(Analytic function)

모든 함숫값을 테일러 급수 같은 멱급수로 쪼갤 수 있는 함수.

당연하겠지만 해석함수가 아닌 함수도 있다. 절댓값 함수가 대표적으로, [math(x=0)]에서의 미분계수가 [math(x \neq 0)]에서의 미분계수와 일치하지 않기 때문에 해석함수가 아니다.[15]

6. 초등함수

7. 특수함수

[math(y=\sin x)], [math(\displaystyle y = \int_0^x{1 \over \ln t} dt)] 같이 대수적으로 정의할 수 없는 함수들을 뜻한다. 자세한 내용은 문서 참조.

8. 범함수

함수 그 자체를 정의역으로 삼는 함수이다. 자세한 내용은 문서 참조.

9. 함수의 역사

9.1. 함수 개념의 태동

초창기의 함수는 하나의 변수 y가 다른 변수 x의 변화에 어떻게 반응하는지 개념이었다. 이 개념이 등장하기 위해서는 '변수', '변화' 두 가지의 개념이 필요했다. 즉 '변수'를 만들어 낸 해석기하학과 '변화'를 생각해 낸 미적분학이 함수를 탄생시킨 부모인 셈이다.

시간순서로는 해석기하학이 좀 더 빠르게 나왔다. 데카르트가 좌표를 생각해내며 등장한 해석기하학은 (교과과정의 '도형의 방정식' 부분에서 나오듯이) 여러 가지 도형을 대수식으로 나타낼 수 있는 쓰임새가 있었지만, 어찌 보면 변수라는 개념의 등장 그 자체가 영향이 더 컸다. 이전에도 도형에 대해서 숫자를 대응시키기는 했지만 그것은 선분 사이의 길이비 정도에 국한되어 있었기 때문에 좌표는 현실의 공간을 수와 완전히 일대일대응시키는 첫걸음이었다. 곡선을 따라 움직일 때 좌표 x, y가 변한다는 것을 관찰하며 사람들은 그리스 수학에서는 금기시되었던 변화의 개념에 다가갈 수 있었다.

통념과는 다르게 미분의 전신인 무한소 해석(infinitesimal calculus)이 탄생한 것도 운동이 아니라 이 곡선의 궤적을 관찰하는 것이 먼저였던 것도 이러한 해석기하학의 발전에 근거했다. 이 무한소해석의 태동은 그때 마침 고개를 들고 있었던 적분이론과의 통합 등등을 통해 미적분학의 정립으로 나아가게 되고, 이것이 해석기하학과 다시 융합되어서 공간 속의 곡선에 대해 미적분을 하는 단계에 이르렀다. 이후에 시간에 따른 운동의 변화가 미분으로 설명된 것은 굳이 따지자면 조금 더 나중의 이야기이다.

함수의 이름, 즉 'function'이란 용어도 이때 라이프니츠에 의해 처음 고안되었다. 처음 라이프니츠의 함수의 의미는 기하학적인, 즉 곡선에서 두 변수의 연관 정도에 국한되어 있었지만, 여기에 요한 베르누이가 '식으로 나타내지는 대상'이라는 묘사를 갖다붙였다. 이것이 극단에 이르러 근대적 대수학의 이론이 상당히 발전한 오일러 대에는 "해석적 표현", 즉 테일러 급수(무한히 나가는 멱급수)로 나타낼 수 있는 것들을 함수라 이르게 된다. 물론 저 때에는 테일러 정리 정도는 기본으로 깔려 있었기 때문에 가능한 일이다. 어찌 보면 라이프니츠가 함수의 정의를 내렸다기보다는 함수라는 말에 이것저것 달라붙어서 커져 온 거에 가깝긴 하지만, 그래도 거대한 눈덩이의 시작이 되었다는 점은 체계를 잡았다는 느낌으로 충분히 높게 평가할 수 있다. 대신에 기호 f(x)를 고안한 것은 라이프니츠가 아니라 오일러였다. 라이프니츠는 df/dx까지 쓰긴 했지만 괄호 안에 변수를 넣진 않았었던 것이다.

다만 이렇게 불어난 함수의 의미, 즉 지금의 언어로 말하자면 "함수=곡선=변화=테일러 급수"라는 관념은, 19세기부터 서서히 흔들리기 시작한다.

9.2. 해석함수에 대한 의문

해석함수 공격에 첫 단추를 끼운 것은 의외로 푸리에 해석이었다. 조제프 푸리에가 파동을 연구하면서 나온 푸리에 급수(즉 사인/코사인 함수의 무한합)에서 푸리에는 처음으로 연속이 아닌 '식'을 찾아낸다. 지금으로 비스무레하게 말하면 사각파 이런 애들을 푸리에 급수로 나타낸 것이다. 해석적인 식은 어디에서건 연속이므로[16] 푸리에 급수는 오일러의 함수 범위에선 확실히 벗어난 셈이다. 대신에 푸리에는 모든 함수는 푸리에 급수로 나타낼 수 있다는, 즉 "함수=푸리에 급수"라는 더 급진적인 주장을 해버린다. 이 때문에 푸리에 급수가 항상 원래 함수로 수렴하는지의 문제가 수학자들의 떡밥으로 떠올랐다.

디리클레는 증명을 찾으려는 수많은 수학자들을 대신해 이 떡밥을 해결하며, 항상 그렇지는 않다는 결론을 내었다. 즉 푸리에 급수마저도 함수의 정의로서는 한계가 있다는 것을 지적한다. 여기에 덧붙여 그는 다음과 같이 정의되는 디리클레 함수를 제시한다.

D(x)=\begin{cases} 1 & \text{if } x \in \mathbb{Q} \\ 0 & \text{if } x \in \mathbb{Q}^{c} \end{cases}

해석학을 배운 사람이라면, 이 함수는 어디에서도 연속이 아니라는 것을 알 수 있을 것이다. 연속뿐만 아니라 모든 구간에서 리만 적분이 존재하지 않는다. 하지만 이 함수를 표현하는 다음과 같은 식이 존재한다(...)

\displaystyle D\left(x\right) = \lim_{n \rightarrow \infty} \left( \lim_{m \rightarrow \infty} \cos^{2n} \left(m! \pi x\right) \right) (m, n은 자연수)

당시엔 엡실론-델타 판정법이 완벽하게 정립된 것은 아니었고 리만적분도 아직 정의되기 전이었지만, 그래도 이게 연속이 아니고 보통의 적분도 안되는 것 쯤은 알 수 있었다. 물론 저 극한 식은 그때에는 없었을 것이다. 디리클레는 더 나아가서 함수의 엄밀한 정의를 거의 내릴 뻔하지만, 아쉽게도 조각적인 연속함수의 개념에 그친다. 하지만 디리클레의 이 정의에는 "함수는 수학적 연산으로 나타날 필요가 없다"는 내용은 확실히 쓰여져 있다. 로바체프스키도 1834년 비슷한 서술을 한 바가 있어서[17] 디리클레와 로바체프스키를 사실상의 함수의 정의를 내린 사람들로 꼽는 사람이 많다.

근대 함수의 두 가지 요소인 '식'과 '연속' 중 '식'은 이렇게 날아갔지만, '연속'을 떼내는 데에는 시간이 조금 더 걸렸다. 다만 이것은 위의 디리클레 함수의 예시에서 보듯이, 불연속함수가 존재할 가능성을 생각을 못했다는 것보다는 이것을 함수로 인정해 줘야 하는지를 고민했던 것에 더 가까울 것이다. 이것은 코시의 뒤를 이어 바이어슈트라스극한의 완벽한 정의인 엡실론-델타 논법을 완성하면서, 즉 연속이 무엇인지 정확히 알게 됨으로서 해결되었다. 바이어슈트라스가 모든 점에서 연속이지만 미분불가능한???함수를 만들어낸 시점에는 일반적인 함수의 변화니 뭐니를 논하는 건 전혀 의미가 없다는 것을 다들 체감했을 것이다.

9.3. 함수의 정의 이후

19세기 말의 데데킨트 시점까지 가면 (집합론에서의 약간의 변경을 제외하면) 우리가 현대에 쓰는 함수의 정의가 완벽히 정립된 것으로 본다. 이렇게 이제까지의 불확실성을 모두 떨어내고 함수, 극한, 연속 등을 완벽히 정의한 미적분학은 이 정의들을 바탕으로 해석학이란 이름으로 다시 태어나게 된다.

어떻게 보면 함수의 정의는 극한, 연속, 미분 등의 다른 개념들의 정의와는 다른 방향으로 변화했는데, 다른 것들은 직관적으로 보이는 것들을 엄밀하게 정의해 복잡해진 느낌이 있지만 함수의 정의는 더욱 간소화되었다는 차이가 있다. 물론 정의는 간단할수록 좋지만, 어찌 보면 정의가 간단해진만큼 함수의 범위는 더욱 넓어져서 온갖 괴상한 함수들을 데리고 와야 한다는 뜻이다. 실해석학이 반례의 천국인 이유 하지만 이 결정도 결국엔 맞는 것으로 드러난다. 해석학 중 미분방정식의 풀이법이 극도로 발전하면서 사람들은 개별 함수뿐만이 아니라 이들로 이루어진 벡터 공간인 함수 공간 위에서 해법을 찾는 방식을 생각했는데, 연속함수들만 모아 놓으니 뭔가 많이 부족했던 것. 완비성(completeness) 등의 좋은 성질을 갖는 공간을 찾으려면 연속함수들을 이용하기보다는 전체 함수들의 풀에서 특정 조건을 만족하는 것만 추려내는 것이 더 편했고, 이 방식은 함수해석학(functional analysis)의 시작이 된다.

한편 이렇게 간단해진 함수의 정의로 인해, 함수는 해석학 외의 다른 분야에서 '구조'를 정의하는 일을 맡을 수가 있었다. 사실상 군론의 시작을 연 대칭군(치환군)부터가 따지고 보면 함수들의 모임이고, 선형대수학에서 나오는 선형 변환을 생각하는 데에도 함수의 개념이 필요하다. 여기서 더 나아간 추상대수학을 배우면 초반에는 대수적 구조랑 함수놀이만 하고 있는 자신을 볼 수 있을 것이다. 위에서 단사/전사/전단사 등을 정의한 게 부르바키였다는 것을 보면 언뜻 눈치챘겠지만, 이 함수의 정의도 부르바키식 개편에 잘 들어맞아 채택된 느낌이 있다. 애초에 디리클레의 정의를 집합론적인 정의(1.1.3의 정의)로 엄밀하게 못박은 게 부르바키라, 저 함수의 정의를 디리클레-부르바키 정의라고 부르기도 하니까... 이 부르바키식 개편의 극단이 범주론이고, 그곳의 객체와 사상(morphism) 개념은 비록 함수에서 따왔지만 그걸 넘어선 어마어마한 무언가가 되어버린 것은 말할 필요도 없을 것이다. [18] 아무리 부르바키를 싫어해도 어느 분야이나 함수가 수학자들의 필수 도구가 되어 버린 것은 부정할 수 없다. 물론 함수 하면 떠올리는 것은 분야마다 천차만별일 것이다. 범주론이 아니더라도 실함수의 이미지가 희석된 경우에는 function 대신에 map, morphism 등의 용어도 자주 쓰인다. 한국어로 이들을 '함수'라 번역하는지 '사상'이라 번역하는지는 또 분야마다 제각각이다.

부르바키의 집합론적 정의가 1939년에 등장하기까지에는 또 의외로 길고 긴 우여곡절이 있지만, 모두 따라가자면 수리논리학과 공리적 집합론의 발전사와 엮여 이야기가 매우 길어진다. 재미있는 것은 2번 문단의 함수 내용도 이 과정에 나름의 빚을 지고 있다는 것인데, 힐베르트가 함수를 정의하려는 과정에서 나온 불완전성 정리, 정지 문제 등과 연관되어 알고리즘과 계산가능성 이론, 결국에는 튜링 머신까지 튀어나왔기 때문이다. 교육과정에서 흔히 쓰이는 '마술상자'로의 비유가 설마 컴공에서 역수입된 건 아닐까

10. 여담

함수는 자연현상의 인과관계를 설명할 때 적합하다. 모든 현상(X)은 반드시 그에 따른 결과(Y)가 발생한다. 계속 똑같은 원인이 생기면 당연히 결과도 똑같으며, 뜬금없이 전혀 다른 결과가 생기는 경우는 없다. 컵 속 물을 예로 들자면, 우리가 일상생활에서 -30도에서 200도(정의역)까지 물의 온도를 특정한 값(X)으로 균일하게 조절하면 물은 고체/액체/기체 상태(Y)가 된다. 여기서 생각을 단순하게 해보자. 고체도 액체도 기체도 아닌 다른 상태로 존재하는 것이 가능할까?연? 압력이 낮고 일정하다면 [-30, 200]에서는 일어나지 않는다이 부분에서 함수의 특징 중 하나인 모든 X는 반드시 그와 짝을 이루는 Y값이 있다라는 개념이 들어간다. 또 하나 생각해볼 게 있다. 과연 특정 온도의 물이 한 번에 두 가지 상태를 다 가지는 일이 있을 수 있을까? 상식적으로 생각해봐도 물은 액체이면 액체, 기체이면 기체여야 하며 액체이면서 기체인 경우는 말이 안 된다. 되는데?[19] 여기에 모든 X는 반드시 Y에 하나만 대응한다라는 개념이 포함되는 것이다.

물론 위의 문단은 예시일 뿐, 양자역학적 관점으로는 틀린 말이 된다. 불확정성 원리에 따르면 같은 사람이 던진 주사위라도 항상 같은 수가 나오지 않듯이 같은 조건(x)에서도 다른 결론(y)이 도출될 수 있다고 한다. 즉, '집합 X의 원소 하나에는 Y의 원소 하나만이 대응된다'라는 정의를 위반한 셈. 그리고 사실 액체이면서 기체, 기체이면서 액체인 경우는 존재하긴 한다. 일상생활에서는 보기 힘들 뿐, 애초에 함수 개념이 처음 제시된 때는 아직 양자역학이 들어서기 훨씬 전으로 한창 고전물리학이 태동하던 시기였단 걸 고려하자. 후술하겠지만 이러한 유형의 함수는 좀 더 넓은 의미의 함수와 관계되어 있다.

함수(函數)라는 어휘는 function의 음차로, 종종 초등/중등교육과정에서 함수는 입력값을 넣으면 입력값에 따르는 특정한 출력값이 나오는 '보이지 않는 마술상자'처럼 비유되는데, 유치해 보이는 이 관점이 외려 함수의 정의와 더욱 근접한다. 함수라는 단어는 函(상자)의 의미 또한 절묘하게 살린 번역이었다. 여담이지만 국어사전을 따른 '함수'의 표준발음법은 [함수]가 아니라 [함쑤]다. 꽤나 많은 사람들이 간과하고 있는 사실이었으나, 2017년 12월 3일부로 표준발음이 개정되어 [함수]라고 읽는 것도 허용했다.

이런 식으로 초등학교 때부터 함수를 배워왔다.

바로 이런 것. 이걸 수식으로 표현하면, □ 을 x로, ? 를 y로 놓았을 때 y=x+4가 된다.

일본에서는 함수를 관수(関数)라고 부른다. 다만 이건 원래 일본어에서도 함수를 함수(函數)라고 썼었는데, 상용한자 체계를 도입하면서 函을 쓰지 않게 되고, 덕분에 같은 발음을 지닌 関数를 대신 사용하게 된 것일 뿐이다. 실제로 지금도 函数라는 표기법도 추천되지는 않지만 허용된다.

11. 프로그래밍에서의 함수

프로그래밍에서의 함수는 프로그램 소스 코드에서 일정한 동작을 수행하는 코드(들)[20]을 말한다. 이때 프로그램이 동작할 때 함수의 호출 과정은 다음과 같다.

  • 코드상에서 함수가 호출된다. 이때 변수를 넘겨주기도 하는데 이를 매개변수 또는 인수(parameter)라고 한다.
  • 호출된 함수의 코드가 동작한다.
  • 함수의 동작이 끝나면 함수를 종료하고 경우에 따라 반환값을 코드에 반환한다.

이 함수는 크게 내장 함수와 사용자 정의 함수로 나뉜다. 내장 함수는 프로그래밍 언어 차원에서 이미 정의되어 있는 함수로, 별도로 함수를 만들 필요 없이 형식에 맞춰 불러 쓰기만 하면 된다. 언어 레퍼런스를 보면 상당히 많은 내장 함수가 제공되는 것을 알 수 있다.

사용자 정의 함수는 프로그래머가 만들어 쓰는 함수로, 코드의 어딘가에 미리 정의해 둬야 불러쓸 수 있다.

11.1. 함수의 장점

함수를 이용하면 불필요하거나 여러 번 중복되는 코드를 함수를 호출하는 식으로 간단하게 정리할 수 있다. 또한 프로그램을 여러 함수로 분리하여 프로그래밍에서 더욱 쉬워지기 때문에 현재 대다수의 프로그래밍 언어는 함수를 지원한다.

11.2. 함수 호출 시 오버헤드

함수를 불러올 때, 호출 뒤 귀환할 주소와 현재의 상태를 담고 있는 각종 레지스터를 어딘가에 저장해야한다. 이런 정보들을 저장하는 장소를 보통 호출 스택(call stack) 또는 런 스택(run stack)이라고 한다. 함수를 콜 하기 전에 이런 정보를 저장하는 작업이 필요하므로 약간의 오버헤드가 생긴다. 따라서 프로그램의 속도를 골수로 뽑아내야 하는 시스템 프로그램에는 필요 이상의 함수 콜을 자제하고, 함수 스타일의 매크로를 많이 이용하곤 했다. 또한, 과거에는 컴파일을 하고도 그걸 도로 디스어셈블해서 코드를 손으로 최적화하는 삽질이 많았으나 대부분 옛날 얘기고, 요즘은 웬만한 함수 호출 부하따윈 씹어먹을 만큼 하드웨어가 발전했고, 정 부하가 될 만한 부분은 컴파일러가 자동으로 함수 호출 코드를 함수 내용으로 바꿔주는(인라이닝[21]) 등의 최적화 테크닉을 컴파일러가 자동으로 해주므로 함수를 멀리하고 매크로를 가까이 할 필요성은 사실상 사라졌다. 그러니깐 최적화한답시고 디스어셈블질하지 말고 병목이나 제거하자

재귀함수를 짤 경우 호출 스택의 용량에는 한계가 있기 때문에 그 용량을 초과해서 재귀 호출하면 스택 오버플로우가 발생할 수 있다. 단 일반 함수와 달리 함수를 후 값을 반환하는 대신 주어진 환경에서 메모리 주소를 점프하며 함수만 갈아끼우는 꼬리재귀 최적화[22](Tail-call optimization)가 지원되는 컴파일러는 재귀 스타일로 짜더라도 스택 오버플로우를 방지할 수 있다. 물론 꼬리재귀 최적화가 가능하게 짜 줘야 한다[23]. 현재 주요 컴파일러(GCC, clang/llvm, vc)에는 모두 포함되어 있는 기능이다. 안습하게도 Java에선 지원하지 않는다. 대신 다른 JVM기반 언어인 Scala나 Clojure에선 각각 꼬리재귀 최적화 가능하게 코딩하면 컴파일 시 루프로 변환하거나 명시적으로 재귀시켜 컴파일 시 루프로 변환시킬 수 있다.

11.3. 수학 함수와의 관계

수학에서의 함수와 프로그래밍에서의 함수는 대동소이해 보이지만 크게 다르다. 특정한 값을 입력하여 특정한 값을 출력하는 메커니즘 자체는 같지만, 프로그래밍에서의 함수는 내적으로 그 입력값을 어떻게 다루어 출력값을 내는지도 보는 반면, 수학에서의 함수는 순수하게 입력값과 출력값만을 본다. 전자를 Intensionality 라 하고, 후자를 Extensionality 라 하는데[24], 이로 인해 깊은 부분에서 큰 차이가 발생하는 경우가 많다.

둘째로 정의역과 공역이 모든 집합이 다 허용되는 수학 함수와는 달리 프로그래밍에서는 이산적인 집합만 허용된다.[25] 이는 알고리듬적인 집합(recursively enumerable set)만 다룰 수 있는 컴퓨터 자료 구조의 한계, 나아가서는 알고리듬의 수학적 모델 자체의 한계로 인해 발생한 것.

또한 수학 함수와는 달리 하나에 입력에 여러 가지 출력이 대응되어도 상관없다. 사이드 이펙트가 없이 같은 입력에 대해서 항상 같은 결과를 되돌려주는 함수를 참조 투명(Referentially Transparent, 명사형은 Referential Transparency)하다고 하며, 이런 함수를 '순수 함수'라고 한다. 반대로 사이드 이펙트가 있으며, 같은 입력에 대해서 다른 결과가 나올 수도 있는 함수를 참조 불투명(Referentially Opaque, 명사형은 Referential Opacity)하다고 한다. 난수가 참조 불투명한 함수의 가장 좋은 예이다.

여담이지만, 프로그래밍에서의 함수를 수학에서의 함수처럼 에뮬레이션하여(이 경우에도 Intensionality 와 알고리듬적인 자료구조만을 사용하는것은 동일하다. 사이드 이펙트만을 제한한 것.)와 프로그래밍 하는 순수 함수형 프로그래밍 언어 역시 존재한다.

대부분 전사나 단사를 따지지 않아도 되지만, 이걸 따져야 하는 경우도 있다. 튜링 테스트의 대표격인 CAPTCHA와, JPEG의 양자화(또는 계수화)에는 역함수가 존재하지 않기 때문에(단사가 아니기 때문에) 완벽하게 복원할 방법이 없으며, 이 때문에 아직 튜링 테스트를 통과한 기계가 없고, 앞으로도 당연히 없을 것이다. 비손실 압축과 양방향 암호 알고리즘은 해당 함수가 전단사여야만 유효하며,[26] 굳이 단사일 필요가 없는 단방향 암호 알고리즘마저도 단사가 아닌 경우(충돌)를 최소화해야 한다.

11.4. 호출 규약

상술한대로 함수를 호출할 때에는 함수의 인자(parameter)를 피호출자(callee)에게 전달할 필요가 있으며, 함수가 종료된 후에는 void(혹은 procedure)가 아닌 이상 리턴값을 받아올 방법이 있어야 한다. 컴파일러별로, 혹은 라이브러리를 만드는 회사별로 인자를 메모리에 적재하는 방식이 다르다면 일일히 맞추어 주거나 사용을 포기할 수밖에 없다. 이를 위해서 함수를 호출할 때 스택의 구조, 파라미터를 넘기는 방법, 리턴값을 전달하는 방법 등을 미리 통일해 두어야 한다. 이렇게 통일된 규칙을 호출 규약(Calling convention)이라 한다. 같은 운영체제라면 호출 규약이 통일되어 있다고 보아도 좋다. Python과 같은 언어에서 고속 처리를 위해 C 라이브러리를 불러서 사용할 수 있는 이유도 호출 규약대로 인자를 적재하고 call 명령을 내리면 바로 C로 작성된 함수가 호출되며 피호출자 안에서 호출자가 적재한 인자를 그대로 읽어올 수 있기 때문이다. 소스코드의 인터페이스가 아니라 이미 컴파일된 이진(Binary) 파일을 호출하는 인터페이스이기에 응용 프로그램 이진 인터페이스(Applicaiton Binary Interface = ABI)라고 부른다. 또한 스택 정리를 호출자가 하느냐 피호출자가 하는가, 함수 호출 전후로 보존되어야 하는 레지스터가 무엇무엇인가 등도 모두 호출 규약에 정의되어 있다. 스택 정리를 피호출자가 하면 X86에서는 retn(N)[27] 명령 하나로 스택 정리와 리턴을 동시에 수행할 수 있어서 조금 더 빠르고 편리하게 함수 호출에서 리턴할 수 있었다. 하지만 가변 인자(ex. printf, scanf 등.)를 사용할 수 없어서 C에서는 호출자가 리턴 후 스택을 정리해준다. 가변 인자를 사용하면 피호출자는 인자의 개수를 알 방법이 없기 때문이다.

예) X86 CPU의 호출 규약

아키텍처

호출 규약 이름

레지스터 매개변수

스택의 매개변수 순서

스택 정리 주체

비고

IA-32(32비트 X86)

cdecl

RTL

호출자

stdcall

RTL

피호출자

[28]

fastcall

ECX, EDX

RTL

피호출자

thiscall

ECX

RTL

피호출자

[29]

X86-64

Microsoft X64

RCX, RDX, R8, R9

RTL

호출자

[30]

System V

RDI, RSI, RDX, RCX, R8, R9

RTL

호출자

[31]

12. 관련 문서


  1. [1] 알파벳 f는 function(함수)의 첫글자에서 나왔다. 여러개의 함수를 나타낼 때에는 알파벳 나열하듯 f, g, h, \cdots등의 알파벳으로 함수를 나타낸다. 물론 a\left(x\right)라거나 a\left(b\right), x\left(f\right) 등등의 형태도 함수기 때문에 낚이지 않게 주의하자. 심지어 원주율에 쓰이는 [math(\pi)]나, 숫자인 1도 함수의 이름자로 쓰이면 각각 소수 계량 함수, 집합 판별 함수라는 완전히 다른 물건이 된다.
  2. [2] y가 유일하지 않을 경우 음함수가 되며, 엄밀히 말하면 함수가 아니다.
  3. [3] 읽기 편하라고 에프엑스라고 부르지만 영어권에서는 "function of x", 짧게는 "f of x"로 읽는다. 즉 x의 function이라는 말 그대로의 의미. fx로는 읽지 않는다. 이런 것 비슷한 것 중에 지수함수 읽는 법이 있는데, a^x 는 "a to the power of x", 줄여서 "a to the x" 라고 읽는다.
  4. [4] 데데킨트의 경우 영문 위키피디아에 따르면 장 디외도네(Jean Dieudonné)가 데데킨트의 1888년 논평인 'Was sind und was sollen die Zahlen?'의 한 구절을 확인한 부분이 있다. 사실 대부분의 경우 디리클레/로바체프스키가 함수의 정의 고안자로 인정받지만, 이들이 각각 1834, 1837년에 한 서술이 정확한 '정의'의 공식화인지 여부에 대해선 약간의 논란이 있다.
  5. [5] 즉 실함수를 집어넣어서 실함수가 나오는 (추상적) 함수이다. 작용소(operator)라 부르는 이 개념은 미분방정식이나 푸리에 해석을 공부할 때 등장한다.
  6. [6] 전사와 전사함수라는 표현은 현제 교육과정에서 정식으로 배우지는 않지만, 문제에는 나오니 기억해두자.
  7. [7] 그래서 정의역과 P가 같다고 해도 공역이 다르면 엄밀히 말하자면 다른 함수인 것이다.
  8. [8] 그래프가 주어졌을 때 함수가 아닌지 판단하는 방법은 정의역에 속하는 임의의 x 값에서 y 축에 평행한 수직선이 그래프와 만나는 점이 한 개인지 확인만 해주면 된다.
  9. [9] 아까 원의 방정식은 그래프를 보기만 해도 함수가 아닌 것을 알 수 있다.
  10. [10] '선형함수'란 표현은 보통 선형 변환을 위해 남겨놓는 편이다.
  11. [11] 보통 이때쯤 되면 출제되는 방정식 문제들의 실근의 절댓값이 10을 넘지 않는다는 등 요령만 잘 깨우치면 대입법으로도 3차 방정식을 어렵지 않게 풀 수 있다. 고등학교 1학년에서 출제되는 3차 방정식의 경우, 모든 항의 계수가 유리수이기 때문에, 적어도 한 개의 유리근이 나오므로 위 방법대로 1개의 근을 구하고, 나머지 두 근은 근의 공식으로 구하면 된다.
  12. [12] 이 역시 고등학교 1학년의 4차 방정식에도 적용 가능한 풀이법이며 이는 최소한 2개의 실근이 보장되며, 앞에서 말했듯이 모든 항의 계수가 유리수이고, 거기다가 극히 일부 문제를 제외한 모든 4차 방정식 문제가 난이도 조절 문제로 1로 고정되기 때문이다.
  13. [13] , 대신 ;를 쓰기도 한다.
  14. [14] \mathbb{R}^2\to\mathbb{C}:(a,b)\to a+bi
    \mathbb{C}\to\mathbb{R}^2:z\in\mathbb{C}, f(z)=(\Re(z),\Im(z))\text{(}\Re(z), \Im(z)\in \mathbb{R}\text{)}
  15. [15] 그래서 절댓값 함수의 도함수인 부호 함수는 [math(x=0)]만 외딴 섬마냥 따로 떨어져 있다.
  16. [16] 테일러급수는 수렴반경 밖에서는 발산하기는 하지만, 불연속점이 나오는 경우는 없다.
  17. [17] 참고: 영문 위키피디아
  18. [18] 범주론에서의 사상의 정의역과 공역은 굳이 집합일 필요가 없는 임의의 오브젝트가 되기 때문에, 집합론에서의 집합과 함수로는 표현이 불가능한 정말 많은 것들의 표현이 가능해진다. 너무 많아서 문제지
  19. [19] 물이 374°C, 22.1MPa인 경우 액체이면서 기체인 상태가 될 수 있다.
  20. [20] 보통은 코드가 여럿인 경우만 생각하지만, C언어의 매크로 함수나 인라인 함수, OOP의 접근자(accessor) 등의 경우 코드가 하나인 경우도 있다. 사실 실용성을 버린다면 void형으로 선언해서 안에 한 줄도 안 써놓아도 함수는 함수.
  21. [21] 언어에 따라 inline 키워드를 붙여 마음대로 인라인 할 수도 있다. 물론 재귀함수 같은 건 키워드 붙여도 안 된다.
  22. [22] "끝재귀 최적화"라고도 한다.
  23. [23] 함수 호출 후 아무것도 하지 않고 바로 그 값을 리턴할 때.
  24. [24] 집합론의 제일공리가 Extensionality 이다.
  25. [25] 이산확률분포의 확률질량함수를 떠올리면 된다.
  26. [26] 암호 알고리즘이 전단사가 아니라면 원하지 않는 개인키로 암호를 해독하는 등, 암호 체계 자체가 쓸모 없어진다.
  27. [27] 스택 포인터를 N 감소시키고 리턴한다
  28. [28] Windows에서 이 방식을 사용했으며 이 때문에 API로 프로그램을 작성할 때에는 int main(...)이 아닌 int PASCAL WinMain(...)으로 프로그램을 시작하였다
  29. [29] C++의 멤버 함수에서 사용하는 방법으로 this 포인터를 ECX 레지스터에 적재한 후 호출한다.
  30. [30] 마이크로소프트 Windows에서 사용하는 규약. 처음의 인자 네 개는 레지스터에, 그 이후 인자는 스택에 적재한다. C++에서 숨겨진 인자인 this 포인터는 첫번째 인자로 간주되어 RCX 레지스터로 넘어온다.
  31. [31] 리눅스, x86 솔라리스, BSD, OS X에서 사용하는 규약. 처음의 인자 여섯 개는 레지스터에, 그 이후 인자는 스택에 적재한다. C++에서 숨겨진 인자인 this 포인터는 명확한 규칙은 없으나 보통 RAX 레지스터로 넘어온다.

최종 확인 버전:

cc by-nc-sa 2.0 kr

Contents from Namu Wiki

Contact - 미러 (Namu)는 나무 위키의 표가 깨지는게 안타까워 만들어진 사이트입니다. (65.19ms)