ํ•จ์ˆ˜

ํ•จ์ˆ˜

1. ํ•จ์ˆ˜๋ž€?

ํ•จ์ˆ˜๋Š” ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฝ”๋“œ ๋ธ”๋ก์ž…๋‹ˆ๋‹ค.

#include <iostream>

// ํ•จ์ˆ˜ ์ •์˜
void sayHello() {
    std::cout << "Hello!" << std::endl;
}

int main() {
    sayHello();  // ํ•จ์ˆ˜ ํ˜ธ์ถœ
    sayHello();
    return 0;
}

ํ•จ์ˆ˜์˜ ๊ตฌ์กฐ

๋ฐ˜ํ™˜ํƒ€์ž… ํ•จ์ˆ˜์ด๋ฆ„(๋งค๊ฐœ๋ณ€์ˆ˜) {
    // ํ•จ์ˆ˜ ๋ณธ๋ฌธ
    return ๊ฐ’;  // ๋ฐ˜ํ™˜๊ฐ’ (void๋ฉด ์ƒ๋žต ๊ฐ€๋Šฅ)
}

2. ํ•จ์ˆ˜ ์„ ์–ธ๊ณผ ์ •์˜

์„ ์–ธ (ํ”„๋กœํ† ํƒ€์ž…)

#include <iostream>

// ํ•จ์ˆ˜ ์„ ์–ธ (ํ”„๋กœํ† ํƒ€์ž…)
int add(int a, int b);

int main() {
    std::cout << add(3, 5) << std::endl;  // 8
    return 0;
}

// ํ•จ์ˆ˜ ์ •์˜
int add(int a, int b) {
    return a + b;
}

ํ—ค๋” ํŒŒ์ผ์— ์„ ์–ธ

// math_utils.h
#ifndef MATH_UTILS_H
#define MATH_UTILS_H

int add(int a, int b);
int multiply(int a, int b);

#endif
// math_utils.cpp
#include "math_utils.h"

int add(int a, int b) {
    return a + b;
}

int multiply(int a, int b) {
    return a * b;
}
// main.cpp
#include <iostream>
#include "math_utils.h"

int main() {
    std::cout << add(3, 5) << std::endl;
    std::cout << multiply(3, 5) << std::endl;
    return 0;
}

3. ๋งค๊ฐœ๋ณ€์ˆ˜ ์ „๋‹ฌ ๋ฐฉ์‹

๊ฐ’์— ์˜ํ•œ ์ „๋‹ฌ (Pass by Value)

#include <iostream>

void increment(int n) {  // n์€ ๋ณต์‚ฌ๋ณธ
    n++;
    std::cout << "ํ•จ์ˆ˜ ๋‚ด: " << n << std::endl;
}

int main() {
    int x = 10;
    increment(x);
    std::cout << "ํ•จ์ˆ˜ ํ›„: " << x << std::endl;  // 10 (๋ณ€๊ฒฝ ์•ˆ ๋จ)
    return 0;
}

์ฐธ์กฐ์— ์˜ํ•œ ์ „๋‹ฌ (Pass by Reference)

#include <iostream>

void increment(int& n) {  // n์€ ์›๋ณธ์˜ ์ฐธ์กฐ
    n++;
    std::cout << "ํ•จ์ˆ˜ ๋‚ด: " << n << std::endl;
}

int main() {
    int x = 10;
    increment(x);
    std::cout << "ํ•จ์ˆ˜ ํ›„: " << x << std::endl;  // 11 (๋ณ€๊ฒฝ๋จ)
    return 0;
}

ํฌ์ธํ„ฐ์— ์˜ํ•œ ์ „๋‹ฌ (Pass by Pointer)

#include <iostream>

void increment(int* n) {  // n์€ ์ฃผ์†Œ
    (*n)++;
    std::cout << "ํ•จ์ˆ˜ ๋‚ด: " << *n << std::endl;
}

int main() {
    int x = 10;
    increment(&x);  // ์ฃผ์†Œ ์ „๋‹ฌ
    std::cout << "ํ•จ์ˆ˜ ํ›„: " << x << std::endl;  // 11
    return 0;
}

const ์ฐธ์กฐ (์ฝ๊ธฐ ์ „์šฉ)

#include <iostream>
#include <string>

