프로그래밍 언어/C++

[C++] C언어 기반 C++ 1 (입출력, 함수 오버로딩, 매개변수 디폴트 값, 이름공간)

Campus Coder 2023. 4. 30. 17:15
728x90
반응형
  1. 입출력
  2. 함수 오버로딩
  3. 매개변수 디폴트 값
  4. 이름공간

 

1. 헤더파일 선언/입출력의 기본구성/개행의 진행

#include <iostream> //헤더파일 선언
int main(void)
{
    int num;
    std::cout<<"Hello World!"<<std::endl;
    std::cout<<"Hello"<<"World!"<<std::endl;
    
    std::cin>>num;
    std::cout<<num<<' '<<'A';
    std::cout<<' '<<3.14<<std::endl;
    return 0;
}

 

실행 결과

Hello World!

Hello World!

20

20 A 3.14

의미 코드 설명
헤더파일 선언 #include <iostream> 헤더파일 선언
출력 std::cout<<'출력대상1'<<'출력대상2'<<'출력대상3'; C언어와 달리 출력 대상에 따른 서식 지정 불필요
개행 std::endl std::endl를 출력하면 개행이 이루어짐
입력 std::cin>>'변수1'>>'변수2'; 별도의 서식 지정 불필요(문자열 입력방식 포함)/ 데이터의 구분은 스페이스바, 엔터, 탭 등의 공백을 통해서 이루어짐

 

 

2. 함수 오버로딩

C++은 함수 호출 시 함수의 이름 전달되는 인자의 정보를 동시에 참조하여 호출할 함수를 결정

매개변수의 선언이 다르다면 동일한 이름의 함수 정의 가능

- 반환형의 차이는 함수 오버로딩의 조건을 만족시키지 않음

 

 

3. 매개변수에 설정하는 디폴트 값

int MyFuncOne(int num=7) {}
// 인자를 전달하지 않으면 7이 전달된 것으로 간주
// 여기서 디폴트 값은 7

int MyFuncTwo(int num1=5, int num2=7) {}
// 인자를 전달하지 않으면 각각 5와 7이 전달된 것으로 간주

디폴트 값은 함수의 선언에만 위치

-> 컴파일러는 함수의 디폴트 값의 지정여부를 알아야 함수의 호출문장을 적절히 컴파일 가능

 

부분적 디폴트 값 설정

- 매개변수의 일부에만 디폴트 값을 지정하고 채워지지 않은 매개변수에만 인자를 전달 가능

- 전달되는 인자가 왼쪽에서부터 채워지므로, 디폴트 값은 오른쪽부터 채워져야 함

- 오른쪽이 빈 상태로 왼쪽의 매개변수에만 일부 채워진 디폴트 값은 컴파일 에러를 일으킴

 

 

4. 이름공간

namespace Np1 //Np1이라는 이름의 공간
{
    void func1(void)
    {
        stf::cout<<"Np1이 정의한 함수"<<std::endl;
    }
}

namespace Np2 //Np2이라는 이름의 공간
{
    void func1(void)
    {
        stf::cout<<"Np2이 정의한 함수"<<std::endl;
    }
}

int main(void)
{
    Np1::func1(); //Np1의 func1 호출
    Np2::func1(); //Np2의 func1 호출
    return 0;
}

존재하는 이름공간이 다르면 동일한 이름의 함수 및 변수 선언 가능

이름공간은 프로잭트의 진행에 있어서 발생할 수 있는 이름의 충돌을 막을 목적으로 존재

 

이름공간 기반의 함수 선언과 정의의 분리

namespace Np1
{
    void func1(void);
}
namespace Np2
{
    void func1(void);
}

void Np1::func1(void)
{
    stf::cout<<"Np1이 정의한 함수"<<std::endl;
}
void Np2::func1(void)
{
    stf::cout<<"Np2이 정의한 함수"<<std::endl;
}

 

동일한 이름동간 내에서의 함수 호출

선언된 이름공간의 이름이 동일하다면, 이 둘은 동일한 이름공간으로 간주

이름공간을 명시하지 않고 함수를 호출하면, 함수의 호출문이 존재하는 함수와 동일한 이름공간 안에서 호출할 함수를 찾음

 

이름공간의 중첩

namespace Parent //이름공간 Parent
{
    int num=2; //Parent::num
    namespace Sub1 //이름공간 Parent::Sub1
    {
        int num=3; //Parent::Sub1::num
    }
    
    namespace Sub2 //이름공간 Parent::Sub2
    {
        int num=4; //Parent::Sub2::num
    }
}

이름공간은 중첩 가능

계층적 구조를 갖게끔 이름공간 구성 가능

 

std::cout, stf::sin, std::endl

<iostream>에 선언되어 있는 cout, cin, endl은 이름공간 std안에 선언되어 있음

이렇듯 이름 충돌을 막기 위해, C++ 표준에서 제공하는 다양한 요소들은 이름공간 std안에 선언되어 있음

 

using을 이용한 이름공간 명시

#include <iostream>
using namespace std;
//std라는 이름공간의 선언없이 접근하겠다는 선언
int main(void)
{
    int num;
    cin>>num;
    cout<<num<<endl;
    return 0;
}

너무 빈번한 using namespace의 선언은 이름의 충돌을 막기위한 이름공간의 선언을 의미 없게 만듬

제한적으로 사용할 필요가 있음

 

이름공간의 별칭 지정

namespace AA
{
    namespace BB
    {
        namespace CC
        {
            int num1;
            int num2;
        }
    }
}

namespace ABC=AA::BB::CC; //AA::BB::CC에 대해 ABC라는 별칭 지정

ABC::num1=10;
ABC::num2=20; //별칭으로 이름공간의 선언을 대신함

 

전역변수의 접근

int num=100;
void func(void)
{
    int num=10; //지역변수
    num+=3; //지역변수 num의 값 3 증가
    ::num+=7; //전역변수 num의 값 7 증가
}

범위지정 연산자는 전역변수의 접근에도 사용이 가능

728x90
반응형