본문 바로가기

C++

Chapter 1. C++의 개요

Chapter 1. C++의 개요
1. C++
 - C++는 C언어를 확장시킨 언어로 C언어의 기능 및 문법을 모두 포함할 뿐 아니라 일부 문법을 사용하기 편하게 개선시킨 언어이다.
 - C언어는 절차지향인 반면, C++는 객체지향 언어이다.
 - C언어와 다른 C++의 특징
  ‧ C++ 확장자 : .cpp(C언어 : .c)
  ‧ 함수 중간에 변수 선언이 가능
  ‧ 표준 입출력 라이브러리 : iostream(C언어 : stdio.h)
  ‧ 출력 함수 : std::cout(C언어 : printf)
  ‧ 입력 함수 : std::cin(C언어 : scanf)

 

2. C++에서의 입출력
 - C++에서의 입출력 라이브러리
  ‧ C++에서는 iostream이라는 라이브러리를 표준 입출력 라이브러리로 사용하고 있으며 헤더파일 확장자인 .h를 붙이지 않는다.
 - cout

 std::cout <<      ;

  ‧ C++에서의 출력함수로 C언어에서의 printf의 역할을 한다.
  ‧ 왼쪽 쉬프트 연산자(<<)뒤에 있는 문자, 문자열 또는 변수의 값을 출력하며 출력하고자 하는 값의 타입이 다를 때는 중간에 왼쪽 쉬프트 연산자(<<)를 구분자로 사용해 출력시킨다.

  ‧ printf와는 다르게 서식문자를 사용하지 않고 사용하기 때문에 데이터 타입에 따라 출력되며 만약 다른 타입으로 출력하고 싶거나 주소값을 출력하기 위해서는 형변환이 필요하다.

 - cin

 std::cin >> var;

  ‧ C++에서의 입력함수로 C언어에서의 scanf의 역할을 한다.
  ‧ 오른쪽 쉬프트 연산자(>>)뒤에 있는 변수에 값을 입력받으며 scanf와는 다르게 변수에 Ampersand 연산자(&)를 사용하지 않는다.
  ‧ 입력받고자 하는 변수가 여러 개일 경우 구분점으로 오른쪽 쉬프트 연산자(>>)를 사용한다.
 - endl

 std::endl;

  ‧ cout과 같이 사용되는 함수로 줄개행 기능과 출력버퍼를 비워주는 기능이 같이 포함되어 있다.
  ‧ cout이 앞에 없으면 사용이 되지 않고 컴파일에러가 출력된다.
 - cout과 cin의 특징
  ‧ 타입에 관계없이 자체적으로 데이터 타입을 판단해 입출력이 가능하다.
  ‧ 서식문자와 Ampersand 연산자(&)를 사용하지 않는다.(출력의 경우 주소값을 출력할 때는 Ampersand 연산자(&)사용)
  ‧ 실수는 유효 자릿수까지 출력하며 경우에 따라 지수 형태로 출력할 때도 있다.
  ‧ char형 포인터의 경우 입력 시 주소부터 차례대로 문자열을 저장한 후 맨 뒤에 널 문자(\0)를 자동으로 추가해주며 출력 시 주소부터 널 문자(\0) 이전의 문자열만 출력한다.

  ‧ 오른쪽 쉬프트 연산자(>>)로 문자열 입력 시 공백 문자가 포함된 문자열을 받을 수 없으며(scanf와 동일)오른쪽 쉬프트 연산자(>>) 는 연속적인 데이터만을 받을 수 있기 때문에 공백을 입력의 끝으로 처리한다.

 

3. C++에서 추가된 기능
 - 함수 오버로딩(Function Overloading)

 void Func(void)
 {
         ……
 }
 void Func(int i)
 {
         ……
 }

  ‧ 같은 이름의 함수를 정의하는 것으로 이 기능으로 C++에서 함수의 다형성이 구현됐다.
  ◦  다향성 : 여러 가지 형태를 가질 수 있는 성질
  ‧ C언어에서는 오버로딩이 허용 되지 않는 반면, C++에서는 함수 호출시 전달되는 인자를 통해 함수를 구분하고 그에 맞는 함수를 호출이 가능해 오버로딩이 가능하다.

 - 디폴트 매개변수(Default Parameter)

 void Func(int n1, int n2=1)
 {
         ……
 }

  ‧ 함수 선언 시 매개변수에 값을 정해줘 기본 값을 만들어 주는 것이며 만약 함수 호출 시 매개변수 값을 넣어주지 않으면 함수에 기본 값으로 값이 전달된다.

  ‧ 하나의 함수가 마치 여러 일을 하는 것처럼 정의할 수 있어 디폴트 매개변수을 오버로딩에 사용할 수 있다.
  ‧ 함수를 선언 시 기본 값을 정해줄 때 오른쪽으로부터 차례대로 할당해야 하며 중간에 빈값을 두고 띄엄띄엄 할당해선 안 된다.
 - 이름 공간(namespace)

‧ 선언
 namespace NS
 {
         void Func(void)
         {
                  ……
         }
 }

