반응형

0. 시작하기

 

 

1. 네임스페이스 란?

직역하면 '이름 공간'이라는 의미인, NameSpace는 다소 생소한 개념일 수 있습니다.

 

네임스페이스는 변수/함수등을 유관함 하나의 집합으로 묶어 프로젝트간 발생할 수 있는 변수/함수명의 중복등의 문제를 해결할 수 있게해줍니다.

 

단순하게 생각한다면, 기존 변수/함수명 앞에 새로운 변수를 붙여주는 것과 큰 차이가 없지 않는가? 라고 생각할 수 있지만, 여러사람이 프로젝트를 진행할 때, 각자가 독립적인 네임스페이스에서 작업을 한다면, 자신의 작업공간이 어디서부터 어디인지 정확하게 알 수 있으며, 용도에 따라 네임스페이스를 구분한다면, 코드를 수정하고 확인할 때, 쉽게 원하는 부분을 탐색할 수 있습니다.

 

위와같은 이유로 네임스페이스를 적절하게 사용한다면 프로젝트 진행에 있어서 불필요하게 발생할 수 있는 문제들을 효율적으로 해결해줄 수 있습니다.

 

 

 

2. 샘플코드 ( CPP/Namespace1.cpp )

말로 설명하는 것보다 한번 코드로 확인하는게 더 좋겠죠.

 

#include <iostream>

namespace name1{
    int i = 10;
    void out(){
        std::cout << "namespace 1 의 out함수" << std::endl; 
    }
}

namespace name2{
    int i = 20;
    void out(){
        std::cout << "namespace 2 의 out함수" << std::endl; 
    }
}


int main(void){
    std::cout << (name1::i) << std::endl;
    name1::out();

    std::cout << (name2::i) << std::endl;
    name2::out();

    return 0;
}

실행결과

 

위의 예제는 동일한 변수/함수명을 갖고있는 네임스페이스를 다루고있습니다.

 

main함수를 보게되면 두 개의 콜론( :: )을 이용하여 네임스페이스 내에 존재하는 변수/함수를 참조하는 것을 볼 수 있습니다.

 

두 개의 콜론이 네임스페이스의 함수를 갖고오는 녀석이라면 'std'라는 녀석도 네임스페이스라는 의미가 되겠죠. 즉, std라는 녀석은 내부에 cout, cin, endl같은 함수를 갖고있는 네임스페이스고, 이 내용으 iostream 이라는 헤더파일에 작성되어있다는 것을 알 수 있습니다.

 

실제로 iostream의 내용을 확인해보면 아래와 같이 네임스페이스 'std'에 각 함수들이 존재하는 것을 볼 수 있습니다.

 

cat 명령어로 본 iostream 헤더파일

 

 

2. Using ( CPP/Namespace2.cpp )

네임스페이스의 경우 네임스페이스 내부에 또 다른 네임스페이스가 존재할 수 있습니다. 이와같은 경우 name1::name2::name3::func() 형태와 같이 호출이 가능합니다. 다만, 매우 비효율적이고 불편할 수 있습니다.

 

또한 자주사용하는 함수들(cout,cin,endl)은 호출시마다 앞에 std라는 네임스페이스를 적어줘야하는 불편함도 있습니다.

 

이러한 문제를 해결해주는 것이 Using을 이용한 선언입니다.

 

  • Using + namespace + 네임스페이스이름
  • Using + 네임스페이스이름::함수명

을 통해서 네임스페이스의 모든 함수 또는 특정 함수를 코드내에서 직접 호출하여서 사용할 수 있습니다.

 

예제코드를 보겠습니다.

 

 

#include <iostream>
using namespace std;

namespace name1{
    int i = 10;
    void out(){
        cout << "namespace 1 의 out함수" << endl; 
    }
}

namespace name2{
    int i = 20;
    void out(){
        cout << "namespace 2 의 out함수" << endl; 
    }
}

using name1::out;

int main(void){
    cout << (name1::i) << endl;
    out();      // name1 의 out 함수

    cout << (name2::i) << endl;
    name2::out();

    return 0;
}

실행결과

실행결과는 동일합니다. 다만 [using namespace std]를 통해서 'std' 네임스페이스의 함수들은, 메인함수에서 std:: 없이 사용할 수 있습니다.

 

또한 using name1::out을 통해서 name1의 out이라는 함수는 메인함수에서 그냥 out()을 통해서 호출이 가능하다는 차이만 있습니다.

 

주의할 부분은, C언어 계열의 프로그래밍 언어들은 위에서 아래로 코드를 읽어가기 때문에 using을 통해 선언해주는 부분은 네임스페이스를 선언한 이후가 되어야 한다는 것입니다.

반응형
반응형

0. 시작하기

 

1. 매개변수의 기본값 ( CPP/F_DefaultValue.cpp )

C++ 역시도 다른 언어와 마찬가지로 매개변수의 기본값을 설정할 수 있습니다.

방법 역시도 동일합니다.

 

아래는 이전에 다루었던 '함수 오버로딩'에 매개변수 기본값을 정해준 코드입니다.

 

#include <iostream>

int func(int x=10){  // 1번 함수
    return x;
}

