
※ 본 포스팅은 유튜브 C++ Full Course 강의를 기반으로 제가 직접 정리한 C++ 기본 문법에 대한 글입니다.
서론을 잠깐 말하자면, C++에 대해 배운 것을 까먹지 않기 위해 블로그에 정리하는 것입니다. 기본적으로 다른 프로그래밍 언어를 다룬 적이 있기 때문에 강의 영상을 보고 제가 제 마음대로 빼거나 추가하면서 정리할 예정입니다. 최대한 틀린 부분이 있지 않게 적겠지만 혹시 잘못된 부분이 있으면 알려주세요!
< 20. User Defined Functions>
function = a block of reusable code
void happyBirthday(std::string name, int age);
int main(){
std::string name = "Chaewon";
int age = 25;
happyBirthday(name, age);
return 0;
}
void happyBirthday(std::string name, int age){
std::cout << "Happy Birthday to " << name << '\n';
std::cout << "Happy Birthday to " << name << '\n';
std::cout << "Happy Birthday dear " << name << '\n';
std::cout << "Happy Birthday to " << name << '\n';
std::cout << "You are " << age << " years old!\n";
}
함수는 블록을 만들어서 여러 번 다시 사용할 수 있다. 함수의 이름을 지을 때는 어떤 걸 수행하는지 명확하게 알 수 있도록 만들어야 한다.
일반적으로 가독성을 좋게 하기 위해, 함수를 선언하고 정의할 때 main function 이후에 함수들을 정의한다. 하지만 프로그래밍 언어는 Top-Down으로 읽기 때문에 main function에서 함수를 못찾는다.
그렇기에 main function 이전에 함수를 선언하고 main function 이후에 함수를 정의하는 방식이 주로 사용된다.
함수를 선언할 때는 return 값의 유무, parameter의 유무에 따라 차이가 있다.
함수의 반환 타입은 함수가 호출된 후 반환하는 값의 데이터 타입을 나타낸다. 반환 타입은 함수의 정의할 때 쓰인다.
- 반환타입이 `void`인 경우: 함수가 반환하는 값이 없음을 의미한다. 위 코드도 반환값이 없는 함수이다.
- 반환타입이 `void`가 아닌 경우 : 반드시 `return`문을 사용하여 해당 타입의 값을 반환해야 한다. `return`문은 함수 실행을 중단하고 값을 반환하는 역할을 한다. 또한 반환된 값은 함수 호출문을 통해 변수에 대입될 수 있다.
#include <iostream>
// 두 수를 곱한 결과를 반환하는 함수 정의 (반환 타입: int)
int multiply(int a, int b) {
int result = a * b;
return result;
}
int main() {
int x = 5;
int y = 3;
// 반환 타입이 void가 아닌 함수 호출 후 반환값을 변수에 저장
int z = multiply(x, y);
std::cout << "두 수의 곱: " << z << std::endl;
return 0;
}
위 코드는 반환값이 int 인 multiply 함수이다. 해당 코드에서는 함수 선언과 정의를 main함수 전에 했지만 여러 함수들이 복잡하게 있을 경우 main 전 후로 나누는 것이 가독성을 위해 좋다.
함수의 인자(argument)와 매개변수(parameter)는 함수 정의와 함수 호출의 관점에서 구별된다.
parameter은 함수의 선언 또는 정의 부분에 포함되며, 함수 내부에서 작업을 수행한다.
argument는 함수에 전달되는 실제 값이다. 함수를 호출할 때 함수에 필요한 인자값을 전달하여 해당 함수를 실행하게 된다. 이때, 전달된 인자 값은 함수 내의 매개변수에 복사된다.
#include <iostream>
// 두 개의 정수를 더하는 함수 정의
int sum(int a, int b) {
int result = a + b;
return result;
}
int main() {
int x = 3;
int y = 4;
// 함수 호출 시 인자로 x와 y를 전달
int z = sum(x, y);
std::cout << "두 수의 합: " << z << std::endl;
return 0;
}
위의 예시 코드를 보면 `a`와 `b`는 매개변수로 사용되었으며, 함수 호출 시 `x`와 `y`가 인자로 전달되었음을 알 수 있다.
< 21. return keyword>
return = return a value back to the spot where you called the encompassing function
double square(double length);
double cube(double length);
int main()
{
double length = 6.0;
double area = square(length);
double volume = cube(length);
std::cout << "Area: " << area << "cm^2\n";
std::cout << "Volume: " << volume << "cm^3\n";
return 0;
}
double square(double length){
return length * length;
}
double cube(double length){
return length * length * length;
}
위의 예제코드를 보면 `square`함수와 `cube`함수를 main 위에 선언 후 main 아래에 정의한 것을 볼 수 있다.
해당 예제는 void, 반환값이 없는 타입이 아닌 double 타입의 return값이 있는 함수 예제임을 알 수 있다.
이처럼 함수는 return값의 유무와 parameter의 유무에 따라 차이를 보인다
< 22. Overloaded Functions >
Overloaded Functions : functions can share the same name, but you need a different set of parameters.
#include <iostream>
void bakePizza();
void bakePizza(std::string topping1);
void bakePizza(std::string topping1, std::string topping2);
int main()
{
bakePizza("pepperoni", "mushroom");
return 0;
}
void bakePizza(){
std::cout << "Here is your pizza!\n";
}
void bakePizza(std::string topping1){
std::cout << "Here is your " << topping1 << " pizza!\n";
}
void bakePizza(std::string topping1, std::string topping2){
std::cout << "Here is your " << topping1 << " and " << topping2 << " pizza!\n";
}
위의 코드 예시를 보면 세 개의 함수명이 동일함을 알 수 있다. 변수는 중복된 이름을 사용할 수 없지만 함수는 함수명이 동일하고 매개변수를 달리 하는 것이 허용된다. 이를 오버로딩(overloading)이라고 한다.
하지만 함수명도 똑같고 매개변수도 같은 것은 중복될 수 없다. 함수명+매개변수 이 세트는 함수의 고유한 시그니처라고 볼 수 있다.
이렇게 오버로딩을 사용하는 이유는 코드의 가독성과 재사용성을 향상시킬 수 있기 때문이다. 유사한 작업을 하는 함수들을 한 곳에 모아 관리 가능하다는 장점이 있다.
< 23. Variable Scope>
Local variables : declared inside a function or block {}
Global variables : declared outside of all functions
#include <iostream>
int myNum = 3; // Global variable
void printNum();
int main()
{
int myNum = 1; // Local variable
printNum();
return 0;
}
void printNum(){
int myNum = 2; // Local variable
std::cout << myNum;
}
변수 범위는 변수가 유효한 범위를 의미한다. C++에서는 지역변수와 전역변수로 나눌 수 있다.
위의 코드 예시를 보자 우선 맨 처음 `int myNum = 3`은 전역변수에 해당한다. 전역변수는 가능하면 사용하지 않는 게 좋은데 전역 namespace를 오염시키기 때문이다. 가능하면 변수들을 함수블록 내에서 선언하는 것이 안전하다.
해당 예제코드에서 main 함수에 myNum이 있고 printNum 함수에 myNum이 있는데 결과적으로 해당 코드를 실행하면 2가 출력된다. main 함수에서 printNum() 함수를 실행했지만 1인 myNum은 main의 지역변수이므로 printNum은 알 수 없다. 그렇기에 printNum에서 선언된 myNum의 값인 2가 출력되게 된다.
전역변수와 지역변수가 같이 있는 경우 우선 지역변수가 우선시된다.
만약 전역 변수를 쓰고 싶다면 ::(scope resolution operator)를 붙여야 한다.
std::cout << ::myNum;
위와 같은 코드를 실행하면 전역변수인 myNum을 출력할 수 있다.
강의는 Bro Code라는 유튜버의 총 6시간 분량의 강의입니다. 영상에서 나눠져 있는 챕터 제목을 기준으로 작성할 예정입니다. 다만 영어강의라는 점이 좀 걸리는데..한국어 강의를 찾다가 컴팩트 하면서 제가 지루하지 않고 잘 배울 수 있는 영상을 못 찾아서 영어강의를 듣게 되었습니다. 혹시 이 블로그를 보시고 들을 생각을 가진 분이 계시다면 영어자막도 있고 어색하지만 자동번역되는 한글자막도 있으니 너무 겁먹지 마시고 들어보길 바랍니다:)
해당 강의 영상은 아래에 걸어두겠습니다. 혹시 틀린 부분이나 추가해주고 싶은 부분이 있으면 알려주세요.
<이전글>
2023.05.02 - [TIL/C++] - [C++ 기본문법] 3. 삼항연산자(ternary operator)부터 반복문(while, for)까지
2023.03.26 - [TIL/C++] - [C++ 기본문법] #2 산술 연산자(arithmetic operator)부터 조건문(if, switch)까지
2023.03.21 - [TIL/C++] - [C++ 기본문법] #1 HelloWorld부터 Typedef까지

