안녕하세요 신용준입니다. 최근에 윤성우 님의 열혈 C를 완독 했기 때문에 이어서 열혈 C++을 해보려고 합니다. 매일 공한 내용을 가능한 명료하고 이해하기 쉽게 기록해 놓으면, 제가 복습할 때도 도움이 될 것 같아서 시작하게 되었습니다. C++ 공부하시는 분들에게 작게나마 도움 되기를 바랍니다.
환경 : Visual Studio 2022
교재 : 윤성우의 열혈 C++ 프로그래밍
이 책과 제 포스팅은 열혈 C 또는 다른 방법을 통해 C를 이미 공부했다고 가정한 상태에서 쓰여있습니다.
printf와 scanf를 대신하는 입출력 방식
#include <iostream>
int main(void)
{
int num = 20;
std::cout << "Hello World!"<<std::endl;
std::cout << "Hello"<<" World!" << std::endl;
std::cout << num <<' '<<3.14<< std::endl;
return 0;
}
Hello World! Hello World! 20 3.14 |
위 코드는 C++에서의 출력을 보여주고 있습니다. C와의 차이점은 <stdio.h> 대신 <iostream>을 쓰고 printf대신 std::cout<<을 쓴다는 점입니다. <iostream>처럼 C++에서는 표준 헤더파일의 선언에서는 확장자(.h)를 생략하기로 되어있습니다. std::cout<<은 위 코드에서 볼 수 있듯이 문자열, 문자, 변수, 실수, 정수, 등 다양한 자료형을 쉽게 출력할 수 있습니다. std::endl 은 \n과 같이 줄 바꿈을 의미합니다.
std::cout << '출력대상'; |
#include <iostream>
int main(void)
{
int num1,num2;
std::cout << "두 숫자를 입력하세요"<<std::endl;
std::cin >> num1 >> num2;
std::cout << "두 숫자의 합은 "<<num1+num2<<"입니다"<< std::endl;
return 0;
}
두 숫자를 입력하세요 5 7 두 숫자의 합은 12입니다 |
위 코드는 C++에서의 입력을 보여주고 있습니다. C에서와 달리 scanf대신 std::cin>>을 사용합니다. 또한 위 코드처럼 >>연산자를 이용해서 연속해서 입력받을 수 있습니다. 입력의 구분은 탭, 스페이스바, 엔터키 같은 공백에 의해 나눠집니다.
std::cin>>'변수'; |
함수 오버로딩
함수 오버로딩이란 이름은 같지만 매개변수의 선언은 다른 여러 함수를 선언하는 방법입니다. C에서는 함수의 이름으로만 찾기 때문에 이름이 같은 함수가 있으면 컴파일오류가 나지만 C++에서는 함수의 이름과 매개변수의 선언으로 함수를 찾기 때문에 함수의 이름이 같더라도 매개변수의 구성이 다르다면 컴파일 오류가 나지 않습니다.
#include <iostream>
int Func(int num1)
{
return num1 * num1;
}
int Func(int num1, int num2)
{
return num1 * num2;
}
int main(void)
{
int num1,num2;
std::cout << "두 숫자를 입력하세요"<<std::endl;
std::cin >> num1 >> num2;
std::cout << Func(num1) <<' '<< Func(num1, num2);
return 0;
}
두 숫자를 입력하세요 3 5 9 15 |
위 코드는 함수 오버로딩의 간단한 예시를 보여주고 있습니다. 첫번째 Func은 매개변수로 정수 하나만 요구합니다. 하지만, 두 번째 Func은 매개변수로 정수 두 개를 요구하기 때문에 둘이 다른 함수로 인식되는 것입니다.
매개변수의 디폴트값
디폴트값은 함수를 정의할 때, 만약 매개변수가 오지 않을 경우에 매개변수로 정의되는 값을 말합니다. 예를 들어 함수가 다음과 같이 선언되어 있다고 생각해 봅시다. int Func(int num1=5) 여기서 5가 매개변수 num1의 디폴트값이 되는 것입니다. 우리가 만약 Func()의 형태로 인자의 전달 없이 함수를 호출하게 되면 함수는 인자로 5를 전달받은 것처럼 작동하는 것입니다.
#include <iostream>
int Func(int num1=5)
{
return num1 * num1;
}
int Func(int num1, int num2)
{
return num1 * num2;
}
int main(void)
{
int num1,num2;
std::cout << "두 숫자를 입력하세요"<<std::endl;
std::cin >> num1 >> num2;
std::cout << Func() <<' '<< Func(num1, num2);
return 0;
}
두 숫자를 입력하세요 3 5 25 15 |
앞에서 사용한 함수 오버로딩 코드에서 디폴트 값만 추가한 코드입니다. 2열과 15열이 수정되었습니다. 15열에서 Func() 형태로 인자의 전달 없이 함수를 호출하고 있습니다. 그래서 디폴트값 5가 들어왔다고 생각해서 결과로 25가 출력된 것입니다.
만약 인자가 여러 개인 함수에 디폴트값을 설정하고 싶다면 가장 오른쪽에 있는 변수부터 디폴트 값을 채워나가야 합니다. 그렇지 않으면 컴파일오류가 나게 됩니다.
- int Func(int num1, int num2=5) -> (O)
- int Func(int num1=5, int num2) -> (X)
- int Func(int num1=3, int num2=5) -> (O)
만약 두 번째 줄의 형태로 선언한다면 우리가 한 개의 인자만 전달하였을 때 문제가 생기게 됩니다. 함수는 인자를 왼쪽부터 채워나가므로 num1에 디폴트값 대신 인자가 전달됩니다. 그러면 num2가 비어있게 되기 때문에 오류가 나는 것입니다.
함수 오버로딩과 디폴트값을 함께 사용할 때 주의점
#include <iostream>
int Func(int num1=5)
{
return num1 * num1;
}
int Func(int num1, int num2=7)
{
return num1 * num2;
}
int main(void)
{
int num1,num2;
std::cout << "두 숫자를 입력하세요"<<std::endl;
std::cin >> num1 >> num2;
std::cout << Func(num1) <<' '<< Func(num1, num2);
return 0;
}
위 코드에서 Func(num1)을 호출하게 되면 컴파일러는 첫 번째 Func에 num1을 넣어야 할지, 두 번째 Func에 전달하여야 할지 알 수 없기 때문에 오류가 나게 됩니다.
'C & C++ > 윤성우의 열혈 C++ 프로그래밍' 카테고리의 다른 글
[열혈 C++] 구조체와 클래스 (0) | 2024.02.04 |
---|---|
[열혈 C++] malloc & free를 대신하는 new & delete (0) | 2024.01.24 |
[열혈 C++] const의 의미와 참조자 (0) | 2023.12.19 |
[열혈 C++] OOP 단계별 프로젝트 01단계 (0) | 2023.12.14 |
[열혈 C++] 인라인 함수와 네임 스페이스 (0) | 2023.12.14 |