| 구분 | 수학 | 프로그래밍 |
|---|---|---|
| 입력/출력 | 필수 (x → y) | 있어도 되고 없어도 됨 |
| 동일 입력 | 항상 동일 출력 | 동일 출력 보장 없음 (예: rand) |
| 용도 | 연산·그래프 | 코드 모음, 기능 재사용 |
리턴타입 함수이름(매개변수1, 매개변수2, ...) {
// 구현부
}
| 요소 | 설명 |
|---|---|
| 리턴타입 | 반환값 자료형. 없으면 void (비어두는 게 아님) |
| 함수이름 | 변수와 동일한 명명 규칙. 프로젝트 스타일에 따라 PascalCase/camelCase 등 사용 |
| 매개변수 | 입력 없으면 () 비움 |
| 구현부 | {} 안에 실제 동작 코드 |
void TestFunction(int a, float b)
{
cout << "Test " << a << endl;
}
void: 반환값이 없음을 의미.(int a, float b): 매개변수. 변수 선언처럼 타입+이름이지만 세미콜론 없음.int hp = 100;
TestFunction(hp, 3.14f); // hp 값(100)과 3.14f가 a, b로 복사되어 전달
함수 호출은 “점프”에 가깝습니다.
main()
├─ Foo() 호출 ──────┐
│ │ (Foo 실행)
└─ Foo() return ◄──┘ → main()의 '다음 줄'로 복귀
F11로 들어가면: 함수 진입 → 실행 완료 → 호출한 다음 줄로 복귀하는 것을 확인 가능.return 값; 필요.int Add(int a, int b) {
return a + b;
}
int ClampHp(int hp, int maxHp) {
if (hp < 0) return 0; // early return
if (hp > maxHp) return maxHp;
return hp;
}
break와 return의 차이도 같이 잡아둡니다.
break: 가장 가까운 반복문/switch만 탈출return: 함수 전체를 즉시 종료(반환)int FindFirstPositive(const int* arr, int n) {
for (int i = 0; i < n; i++) {
if (arr[i] > 0) return i; // 루프 + 함수 동시에 종료
}
return -1;
}
| 구분 | 선언 (Declaration) | 정의 (Definition) |
|---|---|---|
| 역할 | "이런 함수가 나중에 나온다"고 알림 | 실제 구현 |
| 형태 | 시그니처만 (세미콜론) | {} 안에 구현부 |
| 위치 | 보통 .h 또는 상단 | .cpp 또는 하단 |
.h, 정의는 .cpp.int Add(int a, int b); // 선언
int main() {
Add(10, 20); // 호출
}
int Add(int a, int b) { // 정의
cout << a + b << endl;
return a + b;
}
main()에서 Add 호출 시 컴파일러가 "Add가 뭔지 모르겠다"고 에러.void Test(int a) { cout << "하나만 받음" << endl; }
void Test(int a, int b) { cout << "두 개 받음" << endl; }Test(1); → 첫 번째, Test(1, 2); → 두 번째void Test(int a) { cout << "int 버전" << endl; }
void Test(float a) { cout << "float 버전" << endl; }Test(10); → int 버전, Test(10.0f); → float 버전메모리 관점에서 “어디에 저장되고 언제까지 살아있는지”가 다릅니다.
[Data 영역] : 전역/정적 변수 (프로그램 끝날 때까지 유지)
[Stack 영역] : 지역 변수/매개변수 (함수 끝나면 사라짐)
| 구분 | 전역 변수 | 지역 변수 |
|---|---|---|
| 선언 위치 | 함수 밖 | 함수 안 |
| 유효 범위 | 프로그램 전체 | 해당 함수(또는 블록) 내 |
| 메모리 영역 | Data 영역 | Stack 영역 |
| 생명 주기 | 프로그램 종료까지 | 함수 종료 시 소멸 |
int globalVar = 100;
void TestFunction() {
int localVar = 10;
globalVar += 10;
cout << "지역: " << localVar << ", 전역: " << globalVar << endl;
}
localVar: TestFunction() 내에서만 유효. 함수 종료 시 소멸.globalVar: 프로그램 전체에서 사용 가능. 값 유지.{} 블록 안에서 선언한 변수는 그 블록 안에서만 유효.{
int hp = 10;
// hp 사용
}
{
int hp = 20; // 다른 블록이므로 OK
}중첩 블록에서는 “바깥 이름을 가리는(shadowing)” 것도 가능합니다(추천하진 않음).
int hp = 100;
{
int hp = 10; // 바깥 hp를 가림
cout << hp; // 10
}
cout << hp; // 100
호출 흐름을 스택 관점에서 보면 이런 느낌입니다.
main()
-> A()
-> B()
<- B() 종료
<- A() 종료
break와 return의 차이를 한 문장으로 설명할 수 있을까?