※ 본 포스팅은 유튜브 C++ Full Course 강의를 기반으로 제가 직접 정리한 C++ 기본 문법에 대한 글입니다.
서론을 잠깐 말하자면, C++에 대해 배운 것을 까먹지 않기 위해 블로그에 정리하는 것입니다. 기본적으로 다른 프로그래밍 언어를 다룬 적이 있기 때문에 강의 영상을 보고 제가 제 마음대로 빼거나 추가하면서 정리할 예정입니다. 최대한 틀린 부분이 있지 않게 적겠지만 혹시 잘못된 부분이 있으면 알려주세요!
< 20. User Defined Functions>
function = a block of reusable code
void happyBirthday(std::string name, int age); int main(){ std::string name = "Chaewon"; int age = 25; happyBirthday(name, age); return 0; } void happyBirthday(std::string name, int age){ std::cout << "Happy Birthday to " << name << '\n'; std::cout << "Happy Birthday to " << name << '\n'; std::cout << "Happy Birthday dear " << name << '\n'; std::cout << "Happy Birthday to " << name << '\n'; std::cout << "You are " << age << " years old!\n"; }
함수는 블록을 만들어서 여러 번 다시 사용할 수 있다. 함수의 이름을 지을 때는 어떤 걸 수행하는지 명확하게 알 수 있도록 만들어야 한다.
일반적으로 가독성을 좋게 하기 위해, 함수를 선언하고 정의할 때 main function 이후에 함수들을 정의한다. 하지만 프로그래밍 언어는 Top-Down으로 읽기 때문에 main function에서 함수를 못찾는다.
그렇기에 main function 이전에 함수를 선언하고 main function 이후에 함수를 정의하는 방식이 주로 사용된다.
함수를 선언할 때는 return 값의 유무, parameter의 유무에 따라 차이가 있다.
함수의 반환 타입은 함수가 호출된 후 반환하는 값의 데이터 타입을 나타낸다. 반환 타입은 함수의 정의할 때 쓰인다.
- 반환타입이 `void`인 경우: 함수가 반환하는 값이 없음을 의미한다. 위 코드도 반환값이 없는 함수이다.
- 반환타입이 `void`가 아닌 경우 : 반드시 `return`문을 사용하여 해당 타입의 값을 반환해야 한다. `return`문은 함수 실행을 중단하고 값을 반환하는 역할을 한다. 또한 반환된 값은 함수 호출문을 통해 변수에 대입될 수 있다.
#include <iostream> // 두 수를 곱한 결과를 반환하는 함수 정의 (반환 타입: int) int multiply(int a, int b) { int result = a * b; return result; } int main() { int x = 5; int y = 3; // 반환 타입이 void가 아닌 함수 호출 후 반환값을 변수에 저장 int z = multiply(x, y); std::cout << "두 수의 곱: " << z << std::endl; return 0; }
위 코드는 반환값이 int 인 multiply 함수이다. 해당 코드에서는 함수 선언과 정의를 main함수 전에 했지만 여러 함수들이 복잡하게 있을 경우 main 전 후로 나누는 것이 가독성을 위해 좋다.
함수의 인자(argument)와 매개변수(parameter)는 함수 정의와 함수 호출의 관점에서 구별된다.
parameter은 함수의 선언 또는 정의 부분에 포함되며, 함수 내부에서 작업을 수행한다.
argument는 함수에 전달되는 실제 값이다. 함수를 호출할 때 함수에 필요한 인자값을 전달하여 해당 함수를 실행하게 된다. 이때, 전달된 인자 값은 함수 내의 매개변수에 복사된다.
#include <iostream> // 두 개의 정수를 더하는 함수 정의 int sum(int a, int b) { int result = a + b; return result; } int main() { int x = 3; int y = 4; // 함수 호출 시 인자로 x와 y를 전달 int z = sum(x, y); std::cout << "두 수의 합: " << z << std::endl; return 0; }
위의 예시 코드를 보면 `a`와 `b`는 매개변수로 사용되었으며, 함수 호출 시 `x`와 `y`가 인자로 전달되었음을 알 수 있다.
< 21. return keyword>
return = return a value back to the spot where you called the encompassing function
double square(double length); double cube(double length); int main() { double length = 6.0; double area = square(length); double volume = cube(length); std::cout << "Area: " << area << "cm^2\n"; std::cout << "Volume: " << volume << "cm^3\n"; return 0; } double square(double length){ return length * length; } double cube(double length){ return length * length * length; }
위의 예제코드를 보면 `square`함수와 `cube`함수를 main 위에 선언 후 main 아래에 정의한 것을 볼 수 있다.
해당 예제는 void, 반환값이 없는 타입이 아닌 double 타입의 return값이 있는 함수 예제임을 알 수 있다.
이처럼 함수는 return값의 유무와 parameter의 유무에 따라 차이를 보인다
< 22. Overloaded Functions >
Overloaded Functions : functions can share the same name, but you need a different set of parameters.
#include <iostream> void bakePizza(); void bakePizza(std::string topping1); void bakePizza(std::string topping1, std::string topping2); int main() { bakePizza("pepperoni", "mushroom"); return 0; } void bakePizza(){ std::cout << "Here is your pizza!\n"; } void bakePizza(std::string topping1){ std::cout << "Here is your " << topping1 << " pizza!\n"; } void bakePizza(std::string topping1, std::string topping2){ std::cout << "Here is your " << topping1 << " and " << topping2 << " pizza!\n"; }
위의 코드 예시를 보면 세 개의 함수명이 동일함을 알 수 있다. 변수는 중복된 이름을 사용할 수 없지만 함수는 함수명이 동일하고 매개변수를 달리 하는 것이 허용된다. 이를 오버로딩(overloading)이라고 한다.
하지만 함수명도 똑같고 매개변수도 같은 것은 중복될 수 없다. 함수명+매개변수 이 세트는 함수의 고유한 시그니처라고 볼 수 있다.
이렇게 오버로딩을 사용하는 이유는 코드의 가독성과 재사용성을 향상시킬 수 있기 때문이다. 유사한 작업을 하는 함수들을 한 곳에 모아 관리 가능하다는 장점이 있다.
< 23. Variable Scope>
Local variables : declared inside a function or block {}
Global variables : declared outside of all functions
#include <iostream> int myNum = 3; // Global variable void printNum(); int main() { int myNum = 1; // Local variable printNum(); return 0; } void printNum(){ int myNum = 2; // Local variable std::cout << myNum; }
변수 범위는 변수가 유효한 범위를 의미한다. C++에서는 지역변수와 전역변수로 나눌 수 있다.
위의 코드 예시를 보자 우선 맨 처음 `int myNum = 3`은 전역변수에 해당한다. 전역변수는 가능하면 사용하지 않는 게 좋은데 전역 namespace를 오염시키기 때문이다. 가능하면 변수들을 함수블록 내에서 선언하는 것이 안전하다.
해당 예제코드에서 main 함수에 myNum이 있고 printNum 함수에 myNum이 있는데 결과적으로 해당 코드를 실행하면 2가 출력된다. main 함수에서 printNum() 함수를 실행했지만 1인 myNum은 main의 지역변수이므로 printNum은 알 수 없다. 그렇기에 printNum에서 선언된 myNum의 값인 2가 출력되게 된다.
전역변수와 지역변수가 같이 있는 경우 우선 지역변수가 우선시된다.
만약 전역 변수를 쓰고 싶다면 ::(scope resolution operator)를 붙여야 한다.
std::cout << ::myNum;
위와 같은 코드를 실행하면 전역변수인 myNum을 출력할 수 있다.
강의는 Bro Code라는 유튜버의 총 6시간 분량의 강의입니다. 영상에서 나눠져 있는 챕터 제목을 기준으로 작성할 예정입니다. 다만 영어강의라는 점이 좀 걸리는데..한국어 강의를 찾다가 컴팩트 하면서 제가 지루하지 않고 잘 배울 수 있는 영상을 못 찾아서 영어강의를 듣게 되었습니다. 혹시 이 블로그를 보시고 들을 생각을 가진 분이 계시다면 영어자막도 있고 어색하지만 자동번역되는 한글자막도 있으니 너무 겁먹지 마시고 들어보길 바랍니다:)
해당 강의 영상은 아래에 걸어두겠습니다. 혹시 틀린 부분이나 추가해주고 싶은 부분이 있으면 알려주세요.
<이전글>
2023.05.02 - [TIL/C++] - [C++ 기본문법] 3. 삼항연산자(ternary operator)부터 반복문(while, for)까지
2023.03.26 - [TIL/C++] - [C++ 기본문법] #2 산술 연산자(arithmetic operator)부터 조건문(if, switch)까지
2023.03.21 - [TIL/C++] - [C++ 기본문법] #1 HelloWorld부터 Typedef까지