‧ 호출

 NS::Func();

 

 

 

 

 

 

  ‧ 개체의 범위를 지정하는 기능을 가진 예약어로 주로 대형 프로젝트에서 함수나 변수의 이름 충돌을 막기 위한 도구로 사용된다.
  ‧ C++에서는 오버라이딩 개념이 추가 되어 있지 않아 같은 이름의 변수를 두 개 이상 선언할 시 컴파일 에러가 발생한다.
  ◦ 오버라이딩(Overriding) : 앞서 선언된 같은 이름의 함수나 변수가 있을 시 새로 선언된 함수나 변수로 대체 되는 것으로 함수는 이름과 매개변수 모두 같아야한다.

  ‧ cout, cin, endl 같은 경우 std라는 이름 공간에 선언된 함수라고 볼 수 있다.
  ‧ 이름 공간은 중첩해서 내부에 여러 개 선언할 수 있다.
  ‧ 이름 공간은 using 이라는 예약어를 통해 호출시 이름공간을 지정하지 않고 호출할 수 있다.
    ※ 범위 지정 연산자(::) : 범위를 지정해주는 연산자로 이 연산자가 붙은 함수나 변수의 범위는 전역으로 바뀌게 되며 범위 내에서 연산자 뒤에 오는 함수 이름이나 변수이름을 찾아 호출한다.        

  ‧ using

    선언
 using namespace NS
 {
         void Func(void)
         {
                   ……
         }
 }

    호출
 Func();

 

 

 

 

 

  ◦ 이름 공간을 생략해 호출하게 해줘서 불편함을 줄여준다.
  ◦ using을 여러 곳에 선언할 시 이름 공간간의 충돌이 발생할 수 있어 적절히 사용해야한다.
  ◦ 이름 공간을 중첩해 사용했을 시 가장 마지막의 콜론(:) 앞까지의 이름 공간을 생략해준다.
  ‧ 이름 공간 별칭

    선언
 namespace A
 {
         namespace B
         {
                  namespace C
                  {
                           int n;
                  }
         }
 }

 namespace ABC=A::B::C;

    호출
 ABC::num=1;

 

 

 

 

 

 

 

 

 

 

  ◦ using을 이용하지 않고 namespace를 이용해 새로운 이름을 지어 줄 수도 있다.
  ◦ using을 이용했을 때 충돌이 자주 일어날 수 있어 namespace를 사용할 때가 충돌을 피하는 방법이 될 때도 있다.
 - inline 함수

‧ inline
 inline int A(int n)
 {
         return n*n;
 }

‧ #define
 #define A(n) ((n)*(n))

 

 

 

  ‧ 매크로 함수의 단점을 보완한 함수로 간편하게 함수 데이터형 앞에 inline 예약어만 붙여주면 선언이 가능하다.
  ‧ 매크로 함수의 처리는 전처리기가 하지만 inlin 함수의 처리는 컴파일러가 한다.
  ‧ inline 함수 또한 매크로 함수처럼 치환을 이용하므로 호출 작업이 없기 때문에 처리속도가 빠르지만 전체 코드의 크기를 크게 만든다.
  ‧ 함수의 크기가 작은 경우에 선언해야하며 함수의 크기가 너무 큰 경우 컴파일러가 무시하기도 해 주의해 사용해야한다.
  ‧ 매개변수의 데이터형에 의존해 데이터 손실이 있다.
  ‧ 호출 과정
  ◦ 매개변수를 전달하기 위해 매개변수를 스택(stack) 영역에 저장한다.

  ◦ 호출한 곳으로 다시 돌아와야 하므로 함수 호출명령 바로 다음 명령의 주소를 스택(stack) 영역에 저장한다.
  ◦ 함수가 정의된 주소로 점프해 함수 코드를 치환해 수행한다.
  ◦ 저장해둔 주소로 복귀한다.
 - 데이터형 bool

 bool isPos1 = true;
 bool isPos2 = false;

  ‧ true false 값으로 참과 거짓 판별하는 1Byte 크기의 데이터형이다.
  ‧ 일반적으로 0은 false를 0이 아닌 숫자는 true로 지정되어 있으며 통상 true는 1로 되어 있다.
  ‧ C++에서는 true와 false라는 값이 새로 예약어로 생겨나 true false를 값으로 지정할 수 있다.

 

4. 참조자(Reference)

 int num1 = 1;
 int &num2 = num1;

 

 

 - 참조자
  ‧ 자신이 참조하는 변수를 대신할 수 있는 또 하나의 이름(별명)이다.
  ‧ 변수에 대한 참조자수는 제한이 없고 참조자를 대상으로 참조자를 선언할 수 있으며 배열에서도 사용가능하다.
    ※ 변수 : 할당된 메모리 공간에 붙여진 이름
 - 참조자와 함수
  ‧ Call-by-value : 값을 전달받아 리턴하는 형태의 함수
  ‧ Call-by-reference : 주소값을 전달받아서 함수 외부에 선언된 변수에 접근하는 형태의 함수

 - 참조자의 특징
  ‧ 참조자는 선언 시 Ampersand 연산자(&)를 사용해 선언한다.
  ‧ 선언과 동시에 초기화를 해야 하며 초기화를 하지 않을 시 쓰레기 값을 갖는다.
  ‧ 리터럴 상수는 참조자에 대입할 수 없다.