C++ 초급 - 4. 함수와 변수의 범위 (Functions and Variable Scope) (1 - 함수 선언과 정의 (Function Declaration & Definition))
2025. 2. 12. 17:00ㆍ프로그래밍 언어/C++
📌 4. 함수와 변수의 범위 (Functions and Variable Scope)
C++에서 함수(Function)는 특정 작업을 수행하는 코드 블록이며,
변수의 범위(Variable Scope)는 변수가 접근 가능한 영역을 의미한다.
이 단원에서는 C++에서 함수와 변수의 범위를 다루며,
함수의 다양한 특성과 효율적인 코드 작성 방법을 설명한다.
📌 4.1 함수 선언과 정의 (Function Declaration & Definition)
C++에서 함수(Function)는 특정 작업을 수행하는 코드 블록이다.
함수를 사용하면 코드의 중복을 줄이고 유지보수를 용이하게 만들며, 모듈화된 구조를 구현할 수 있다.
C++에서는 함수를 선언(Declaration)하고, 정의(Definition)한 후, 호출(Calling)하여 사용할 수 있다.
🔹 함수 선언과 정의
(1) 함수 선언 (Function Declaration)
- 함수의 이름, 반환 타입, 매개변수를 지정하지만, 본문(Body)이 없음.
- 컴파일러에게 해당 함수가 존재함을 미리 알리는 역할을 한다.
- 선언만으로는 실행되지 않으며, 반드시 함수 정의가 필요함.
- 함수 원형(Function Prototype)이라고도 한다.
반환타입 함수이름(매개변수 목록);
💡 예제: 함수 선언
int add(int a, int b); // 함수 선언 (프로토타입)
(2) 함수 정의 (Function Definition)
- 함수의 실제 실행 내용을 포함한 코드 블록을 제공.
- 선언된 함수가 어떤 동작을 하는지 구현.
- 반환값이 있으면 return을 사용하여 반환.
반환타입 함수이름(매개변수 목록) {
// 실행할 코드
return 값; // (반환타입이 void라면 생략 가능)
}
💡 예제: 함수 정의
int add(int a, int b) {
return a + b; // 두 값을 더한 결과 반환
}
(3) 함수 호출 (Function Call)
- 정의된 함수를 실행하려면 호출(Call)해야 한다.
- 함수 이름과 매개변수를 사용하여 실행 가능.
int result = add(3, 5); // 함수 호출
💡 예제: 함수 선언, 정의, 호출
#include <iostream>
// 함수 선언 (프로토타입)
int add(int a, int b);
int main() {
int sum = add(3, 7); // 함수 호출
std::cout << "합: " << sum << std::endl;
return 0;
}
// 함수 정의
int add(int a, int b) {
return a + b;
}
🔹 출력 결과
합: 10
💡 설명
- int add(int a, int b); → 함수 선언
- int add(int a, int b) { return a + b; } → 함수 정의
- add(3, 7); → 함수 호출
📌 반환 값(Return)과 매개변수(Arguments)
(1) 반환 값 (Return Value)
- 함수는 연산 결과를 반환값(return value)을 통해 전달할 수 있다.
- 반환 타입이 void인 경우 반환할 값이 없음.
💡 예제: 반환 값이 있는 함수
#include <iostream>
int multiply(int x, int y) {
return x * y; // 곱셈 결과 반환
}
int main() {
int result = multiply(4, 5);
std::cout << "결과: " << result << std::endl;
return 0;
}
🔹 출력 결과
결과: 20
💡 예제: void 함수 (반환 값 없음)
#include <iostream>
void greet() {
std::cout << "안녕하세요!" << std::endl;
}
int main() {
greet(); // 함수 호출
return 0;
}
🔹 출력 결과
안녕하세요!
(2) 매개변수 (Arguments)
- 함수는 매개변수(Parameters)를 통해 데이터를 전달받을 수 있다.
- 매개변수의 개수와 타입을 함수 선언과 정의에서 동일하게 맞춰야 한다.
💡 예제: 매개변수를 활용한 함수
#include <iostream>
void introduce(std::string name, int age) {
std::cout << "이름: " << name << ", 나이: " << age << std::endl;
}
int main() {
introduce("홍길동", 25);
return 0;
}
🔹 출력 결과
이름: 홍길동, 나이: 25
📌 값 전달(Call by Value) vs 참조 전달(Call by Reference)
(1) 값 전달 (Call by Value)
- 기본적으로 C++의 함수는 값 전달(Call by Value)을 사용함.
- 매개변수의 값을 복사하여 전달하기 때문에, 함수 내에서 값을 변경해도 원본 변수에 영향을 주지 않음.
💡 예제: 값 전달(Call by Value)
#include <iostream>
void modify(int num) {
num = 100; // 함수 내부에서만 변경됨
}
int main() {
int value = 10;
modify(value);
std::cout << "value: " << value << std::endl; // 원래 값 유지됨
return 0;
}
🔹 출력 결과
value: 10
(2) 참조 전달 (Call by Reference)
- 변수의 메모리 주소를 전달하여 함수 내부에서 직접 수정 가능.
- & 연산자를 사용하여 원본 값을 직접 변경할 수 있음.
💡 예제: 참조 전달(Call by Reference)
#include <iostream>
void modify(int &num) {
num = 100; // 원본 변수의 값이 변경됨
}
int main() {
int value = 10;
modify(value);
std::cout << "value: " << value << std::endl; // 변경된 값 출력
return 0;
}
🔹 출력 결과
value: 100
💡 값 전달 vs 참조 전달 차이점
방식 | 설명 | 메모리 사용 | 원본 변경 |
값 전달 (Call by Value) | 값이 복사됨 | 새 메모리 공간 할당 | X |
참조 전달 (Call by Reference) | 원본 값 사용 | 기존 메모리 사용 | O |
📌 함수 프로토타입(Function Prototype) 사용법
- 함수 선언을 먼저 작성하고, 이후에 정의하는 방식을 사용하면 편리함.
- 특히, 메인 함수보다 아래에 함수를 정의할 때 필요.
💡 예제: 함수 프로토타입
#include <iostream>
// 함수 선언 (프로토타입)
int square(int n);
int main() {
int num = 5;
std::cout << "제곱: " << square(num) << std::endl;
return 0;
}
// 함수 정의
int square(int n) {
return n * n;
}
🔹 출력 결과
제곱: 25
💡 함수 프로토타입을 사용하면 코드의 가독성이 향상되고, 함수 호출 순서를 유연하게 구성할 수 있다.
📌 정리
개념 | 설명 |
함수 선언 | 함수의 프로토타입을 제공 (본문 없음) |
함수 정의 | 함수의 동작을 구현 |
함수 호출 | 정의된 함수를 실행 |
반환 값 | return 키워드를 사용하여 값 반환 |
매개변수 | 함수로 데이터를 전달 |
값 전달 | 매개변수 값을 복사하여 사용 (원본 영향 없음) |
참조 전달 | 변수의 참조(주소)를 사용 (원본 값 변경 가능) |