int func(int x, int y, int z=10){  // 2번 함수
    return x+y+z;
}

int main(void){
    std::cout << func() << std::endl;  // 1번 함수 수행
    std::cout << func(10) << std::endl;  // 1번 함수 수행
    std::cout << func(10, 20) << std::endl;  // 2번 함수 수행
    std::cout << func(10, 20, 30) << std::endl;  // 2번 함수 수행


    return 0;
}

 

실행결과

 

여기서 주의할 부분은 '매개변수 기본값'을 정해줌에 따라서 '함수 오버로딩'의 조건인 '인자에 의한 구분가능성'이 유지되어야 한다는 것입니다.

 

만약 위의 함수에 아래와 같은 함수가 함께있다면 [구분가능성]이 사라져 애러가 발생합니다.

 

int func(int x=10){  // 1번 함수
    return x;
}

int func(int x, int y, int z=10){  // 2번 함수
    return x+y+z;
}

int func(int x, int y=10){  // 오버로딩 규칭 위반
    return x+y;
}

 

 

함수 선언 위치에 따른 기본값 설정 (

코드를 작성할 때, 보통 [함수 선언 -> 메인함수 -> 함수 정의]의 순서로 작성하는 경우가 많습니다.

 

함수의 정의부분이 너무 길게되면 자주 사용되는 메인함수가 최하단으로 밀려나 불편하기 때문이죠.

 

이와 같은경우 매개변수의 기본값 설정은 [함수 선언]부분에 작성합니다.

 

예제 코드를 봐주세요.

 

#include <iostream>

int func(int x=10, int y=10);  // 함수 선언시에 기본값 설정

int main(void){
    std::cout << func() << std::endl;

    return 0;
}

int func(int x, int y){
    return x+y;
}

 

실행결과

 

반응형
반응형

0. 시작하기

 

1. 함수 오버로딩 ( CPP/F_Overloading.cpp )

C++도 다른언어와 마찬가지로 함수와 함수 오버로딩을 제공합니다.

 

오버로딩을 구현하기 위해서의 필수 조건은 동일한 함수명이라 하더라도, 입력하는 인자의 값에 따라 수행할 함수를 구분할 수 있어야합니다.

 

예제를 보면 쉽게 이해가 가능합니다.

 

#include <iostream>

int func(int num){
    return num;
}

int func(int num1, int num2){
    return num1 + num2;
}

int main(void){
    std::cout << func(10) << std::endl;
    std::cout << func(10, 10) << std::endl;

    return 0;
}

실행결과

 

보통의 경우 유사한 기능을 하는 함수에 동일한 이름을 주어 함수 오버로딩을 구현합니다.

반응형
반응형

0. 시작하기

 

1. 확장자

기존 C++은 확장자로 '---.c'를 사용하였습니다. 하지만, C++에서는 '---.cpp'이라는 확장자를 사용합니다.

일반적으로 IDE가 확장자에 따라서 적용하는 컴파일러를 결정하는 경우가 많기 때문에 C++ 사용시 꼭 cpp확장자를 사용해야합니다.

 

헤더파일의 경우 C와 마찬가지로 '---.h' 형태의 확장자를 사용합니다. 다만, 코드에서 헤더파일을 선언할 때, 기존 C에서는 <stdio.h>의 형태로 [파일명+확장자]형태로 선언했다면, C++에서는 <iostream> 이라는 파일명으로 선언을 합니다.

 

 

 

2. 기본 입출력 ( CPP/iostream.cpp )

기본 입출력은 <iostream> 헤더를 사용합니다.

 

샘플 코드는 아래와 같습니다.

 

#include <iostream>

int main(void){
    int temp = 0;
    std::cout << "Console Out" << std::endl;
    std::cout << "Hello" << "World~!" << std::endl;

    int a, b;
    std::cout << "숫자 2개입력 > ";
    std::cin >> a >> b ;
    std::cout << a+b << std::endl;
    return 0;
}

실행결과

 

 

 

3. 배열 입출력시 주의사항 ( CPP/iostream_arry.cpp )

배열을 이용해서 단어나 문자를 입력하는 경우가 많이 있습니다.

 

아래 코드를 보고 한눈에 잘못된 부분을 찾으셨다면 '짝짝짝~'

#include <iostream>

int main(void){
    char str[100] = "배열 입출력 주의점";
    std::cout << "str 값 : " << str << std::endl;

    char temp[100];
    std::cout << "값 입력 > ";
    std::cin >> temp;  // "test test test" 를 입력할 예정
    std::cout << "입력한 값 출력 : " << temp << std::endl;
    
    
    return 0;
}

 

위의 코드에서 문제인 부분은 [입력] 부분입니다.

 

temp에 "test test test"를 입력할 경우 [std::cin]은 스페이스바를 기준으로 입력값을 정하기 때문에 처음 'test'만 temp값에 저장되고 나머지 'test test'는 버퍼에 남게됩니다.

 

실행결과

 

때문에 char 배열에 cin을 이용해서 값을 지정할 경우 공백이 없는 문자열을 이용하던가 혹은 위의 문제를 해결할 코드를 사용해야합니다.

반응형

+ Recent posts