SH1R0_HACKER

Chapter01 C언어 기반의 C++ 1 본문

Programming Language/C++

Chapter01 C언어 기반의 C++ 1

SH1R0_HACKER 2020. 10. 18. 15:17

 

Part 01 C++로의 전환

 

Chapter 01 C언어 기반의 C++ 1

01-1 printf와 scanf를 대신하는 입출력 방식

 

1) 문자열 "Hello World"의 출력

#include <iostream> //표준 헤더파일의 선언에서는 확장자를 생략

int main(void)
{
	int num = 20;
	std::cout << "Hello World!" << std::endl;
	std::cout << "Hello " << "World!" << std::endl;
	std::cout << num << ' ' << 'A';
	std::cout << ' ' << 3.14 << std::endl;
    return 0;
}

 

2) scanf를 대신하는 데이터의 입력

#include <iostream>

int main(void)
{
	int val1 = 0;
	std::cout << "첫 번째 숫자 입력: ";
	std::cin >> val1;

	int val2 = 0;
	std::cout << "두 번째 숫자 입력: ";
	std::cin >> val2;

	int result = val1 + val2;
	std::cout << "덧셈결과 : " << result << std::endl;
	return 0;
}

 

01-2 함수 오버로딩(Function Overloading)

- 함수호출 시 전달되는 인자를 통해서 호출하고자 하는 함수의 구분이 가능하다.

- C++은 호출할 함수를 찾을 때 '함수의 이름', '매개변수의 선언' 두 가지 정보를 동시에 활용하지만, C언어는 함수의 이름만을 이용해서 호출대상을 찾는다. 때문에 C언어에서는 함수의 오버로딩이 불가능, 문법적으로도 허용하지 않는다.

- 함수 오버로딩이 가능하려면 '매개변수 자료형 또는 개수가 다르면' 된다. 반면에 반환형이 다르다면 컴파일 오류

#include <iostream>

void swap(int* num1, int* num2);
void swap(char* ch1, char* ch2);
void swap(double* db11, double* db12);

int main(void)
{
	int num1 = 20, num2 = 30;
	swap(&num1, &num2);
	std::cout << num1 << ' ' << num2 << std::endl;

	char ch1 = 'A', ch2 = 'Z';
	swap(&ch1, &ch2);
	std::cout << ch1 << ' ' << ch2 << std::endl;

	double db11 = 1.111, db12 = 5.555;
	swap(&db11, &db12);
	std::cout << db11 << ' ' << db12 << std::endl;
	return 0;
}

void swap(int* num1, int* num2)
{
	int num3 = *num1;
	*num1 = *num2;
	*num2 = num3;
}

void swap(char* ch1, char* ch2)
{
	char ch3 = *ch1;
	*ch1 = *ch2;
	*ch2 = ch3;
}

void swap(double* db11, double* db12)
{
	double db13 = *db11;
	*db11 = *db12;
	*db12 = db13;
}

 

실행결과

 

01-3 매개변수의 디폴트 값(Default Value)

#include <iostream>

int BoxVolume(int length, int width = 1, int height = 1);

int main(void)
{
	std::cout << "[3, 3, 3] : " << BoxVolume(3, 3, 3) << std::endl;
	std::cout << "[5, 5, D] : " << BoxVolume(5, 5) << std::endl;
	std::cout << "[7, D, D] : " << BoxVolume(7) << std::endl;
//	std::cout << "[D, D, D] : " << BoxVolume() << std::endl;
}

int BoxVolume(int length, int width, int height)
{
	return length * width * height;
}

 

01-4 인라인(inline) 함수

- 함수의 몸체부분이 함수호출 문장을 완전히 대체했을 때 '함수가 인라인화 되었다' 라고 표현한다.

- 강의 : https://youtu.be/XA_kkIC2uD4

 

< 아래 예제는 매크로 함수를 이용하지 않는, C++ 기반의 인라인 함수의 정의방법을 보이고 있다. >

#include <iostream>

inline int SQUARE(int x)
{
	return x * x;
}

int main(void)
{
	std::cout << SQUARE(5) << std::endl;
	std::cout << SQUARE(12) << std::endl;
	return 0;
}

 

01-5 이름공간(namespace)에 대한 소개

 

< 이름공간 기반의 함수 선언과 정의의 구분 >

- 동일한 이름공간에 정의된 함수를 호출할 때에는 이름공간을 명시할 필요가 있다.

#include <iostream>

namespace BestComImp1
{
	void SimpleFunc(void);
}

namespace BestComImp1
{
	void PrettyFunc(void);
}

namespace ProgComImp1
{
	void SimpleFunc(void);
}

int main(void)
{
	BestComImp1::SimpleFunc();
	return 0;
}

void BestComImp1::SimpleFunc(void)
{
	std::cout << "BestCom이 정의한 함수" << std::endl;
	PrettyFunc(); // 동일 이름공간
	ProgComImp1::SimpleFunc(); // 다른 이름공간
}

void BestComImp1::PrettyFunc(void)
{
	std::cout << "So Pretty!!" << std::endl;
}

void ProgComImp1::SimpleFunc(void)
{
	std::cout << "ProgCom이 정의한 함수" << std::endl;
}

 

 

< using을 이용한 이름공간의 명시 >

#include <iostream>

namespace Hybrid
{
	void HybFunc(void)
	{
		std::cout << "So simple function!" << std::endl;
		std::cout << "In namespace Hybrid!" << std::endl;
	}
}

int main(void)
{
	using Hybrid::HybFunc;
	// 키워드 using을 이용해서 '이름공간 Hybrid에 정의된 HybFunc를
	// 호출할 때에는, 이름공간을 지정하지 않고 호출하겠다!'는 것을
	// 명시(선언)하고 있다.
	HybFunc(); // using 선언을 통해서 이름공간의 지정없이 HybFunc 함수를 호출하고 있다.
	return 0;
}

 

< 이름공간의 별칭 지정 >

- 이름공간이 중첩되면서까지 과도하게 사용이 되었을 때, 별칭을 줄 수 있다.

#include <iostream>
using namespace std;

namespace AAA
{
	namespace BBB
	{
		namespace CCC
		{
			int num1;
			int num2;
		}
	}
}

int main(void)
{
	// 별칭이 선언되기 이전의 변수 num1과 num2의 접근
	AAA::BBB::CCC::num1 = 20;
	AAA::BBB::CCC::num2 = 30;

	namespace ABC = AAA::BBB::CCC; // AAA::BBB::CCC 에 ABC라는 별칭을 붙여주고 있다.
	
	// 별칭의 선언 이후의 접근을 보이고 있다.
	cout << ABC::num1 << endl;
	cout << ABC::num2 << endl;
	return 0;
}

 

< 범위지정 연산자의 또 다른 기능 >

- 지역변수의 이름이 전역변수의 이름과 같을 경우, 전역변수는 지역변수에 의해 가려진다.

- 전역변수에 접근하기 위해서는 '범위지정 연산자 (::)'를 사용하면 된다.

#include <iostream>
using namespace std;

int val = 100; // 전역변수

int main(void)
{
	int val = 20; // 지역변수
	val += 3; // 지역변수의 val의 값 3 증가
	::val += 7; // 전역변수 val의 값 7 증가

	cout << "지역변수 val : " << val << endl; // 23 출력
	cout << "전역변수 val : " << ::val << endl; // 107 출력
}