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 키워드를 사용하여 값 반환
매개변수 함수로 데이터를 전달
값 전달 매개변수 값을 복사하여 사용 (원본 영향 없음)
참조 전달 변수의 참조(주소)를 사용 (원본 값 변경 가능)