// ๋ณต์‚ฌ ์—†์ด ์ฝ๊ธฐ๋งŒ (ํšจ์œจ์ )
void printLength(const std::string& str) {
    std::cout << "๊ธธ์ด: " << str.length() << std::endl;
    // str[0] = 'x';  // ์—๋Ÿฌ! const์ด๋ฏ€๋กœ ์ˆ˜์ • ๋ถˆ๊ฐ€
}

int main() {
    std::string name = "Hello";
    printLength(name);
    return 0;
}

์–ธ์ œ ์–ด๋–ค ๋ฐฉ์‹์„ ์‚ฌ์šฉํ• ๊นŒ?

์ƒํ™ฉ ๊ถŒ์žฅ ๋ฐฉ์‹
์ž‘์€ ํƒ€์ž… (int, double) ์ฝ๊ธฐ ๊ฐ’ ์ „๋‹ฌ
ํฐ ํƒ€์ž… ์ฝ๊ธฐ const T&
์ˆ˜์ • ํ•„์š” T&
nullptr ํ—ˆ์šฉ ํ•„์š” T*

4. ๋ฐ˜ํ™˜๊ฐ’

๋‹จ์ผ ๊ฐ’ ๋ฐ˜ํ™˜

int square(int n) {
    return n * n;
}

์ฐธ์กฐ ๋ฐ˜ํ™˜ (์ฃผ์˜ ํ•„์š”)

#include <iostream>

int& getElement(int arr[], int index) {
    return arr[index];  // ๋ฐฐ์—ด ์š”์†Œ์˜ ์ฐธ์กฐ ๋ฐ˜ํ™˜
}

int main() {
    int arr[] = {1, 2, 3, 4, 5};

    getElement(arr, 2) = 100;  // arr[2] = 100
    std::cout << arr[2] << std::endl;  // 100

    return 0;
}

์—ฌ๋Ÿฌ ๊ฐ’ ๋ฐ˜ํ™˜ (C++17 ๊ตฌ์กฐ์  ๋ฐ”์ธ๋”ฉ)

#include <iostream>
#include <tuple>

std::tuple<int, int, int> getStats(int arr[], int size) {
    int sum = 0, min = arr[0], max = arr[0];
    for (int i = 0; i < size; i++) {
        sum += arr[i];
        if (arr[i] < min) min = arr[i];
        if (arr[i] > max) max = arr[i];
    }
    return {sum, min, max};
}

int main() {
    int arr[] = {5, 2, 8, 1, 9};

    // C++17 ๊ตฌ์กฐ์  ๋ฐ”์ธ๋”ฉ
    auto [sum, min, max] = getStats(arr, 5);
    std::cout << "ํ•ฉ: " << sum << ", ์ตœ์†Œ: " << min << ", ์ตœ๋Œ€: " << max << std::endl;

    return 0;
}

5. ๊ธฐ๋ณธ ๋งค๊ฐœ๋ณ€์ˆ˜ (Default Parameters)

#include <iostream>

void greet(std::string name = "Guest", int times = 1) {
    for (int i = 0; i < times; i++) {
        std::cout << "Hello, " << name << "!" << std::endl;
    }
}

int main() {
    greet();                // Hello, Guest!
    greet("Alice");         // Hello, Alice!
    greet("Bob", 3);        // Hello, Bob! (3๋ฒˆ)
    return 0;
}

๊ทœ์น™

// ๊ธฐ๋ณธ๊ฐ’์€ ์˜ค๋ฅธ์ชฝ๋ถ€ํ„ฐ
void func(int a, int b = 10, int c = 20);  // OK
// void func(int a = 5, int b, int c = 20);  // ์—๋Ÿฌ!

// ์„ ์–ธ๊ณผ ์ •์˜ ์ค‘ ํ•œ ๊ณณ์—๋งŒ
void func(int a, int b = 10);  // ์„ ์–ธ์— ๊ธฐ๋ณธ๊ฐ’
void func(int a, int b) { }    // ์ •์˜์—๋Š” ๊ธฐ๋ณธ๊ฐ’ ์—†์Œ

6. ํ•จ์ˆ˜ ์˜ค๋ฒ„๋กœ๋”ฉ (Function Overloading)

๊ฐ™์€ ์ด๋ฆ„, ๋‹ค๋ฅธ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง„ ์—ฌ๋Ÿฌ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

#include <iostream>

// ์ •์ˆ˜ ๋ง์…ˆ
int add(int a, int b) {
    return a + b;
}

