[C++] # 0. 함수의 오버로딩과 이름공간(namespace)

Crush_on_Study·2022년 6월 29일
0

C++ 기초

목록 보기
1/2

C언어와 C++에서의 입출력방식 차이

C언어 vs C++

C언어에서는 입출력을 할 때, printf / scanf 함수를 사용하고 이러한 함수를 사용할 수 있도록 하는 라이브러리는 <stdio.h>였습니다.

이런 식이였죠. 코드를 보면 형식지정자도 사용해야합니다.
하지만 C++ 코드를 보면!

이런 식입니다.

  • 오? iostream? 처음보는 헤더파일입니다. 그리고 뒤에 확장명을 의미하는 .h도 있지가 않네요?

yes~ 이제 C++에서는 iostream이 우리가 알던 stdio.h를 대신하는 헤더파일입니다. 의미는 input/output 스트림입니다. stdio에서 io역시 input/output이였죠.

  • std? 이것도 처음보고 :: 라는것도 처음봅니다.

yes~ std는 'standard'의 약자입니다. 가장 대표적인 '이름공간(namespace)'입니다.
다만, 이 이름공간을 설명하기 전에 우리는 오버로딩(OverLoading)이라는 개념을 알아야합니다.


함수의 오버로딩(OverLoading)

이름부터 좀 무서운데요?

C언어에서 확장된 개념입니다. C언어에서 우리는 사용자 정의 함수를 구현할 때, 대충 코드를 이런 식으로 짰습니다.

#include <stdio.h>

int sum (int a, int b)
{
	printf("%d",a+b);
	return 0;
}

int minus (int a, int b)
{
	printf("%d",a-b);
	return 0;
}

int main()
{
	int a,b;
	scanf("%d %d",&a,&b);
	sum(a,b);
	printf("\n");
	minus(a,b);
	
	return 0;
}

이런 식으로 함수명을 sum, minus로 두었습니다. 근데, 만약 함수명이 같다면요? 직관적으로 봐도 허용이 되지 않음을 파악하셨을겁니다. 맞아요.

바로 breakpoint가 걸립니다.

  • 음... 그럼 혹시 매개변수가 a,b로 같아서 그런게 아닐까요? c,d로 바꿔보죠!

    네. 마찬가지로 안됩니다. 함수명이 sum으로 동일하기 때문입니다.

근데, C++에서는 이걸 허용해줍니다. 이러한 개념을 함수의 오버로딩이라 합니다. C++로 넘어가서 코드를 다시 짜보겠습니다.

보시면 sum으로 동일한 함수가 2개 선언되었는데 문제없이 컴파일되고 출력도 정상적으로 됩니다. 어떻게 판단하는 것일까요?

  • 바로 매개변수입니다. 첫번째 sum을 보면 정수형 타입의 변수 a,b를 전달받아서 출력을 합니다. 두번째 sum을 보면 전달받은 매개변수는 없고 sum함수를 호출 시, "결과값은 위와 같습니다." 라는 문구를 출력합니다.

매개변수가 다르다면 문제가 없다는 것입니다.

즉, 정수형 / 실수형 / 문자형 / void형 으로 구분을 해서 함수를 호출한다는 것입니다.


이름공간(namespace)

  • 저는요. 위 코드와 같은 상황에서도 출력이 되게하고싶어요.

가능합니다. 이걸 가능케하는게 바로 이름공간입니다. 코드부터 소개하겠습니다.

#include <iostream>

namespace Crush
{
	void Func();
}
namespace Study
{
	void Func();
}

void Crush::Func()
{
	std::cout << "안녕? 나는 Crush" << std::endl;
}

void Study::Func()
{
	std::cout << "안녕? 나는 Study" << std::endl;
}

int main()
{
	Crush::Func();
	Study::Func(); 
	return 0;
}
  • 오... namespace요..?

이름공간을 사용할 건데 어떤 이름을 줄거냐? 그래서 저는 Crush라는 이름공간 / Study라는 이름공간을 정의했습니다.
이 이름공간 내에서 이제 저는 Func라는 함수를 정의할 것입니다.

  • Crush라는 이름공간에 Func 함수.
  • Study라는 이름공간에 Func 함수.

그리고 둘다 매개변수는 주지 않겠습니다. 이렇게 되면 원래대로면

이렇게 breakpoint가 걸려야 합니다. 하지만?

이름공간을 사용했더니 그렇지가 않죠.
예시를 들면, 임직원조회를 해보면요. 저희 회사에는 저랑 동명이인이신 사원분이 한분 계십니다. 근데 저희 둘을 구분지을 방법은 바로 부서입니다.
동명이인이지만 부서가 달라서 구분이 가능합니다.

이것도 실생활에서의 이름공간이라 볼 수 있습니다.
제조 조직의 Crush님.
CTO조직의 Crush님. 이렇게 구분이 가능하죠.


using namespace std , ::의 의미

이제 이 포스팅의 마지막 글을 봅시다.

  • using namespace vs namespace

우리가 C++에서 입출력을 할 때 항상 std::cout / std::cin 같이 std라는 것을 항상 참조했습니다.

여기서 ::는 "이름공간을 참조한다" 라는 뜻입니다.

아무튼, 입출력을 쓸 때마다 항상 std::를 기재해주는게 여간 귀찮은게 아닙니다.
그래서 등장한게 using 개념입니다. using을 어떻게 사용하느냐?

전역변수로 std라고 정의된 이름공간을 '사용 중' 으로 하면 이제 이 프로그램은 종료되기 전까진 std::를 명시하지 않아도 됩니다.


endl?

C언어의 \n과 같다!

코드를 보면 cout은 출력 cin은 입력을 의미하는 것을 알 수 있었습니다.
근데 endl? 이건 쓸때도 있고 안쓸때도 있는데 뭔가요?

  • 개행을 의미합니다. 개행은 Enter. 즉, 줄 바꿈을 의미합니다.
profile
방구석백수 코드몽키

0개의 댓글