1. 함수(Function)의 개념
1.1 함수의 정의
- 함수는 입력값(Input)에 일정 규칙(Rule)을 적용해 출력값(Output)을 결정하는 대응 관계이다.
- 보통 f(x)로 표현하며, x를 입력하면 f(x)를 출력한다는 뜻이다.
예시
만약 f(x)=2x라고 할 때, x=3이면 f(3)=6이 된다.
1.2 정의역, 공역, 치역
- 정의역(Domain): 함수에 들어갈 수 있는 입력값들의 집합.
- 공역(Codomain): 함수가 출력할 수 있는 값들의 전체 집합(가능한 범위).
- 치역(Range): 함수가 실제로 만들어내는 출력값들의 집합.
1.3 단사, 전사, 전단사 함수
- 단사(Injective): 다른 입력이면 항상 다른 출력.
- 즉, f(x1)=f(x2)이면 x1=x2.
- 예: f(x)=x2는 f(2)=f(−2)=4이므로 단사가 아님.
- 전사(Surjective): 공역의 모든 원소가 적어도 하나의 정의역 원소와 연결됨.
- 공역 = 치역인 경우를 말한다.
- 예: f(x)=x2에서 공역을 R로 잡으면 음수는 나오지 않으므로 전사가 아님.
- 전단사(Bijective): 단사이면서 전사인 함수.
- 전단사 함수에는 항상 역함수가 존재한다.
- 예: f(x)=x는 입력이 다르면 출력도 다르고, 공역=치역이므로 전단사 함수다.
1.4 역함수
- 역함수(f−1(x)): 원래 함수의 출력을 입력으로 받아, 원래의 입력을 반환하는 새로운 함수.
- f−1(f(x))=x.
- 전단사 함수가 아니면 역함수가 정의될 수 없다(단사 + 전사 조건 필요).
예시) f(x)=2x+3의 역함수를 구해보자.
1. y=2x+3
2. x=2y−3
3. f−1(x)=2x−3
2. 게임 개발에서의 함수 예시
게임에서 함수는 캐릭터의 체력 관리, 아이템 사용, NPC 상태 업데이트 등 입력과 출력을 명확히 설정하고, 그에 따라 동작이 결정되는 메서드 형태로 자주 구현된다.
#include <iostream>
#include <algorithm>
float ClampHealth(float health) {
return std::max(0.0f, health);
}
int main() {
float playerHealth = -10.0f;
playerHealth = ClampHealth(playerHealth);
std::cout << "Player Health: " << playerHealth << "\n";
return 0;
}
- 이 예시에서, 정의역은 ‘플레이어 체력으로 가질 수 있는 모든 실수’일 수 있지만, 실제 치역은 0 이상의 값으로 제한된다.
- 논리적 예측 범위(체력은 절대 음수가 되지 않아야 함)를 함수로 강제함으로써 의도된 게임 동작을 보장하도록 한다.
3. 선형성(Linearity)의 개념
3.1 수학적 선형성의 정의
함수 f(x)가 가산성(Additivity)과 1차 동차성(Homogeneity)을 모두 만족할 때 선형(Linear)이라고 한다.
-
가산성: 두 입력 x, y를 더해서 입력한 것에 대한 출력이 x, y 각각에 대한 출력을 합한 것과 동일한 경우
f(x+y)=f(x)+f(y)
-
1차 동차성: 어떤 함수의 입력을 a배 했을 때의 출력이 원래 입력의 출력을 a배한 것과 동일한 경우
f(a⋅x)=a⋅f(x)
3.2 선형함수 vs 일차함수
- 수학적 선형함수: 절편이 0인 형태, 예) f(x)=a⋅x.
- 예: f(x)=2x → f(0)=0 만족
- 일차함수(Affine Function): f(x)=a⋅x+b에서 b=0일 수 있어,
- 가산성과 1차 동차성을 동시에 만족하지 못해 “완전히” 선형이라 부르기 어렵다.
예시
- 선형함수 f(x)=2x는 f(x+y)=2(x+y)이며, 가산성과 1차 동차성을 충족한다.
- 일차함수 f(x)=2x+5는 f(x+y)=2(x+y)+5로 f(x)+f(y)=2x+5+2y+5=2(x+y)+10과 달라 선형성이 없다.
4. 선형 보간(Linear Interpolation, Lerp)
4.1 Lerp란?
- 선형 보간은 두 점 사이의 값을 일정 비율 t에 맞춰 계산해 부드럽게 이동 혹은 색상 변화 등을 표현하는 기법이다.
- 2차원 점 (x0,y0)과 (x1,y1) 사이를 보간하는 식:
x(t)=(1−t)x0+tx1,y(t)=(1−t)y0+ty1,0≤t≤1.
4.2 C++ 예시
#include <iostream>
struct Vector2 {
float x, y;
Vector2 LerpTo(const Vector2& target, float t) const {
return {
(1 - t) * x + t * target.x,
(1 - t) * y + t * target.y
};
}
void Print() const {
std::cout << "Position: (" << x << ", " << y << ")\n";
}
};
int main() {
Vector2 start = {0.0f, 0.0f};
Vector2 end = {10.0f, 5.0f};
for (float t = 0.0f; t <= 1.0f; t += 0.2f) {
Vector2 interpolated = start.LerpTo(end, t);
interpolated.Print();
}
return 0;
}
실행 결과:
Position: (0.0, 0.0)
Position: (2.0, 1.0)
Position: (4.0, 2.0)
Position: (6.0, 3.0)
Position: (8.0, 4.0)
Position: (10.0, 5.0)
- t가 0에서 1로 증가함에 따라, 시작점에서 끝점으로 차츰 이동한다.
4.3 선형 보간의 선형성
선형 보간 함수를 L(t,v0,v1)=(1−t)v0+tv1라 하면,
- 가산성:
L(t,v0+v0′,v1+v1′)=(1−t)(v0+v0′)+t(v1+v1′)=(1−t)v0+tv1+(1−t)v0′+tv1′. 이는 L(t,v0,v1)+L(t,v0′,v1′)의 형태로 정리 가능하다.
- 1차 동차성:
L(t,αv0,αv1)=(1−t)(αv0)+t(αv1)=α((1−t)v0+tv1)=αL(t,v0,v1).
- 따라서 벡터 보간에서의 Lerp 연산도 선형성의 성질을 가진다.