// ์‹ค์ˆ˜ ๋ง์…ˆ
double add(double a, double b) {
    return a + b;
}

// ์„ธ ๊ฐœ ๋ง์…ˆ
int add(int a, int b, int c) {
    return a + b + c;
}

int main() {
    std::cout << add(3, 5) << std::endl;        // int ๋ฒ„์ „: 8
    std::cout << add(3.5, 2.5) << std::endl;    // double ๋ฒ„์ „: 6.0
    std::cout << add(1, 2, 3) << std::endl;     // ์„ธ ๊ฐœ ๋ฒ„์ „: 6
    return 0;
}

์˜ค๋ฒ„๋กœ๋”ฉ ๊ทœ์น™

// ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž…์ด ๋‹ค๋ฅด๋ฉด OK
void print(int n);
void print(double n);
void print(std::string s);

// ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐœ์ˆ˜๊ฐ€ ๋‹ค๋ฅด๋ฉด OK
void print(int a);
void print(int a, int b);

// ๋ฐ˜ํ™˜ ํƒ€์ž…๋งŒ ๋‹ค๋ฅด๋ฉด ์˜ค๋ฒ„๋กœ๋”ฉ ๋ถˆ๊ฐ€!
// int func(int a);
// double func(int a);  // ์—๋Ÿฌ!

7. inline ํ•จ์ˆ˜

์งง์€ ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค.

#include <iostream>

inline int square(int n) {
    return n * n;
}

int main() {
    std::cout << square(5) << std::endl;  // ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ 25๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Œ
    return 0;
}

์‚ฌ์šฉ ์‹œ์ 

  • ํ•จ์ˆ˜ ๋ณธ๋ฌธ์ด ์งง์„ ๋•Œ (1~2์ค„)
  • ์ž์ฃผ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜
  • ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ตœ์ข… ๊ฒฐ์ • (inline์€ ํžŒํŠธ)

8. ์žฌ๊ท€ ํ•จ์ˆ˜ (Recursive Function)

์ž๊ธฐ ์ž์‹ ์„ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

ํŒฉํ† ๋ฆฌ์–ผ

#include <iostream>

int factorial(int n) {
    if (n <= 1) return 1;       // ๊ธฐ์ € ์กฐ๊ฑด
    return n * factorial(n - 1); // ์žฌ๊ท€ ํ˜ธ์ถœ
}

int main() {
    std::cout << "5! = " << factorial(5) << std::endl;  // 120
    return 0;
}

ํ”ผ๋ณด๋‚˜์น˜

#include <iostream>

int fibonacci(int n) {
    if (n <= 1) return n;
    return fibonacci(n - 1) + fibonacci(n - 2);
}

int main() {
    for (int i = 0; i < 10; i++) {
        std::cout << fibonacci(i) << " ";
    }
    std::cout << std::endl;  // 0 1 1 2 3 5 8 13 21 34
    return 0;
}

์žฌ๊ท€ vs ๋ฐ˜๋ณต

// ๋ฐ˜๋ณต ๋ฒ„์ „ (ํšจ์œจ์ )
int factorialLoop(int n) {
    int result = 1;
    for (int i = 2; i <= n; i++) {
        result *= i;
    }
    return result;
}

9. ํ•จ์ˆ˜ ํฌ์ธํ„ฐ

ํ•จ์ˆ˜๋ฅผ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ์ €์žฅํ•˜๊ณ  ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

#include <iostream>

int add(int a, int b) { return a + b; }
int subtract(int a, int b) { return a - b; }
int multiply(int a, int b) { return a * b; }

int main() {
    // ํ•จ์ˆ˜ ํฌ์ธํ„ฐ ์„ ์–ธ
    int (*operation)(int, int);

    operation = add;
    std::cout << "Add: " << operation(5, 3) << std::endl;  // 8

    operation = subtract;
    std::cout << "Subtract: " << operation(5, 3) << std::endl;  // 2

    operation = multiply;
    std::cout << "Multiply: " << operation(5, 3) << std::endl;  // 15

    return 0;
}

์ฝœ๋ฐฑ ํ•จ์ˆ˜

#include <iostream>

void processArray(int arr[], int size, int (*func)(int)) {
    for (int i = 0; i < size; i++) {
        arr[i] = func(arr[i]);
    }
}

int doubleIt(int n) { return n * 2; }
int squareIt(int n) { return n * n; }

