[C++] Chapter 01 - C언어 기반의 C++

Lee Jeong Min·2020년 11월 25일
0

Cpp

목록 보기
1/16
post-thumbnail

전부터 C++ 공부를 해왔는데 최근에 학교 공부를 하느라 공부를 하지못해서 오늘부터 공부하면서 정리한 것을 올려보고자 한다. 책은 윤성우의 열혈 C++ 프로그래밍을 주 교재로 하였다.

01-1 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 << ' ' << 'A';
	std::cout << ' ' << 3.14 << std::endl;
	return 0;
}

다음과 같이 printf를 대신해 std::cout는 출력을 위함이고 std::endl은 개행을 위함이다.

#include <iostream>

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

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

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

이번 예제에서는 scanf를 대신해 std::cin>>"변수"를 통해 입력을 받을 수 있음을 알 수 있다.

c++에서는 데이터의 입력과 출력에 있어서 별도의 포맷 지정이 필요하지 않음(%d, %c, %s ...)


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

C언어에서는 동일한 이름의 함수가 정의되는 것을 허용하지 않지만 C++ 언어에서는 같은 이름의 함수라도 함수 호출 시 전달되는 인자의 개수나 매개변수의 자료형에 따라 구분이 가능하므로 동일한 이름의 함수 정의가 가능함! (함수의 반환형은 호출되는 함수를 구분하는 기준이 될 수는 없어서 오로지 매개변수의 자료형 또는 개수가 다른 함수 오버로딩이 가능)

int MyFunc(int num)
{
	num++;
    return num;
}

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

int main(void)
{
	MyFunc(20);
    MyFunc(30, 40);
    return 0;
}

동일한 이름의 함수정의를 허용하며 이러한 형태의 함수 정의를 '함수 오버로딩(Function Overloading)'이라고 함!


01-3 매개변수의 디폴트 값

int MyFuncOne(int num = 7)
{
	Return num+1;
}

int MyFuncTwo(int num1 = 5, int num2 = 7)
{
	Return num1 + num2;
}

다음과 같이 함수의 매개변수를 디폴트 값을 정해서 선언하는 것이 가능하다.

매개변수에 디폴트 값이 설정되어 있으면 선언된 매개변수의 수보다 적은 수의 인자전달이 가능하고, 전달되는 인자는 왼쪽에서부터 채워져 나가고 부족분은 디폴트 값으로 채워짐

->부분적 디폴트 값 설정이 가능하며 반드시 오른쪽 매개변수의 디폴트 값부터 채우는 형태로 정의해야함. 그렇지 않으면 컴파일 에러가 발생!

int YourFunc(int num1, int num2 = 20, int num3 = 30) {…} (O)
int WrongFunc(int num1=10, int num2 = 20, int num3) {…} (X)

01-4 인라인(inline) 함수

매크로 함수의 장점 -> 일반적인 함수에 비해서 실행속도의 이점이 있음
매크로 함수의 단점 -> 정의하기가 어려움

인라인 함수 -> 매크로 함수는 정의하기 복잡하니 일반함수처럼 매크로 함수를 정의하는 것!

#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)에 대한 소개

Namespace를 활용하여 자신만의 이름공간을 만들어서 사용을 하면 같은 함수라도 이름공간::함수명 이렇게 사용할 수 있음

#include <iostream>

namespace BestComImp1
{
	void SimpleFunc(void)
	{
		std::cout << "BestCom이 정의한 함수" << std::endl;
	}
}

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

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

:: -> 범위지정 연산자라 하며 이름공간을 지정할 때 사용하는 연산자임.

Using을 이용한 이름공간의 명시

키워드 using을 이용해서 이름공간을 앞에 굳이 붙이지 않더라도 함수를 사용할 수 있음

#include <iostream>

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

int main(void)
{
	using Hybrid::HyFunc;
	HyFunc();
	return 0;
}

using의 선언으로 HyFunc를 이름공간 Hybrid에서 찾으라는 선언이 됨

아래와 같이이름공간 std에 선언된 모든 것에 대해 이름공간 지정의 생략을 명령할 수 있음.

using namespace std;
#include <iostream>

using namespace std;

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

다음과 같이 하면 편하지만 그만큼 이름충돌이 발생할 확률이 상대적으로 높아짐 --> 적절히 사용하는 것이 중요!

이름공간의 별칭 지정

namespace가 AAA:BBB:CCC 이러한 형태로 있는 경우
namespace ABC=AAA:BBB:CCC와 같이 하여 ABC::num1 = 10;과 같이 설정할 수 있음

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

int val = 100;

int SimpleFunc(void)
{
    int val = 20; // 지역변수
    val += 3; // 지역 변수 값 증가
    ::val += 7; // 전역 변수 값 증가
}
profile
It is possible for ordinary people to choose to be extraordinary.

0개의 댓글