[C++]C++ 기초 스터디 01

2 minute read

Chapter01. C언어 기반의 C++

C++은 C언어를 포함하므로 C언어로 작성된 대부분의 프로그램은 C++컴파일러로 컴파일 가능. But, 객체지향적 특성 반영위해 C에 없는 특성이 C++에 존재.

[1] 출력

#include <iostream>

int main(void){
  std::cout<<"Hello World!"<<std::endl;
  std::cout<<"Hi"<<" "<<3.14<<std::endl;
  return 0;
}

결과

Hello World!
Hi 3.14

1. 헤더파일 선언문

#include <iostream>

헤더파일의 확장자는 C와 마찬가지로 .h c++에서는 표준 헤더파일의 선언에는 확장자 생략하기로 약속됨.

2. 출력

C의 printf 함수에서는 %d, %s와 같이 출력포맷 지정. but, 이 언어는 std::cout과 « 사용함. 출력포맷 지정할 필요 없음. « 는 연산자임. 출력대상을 연이어 출력 가능. «std::endl 는 «연산자를 이용하여 개행출력을 연이어 출력하는 것.

image

image

image

입력

#include <iostream>
int main(void){
  int var1;
  std::cin>>var1;
  std::cout<<var1;
  return 0;
}

결과

1 (입력)
1 (출력)

1. 입력

std::cin 로 입력받은 데이터를 » 이용해서 변수에 저장하는 것처럼 보임..? C의 scanf와 달리 포맷 지정할 필요 없음.

2. 지역변수 선언

기존의 C는 지역변수 선언이 제일 위에 있어야 함.(새로운 표준에는 제한 없음) But, C++에서는 위치 제한 없음.

for(int i = 0; i < 5 ; i++){
}

위와 같이 for문 내에도 선언 가능

[2] 함수 오버로딩

C는 함수호출 시 함수의 이름만 이용하여 찾음. C++은 (1)함수의 이름 (2)매개변수의 선언 « 이렇게 두가지 사용하여 함수를 찾음.

=> 함수 오버로딩 가능. BUT 반환형으로는 구분하지 않으므로 주의.

[3] 매개변수의 디폴트 값

매개변수에 디폴트 값 설정 가능함.

int func(int num1 = 1, int num2 = 3)
{
  return 0;
}

위의 매개변수와 같이 작성됨. 함수호출 시 인자를 전달하지 않으면 디폴트값이 전달된 것으로 간주하여 사용.

위의 예제에 대하여

  1. func() => num1 = 1, num2 = 3
  2. func(4) => num1 = 4, num2 = 3
  3. func(5,6) => num1 = 5, num2 = 6

위의 2번을 보아, 선언된 매개변수보다 적은 수의 인자가 전달되면 왼쪽의 파라미터부터 채워짐.

함수의 원형 별도로 선언한다면

원형 선언에만 디폴트값 설정. 실제로 함수 정의시에는 디폴트값 작성하지 않음.

원형 선언에 디폴트 값을 설정해야 메인에서 func() 와 같은 명령 컴파일 가능.

디폴트값 설정은 파라미터 중에서 오른쪽에 위치해야 함.

함수에 전달되는 인자가 왼쪽에서 오른쪽으로 채워지기 때문.

[4] inline 함수

#define SQUARE(x) ((x)*(x)) 

매크로 함수를 사용한 코드가 전처리과정을 거치면 함수의 호출부분 -> 함수의 몸체부분 으로 대체됨. 함수의 몸체부분이 함수호출 문장을 완전히 대체했을 때 ‘함수가 인라인화 되었다’ 라고 표현함.

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

매크로 이용한 함수의 인라인화는 전처리기에 의해 처리. inline 이용한 함수의 인라인화는 컴파일러에 의해 처리. 따라서 컴파일러가 성능고려하여 키워드 무시하기도 함.

매크로는 자료형 의존 X. 인라인은 자료형 의존적.

[5] namespace

같은 이름의 서로 다른 요소에 대한 충돌 해결.

#include <iostream>

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

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

int main()
{
    BestComImpl::SimpleFunc();
    ProgComImpl::SimpleFunc();

    return 0;
}

:: < 범위지정 연산자, 이름 공간을 지정할 때 사용하는 연산자.

#include <iostream>

namespace BestComImpl
{
    void SimpleFunc(void);
}

namespace BestComImpl
{
    void PrettyFunc(void);
}

namespace ProgComImpl
{
    void SimpleFunc();
}

int main()
{
    BestComImpl::SimpleFunc();
    return 0;
}

void BestComImpl::SimpleFunc(void)
{
    std::cout << "BestCom이 정의한 함수" << std::endl;
    PrettyFunc(); // 동일한 네임스페이스
    ProgComImpl::SimpleFunc(); // 다른 네임스페이스
}

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

네임스페이스 중첩 가능

namespace Parent
{
    int num = 2;
    namespace Child
    {
        num = 3;
    }
}

Parent::num <- 2
Parent::Child::num <- 3

입출력에서의 namespace

std::cout

std::cin

std::endl

위의 세가지는 에 namespace 'std'에 선언된 요소들임.

using std::cout;
using std::cin;

위와 같이 using 키워드를 이용하여 선언하면, 풀네임으로 참조하지 않고 cout, cin 만 적어도 됨.

BUT 편리해보이지만 이름 충돌할 확률 증가.

namespace에 별칭 지정 가능.

namespace ABC = AAA::BBB::CCC;

범위지정 연산자로 지역변수와 전역변수 구별 가능

지역변수이름 == 전역변수이름 일 때 지역변수가 먼저임. 아래와 같이 사용하면 전역변수에 접근 가능.

::var <- 전역변수

Categories:

Updated: