ํจ์
ํจ์¶
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์์ ๋ฐฐ์ด๊ณผ ๋ฌธ์์ด์ ๋ฐฐ์๋ด ์๋ค!