int main() {
    int arr[] = {1, 2, 3, 4, 5};

    processArray(arr, 5, doubleIt);
    for (int n : arr) std::cout << n << " ";  // 2 4 6 8 10
    std::cout << std::endl;

    processArray(arr, 5, squareIt);
    for (int n : arr) std::cout << n << " ";  // 4 16 36 64 100
    std::cout << std::endl;

    return 0;
}

10. ๋žŒ๋‹ค ํ‘œํ˜„์‹ (Lambda) - ๋ฏธ๋ฆฌ๋ณด๊ธฐ

C++11๋ถ€ํ„ฐ ์ต๋ช… ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

#include <iostream>

int main() {
    // ๊ธฐ๋ณธ ๋žŒ๋‹ค
    auto add = [](int a, int b) {
        return a + b;
    };

    std::cout << add(3, 5) << std::endl;  // 8

    // ์บก์ฒ˜
    int multiplier = 10;
    auto multiply = [multiplier](int n) {
        return n * multiplier;
    };

    std::cout << multiply(5) << std::endl;  // 50

    return 0;
}

11. main ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜

#include <iostream>

int main(int argc, char* argv[]) {
    std::cout << "์ธ์ž ๊ฐœ์ˆ˜: " << argc << std::endl;

    for (int i = 0; i < argc; i++) {
        std::cout << "argv[" << i << "]: " << argv[i] << std::endl;
    }

    return 0;
}

์‹คํ–‰:

./program hello world

์ถœ๋ ฅ:

์ธ์ž ๊ฐœ์ˆ˜: 3
argv[0]: ./program
argv[1]: hello
argv[2]: world

12. ์‹ค์Šต ์˜ˆ์ œ

์ตœ๋Œ€๊ณต์•ฝ์ˆ˜ (์œ ํด๋ฆฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜)

#include <iostream>

int gcd(int a, int b) {
    if (b == 0) return a;
    return gcd(b, a % b);
}

int main() {
    std::cout << "gcd(48, 18) = " << gcd(48, 18) << std::endl;  // 6
    std::cout << "gcd(56, 98) = " << gcd(56, 98) << std::endl;  // 14
    return 0;
}

๋‘ ๊ฐ’ ๊ตํ™˜

#include <iostream>

void swap(int& a, int& b) {
    int temp = a;
    a = b;
    b = temp;
}

int main() {
    int x = 5, y = 10;
    std::cout << "์ „: x=" << x << ", y=" << y << std::endl;

    swap(x, y);
    std::cout << "ํ›„: x=" << x << ", y=" << y << std::endl;

    return 0;
}

13. ์š”์•ฝ

๊ฐœ๋… ์„ค๋ช…
ํ•จ์ˆ˜ ์„ ์–ธ ํ•จ์ˆ˜์˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜ (ํ”„๋กœํ† ํƒ€์ž…)
ํ•จ์ˆ˜ ์ •์˜ ํ•จ์ˆ˜์˜ ๋ณธ๋ฌธ
๊ฐ’ ์ „๋‹ฌ ๋ณต์‚ฌ๋ณธ ์ „๋‹ฌ, ์›๋ณธ ๋ณ€๊ฒฝ ์•ˆ ๋จ
์ฐธ์กฐ ์ „๋‹ฌ ์›๋ณธ ์ „๋‹ฌ, ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ
const ์ฐธ์กฐ ์ฝ๊ธฐ ์ „์šฉ ์›๋ณธ ์ „๋‹ฌ
๊ธฐ๋ณธ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ƒ๋žต ๊ฐ€๋Šฅํ•œ ์ธ์ž
์˜ค๋ฒ„๋กœ๋”ฉ ๊ฐ™์€ ์ด๋ฆ„, ๋‹ค๋ฅธ ๋งค๊ฐœ๋ณ€์ˆ˜
inline ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋Œ€์‹  ์ฝ”๋“œ ์‚ฝ์ž…
์žฌ๊ท€ ์ž๊ธฐ ์ž์‹  ํ˜ธ์ถœ

๋‹ค์Œ ๋‹จ๊ณ„

05_Arrays_and_Strings.md์—์„œ ๋ฐฐ์—ด๊ณผ ๋ฌธ์ž์—ด์„ ๋ฐฐ์›Œ๋ด…์‹œ๋‹ค!

to navigate between lessons