Home [C++ 프로그래밍] 2강 - C++ 언어의 기초
Post
Cancel

[C++ 프로그래밍] 2강 - C++ 언어의 기초

💡해당 게시글은 방송통신대학교 이병래 교수님의 'C++ 프로그래밍' 강의를 개인 공부 목적으로 메모하였습니다.



학습 개요


  • C++ 언어는 C 언어를 바탕으로 하여 객체 지향 프로그래밍을 위한 구문을 제공함
  • 그러므로 대부분의 문법이 C와 동일하지만, 조금 다른 부분이나 추가된 문법이 있음
  • C++ 언어의 기본적인 구문들에 대하여 개괄적으로 정리해 봄
  • C++ 언어의 단어(키워드, 식별자), 자료형, 변수와 상수, 연산자, 형 변환 등에 대해 다룸



학습 목표


  • C++의 문법에 맞게 식별자를 만들 수 있음
  • 기본 자료형의 값을 표현하고, 변수를 만들어 저장하는 표현을 활용할 수 있음
  • C++ 언어의 연산자를 사용하여 수식을 작성할 수 있음
  • 자료형 사이의 형 변환을 할 수 있음



주요 용어


  • 키워드(keyword)
    • C++ 언어에서 미리 용도를 정해 놓은 단어
  • 변수
    • 프로그램이 실행되는 동안 기억하고 있어야 하는 값들을 저장하기 위해 자료형과 이름이 지정된 메모리 영역
  • 사용 영역(scope)
    • 이름이 유효성을 갖는 영역
  • 지역 변수
    • 프로그램의 소속 블록 안에서만 사용될 수 있는 변수
  • 형 변환
    • 값의 자료형을 다른 자료형으로 변환하는 것으로, 자료형의 변환은 묵시적 또는 명시적으로 지정 가능



강의록


키워드와 식별자

키워드

  • 키워드(keyword)
    • C++ 언어에서 미리 용도를 정해 놓은 단어
    • 반드시 정해진 용도로만 사용해야 함
  • 키워드의 예

    1
    2
    3
    4
    5
    6
    7
    8
    
      #include <iostream>
      using namespace std;
        
      int main()
      {
          cout << "나의 첫 번째 C++ 프로그램" << endl;
          return 0;
      }
    
    • using namespace
    • int
    • return

식별자

  • 식별자(identifier)
    • 여러 가지 대상을 구분하기 위해 만든 이름
      • 변수나 함수, 클래스 등의 이름
  • 식별자를 만드는 규칙
    • 첫 자는 비 숫자 문자를 사용함(C++11부터 다국어 문자 포함)
      • 비 숫자 문자
        • 영문 대,소문자와 _(MS C++에서는 $ 포함)
    • 이후의 문자는 비 숫자 문자와 숫자를 사용함(특수 문자 사용 불가)
    • 길이 제한 없음
    • 키워드는 식별자로 사용 불가
    • _문자로 시작하는 이름 사용하지 않는 것이 바람직함
  • 적절한 식별자
    • myname
    • my_name
      • Snake case
    • myName
      • Camel case
    • MyName
      • Pascal case
    • a3
    • VALUE
    • Int
    • initial_value
    • 합계
      • C++11 이후
    • $price
      • MS C++
  • 사용할 수 없는 식별자의 예
    • 4days
    • my name
    • my#name
    • int
    • initial-value
    • min:value

기본 자료형 및 상수와 변수

C++의 자료형

  • 기본 자료형
    • C++ 에서 기본적으로 제공하는 하나의 값을 지정하는 자료형
    • 정수 자료형
      • char
      • int
      • short
      • long
      • bool
    • 실수 자료형
      • float
      • double
      • long double
  • 복합 자료형
    • 여러 개의 데이터를 모아서 사용할 수 있는 자료형
    • 배열, 구조체(struct), 클래스(class), 열거형(enum), 공용체(union)
    • 포인터, 참조

C++의 기본 자료형

  • 정수형 자료형(integral types)
    • 고정 소수점(fixed-point) 방식의 숫자 표현
      • 오버플로(overflow)가 발생하지 않도록 주의해야 함
    • 문자를 표현하는 자료형
      • signed/unsigned
      • char
    • 정수를 표현하는 자료형
      • signed/unsigned
        • signed
          • 부호 있음
          • 양수, 음수 둘 다 표현 가능
        • unsigned
          • 부호 없음
        • 양수만 표현 가능
      • int, short, long, long long
        • intshortlonglong long
        • int32bit
        • short16bit
        • long32bit
    • 참/거짓을 표현하는 자료형
      • bool
        • true(참)
        • false(거짓)
    • 다국어 표현을 위한 자료형
      • wchar_t
      • char16_t
      • char32_t
  • 실수 자료형
    • 부동 소수 점(floating-point) 방식의 숫자 표현
      • 부동 소수점
        • 소수점의 위치가 움직일 수 있음
      • 부동 소수점 방식의 숫자 표현
        • 123 = 12.310^1 = 1.2310^2
    • float (4byte)
      • 부호 1비트, 지수 부 8비트, 가수 부 23 비트로 구성
      • 1.17549×10^-38 ~ 3.40282×10^38 범위의 값을 표현
        • numeric_limits<float>::min()
        • numeric_limits<float>::max()
        • <climits>헤더 파일 include 시 float에 대해 가장 작은 값, 큰 값 확인 가능
    • double (8byte)
      • 부호 1비트, 지수 부 11비트, 가수 부 52비트로 구성
      • 2.22507 * 10⁻ ³⁰⁸ ~ 1.79769 * 10³⁰⁸ 범위의 값을 표현함
        • numeric_limits<double>::min()
        • numeric_limits<double>::max()

상수의 표현 - 리터럴(iteral)

  • 정수형 리터럴의 표현
    • 숫자를 표현하는 문자와 부호 만으로 표현됨
      • 숫자를 표현하는 문자
        • 0 ~ 9 까지의 숫자
        • 10 ~ 15에 해당되는 16진수를 표현하기 위한 문자 a ~ f와 A ~ F
    • 접두사를 이용한 진법의 표현

      표현의미
      15910진수 int형 상수
      0b100111112진수 int형 상수
      02378진수 int형 상수
      0x9f16진수 int형 상수
    • 접미사를 이용한 정수 리터럴의 자료형 지정

      표현자료형
      123int형
      123uunsigned int형
      123Llong 형
      123ulunsigned long 형
      123lllong long 형
  • 문자 리터럴의 표현

    표현자료형
    ‘A’문자 ‘A’ (ASCII 코드에 해당되는 정수 65와 동일)
    ‘\101’‘A’와 동일함(65의 8진수 표현)
    ‘\x41’‘A’와 동일함(65의 16진수 표현)
    • 작은 따옴표(‘ ‘) 안에 문자를 표기하는 방법
    • 8진수나 16진수 문자 코드로 표기하는 방법
  • 실수 형 리터럴의 표현

    표현자료형
    1200., 1200.0, 12e2, 1.2e+3double형 값 1200
    1200.0f, 12e2ffloat형 값 1200
    • 소수점이 있거나 10의 거듭 제곱을 표현하기 위한 지수 기호인 e가 있으면 실수형 리터럴임

변수

  • 변수
    • 프로그램이 실행되는 동안 기억하고 있어야 하는 값들을 저장하는 메모리 영역
    • 변수에는 자료형과 이름이 지정되어야 함
    • 모든 변수는 사용하기 전에 미리 선언해야 함
    1
    2
    3
    
      int korScore, mathScore;
      cin >> korScore >> mathScore;
      float avrScore = (korScore + mathScore) / 2.0f;
    
    • int
      • 자료형
    • korScore, mathScore;
      • 변수의 이름
    • float avrScore
      • 사용하기 전에 선언하면 됨
  • 변수의 초기화

    1
    
      int total = 0;
    
    1
    
      int total(0);
    
    1
    
      int x(131070.5); // x ← 131070 : 오차 발생
    
    1
    
      short y(x); // x ← -2 : 오버플로 발생
    

    Untitled

    1
    
      int total{0};
    
    1
    
      short a{total}; // 오류: 축소 변환
    
    1
    
      float b{total}; // 오류: 축소 변환
    
  • 자료형 추론
    • 변수를 초기화할 때 초기화하는 값의 자료형으로 변수의 자료형을 추론

      1
      
        auto i(10); // int i(10); 과 동일함
      
  • 변수의 사용 영역(scope)
    • 변수가 유효성을 갖는 영역
      • s1.cpp

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        
          int a; // 선언된 이후 프로그램의 전체 영역에서 사용 가능 - 비 지역 변수(non-local variable)
          static int b{10}; // 선언된 이후 소속 파일의 전체 영역에서 사용 가능 - 비 지역 변수(non-local variable)
                    
          int f() {
              int c{20}, d{30}; // 선언된 이후 소속 블록의 전체 영역에서 사용 가능 - 지역 변수(local variable)
              {
                  int d{40}; // 선언된 이후 소속 블록의 전체 영역에서 사용 가능 - 지역 변수(local variable), 이름 가리기
                  int e{50}; // 선언된 이후 소속 블록의 전체 영역에서 사용 가능 - 지역 변수(local variable)
              }
          }
        
      • s2.cpp

        1
        2
        3
        4
        5
        
          extern int a; // 다른 소스 파일에서 존재하는 변수 사용 = s1.cpp 의 a 변수
          static int b{50}; // 해당 소스 파일에서만 사용 가능 s1.cpp b 변수 != s2.cpp b 변수
          int g() {
                    
          }
        

constconstexpr

  • const한정어
    • 변수의 값을 수정할 수 없게 함
    • 초기화를 통해서만 값을 정할 수 있음

      1
      
        const double PI {3.14159}; // 원주율 정의
      
      1
      2
      
        #define PI 3.14159
        // 매크로 상수 정의 - 단순 치환
      
  • constexpr한정어
    • 그 값을 컴파일할 때 평가한다는 의미
    • 실행 중 값을 평가하는 것에 비해 효율적으로 동작할 수 있게 함

      1
      2
      3
      4
      5
      6
      7
      
        int a;
        std::cin >> a;
        const int b = 20;
        const int C1 = a; // cin을 통해 입력된 a의 값으로 초기화
        constexpr int C2 = a + 10; // 오류: 컴파일 시에 a의 값을 알 수 없음
        constexpr int C3 = b + 100; // b + 100을 컴파일 시에 계산할 수 있음
        constexpr int C4 = C1 * 2; // 오류: 컴파일 시에 C1의 값을 알 수 없음
      
    • 모든 인수가 constexpr인 경우 컴파일할 때 값을 구할 수 있게 함

      1
      2
      3
      4
      5
      6
      7
      8
      
        constexpr int fac(int n) {
            return n > 1 ? n * fac(n - 1) : 1;
        };
              
        void f(int x) {                     
            constexpr int a = fac(4); // 컴파일할 때 계산
            int b = fac(x); // 실행 중 계산
        };
      

변수의 유효 기간

  • 변수의 유효 기간(lifetime)
    • 변수가 언제 만들어져서 언제 없어지는가를 나타냄
      • 자동 변수
        • 생성 시점
          • 함수(블록)가 시작될 때
        • 소멸 시점
          • 함수(블록)가 종료될 때
      • 정적 변수
        • 생성 시점
          • 프로그램이 시작될 때
        • 소멸 시점
          • 프로그램이 종료될 때
      1
      2
      3
      4
      5
      6
      
        int x; // 전역 변수 - 정적 유효 기간
              
        int f() {
            int y{10}; // 지역 변수 - 자동 유효 기간
            static int z{0}; // 정적 지역 변수 - 정적 유효 기간
        }
      

변수와 상수 사용

  • CircleArea.cpp

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
      #include <iostream>
      using namespace std;
        
      int main( )
      {
          const double PI {3.14159};
          double radius;
    
          cout << "원의 반경을 입력하시오 : ";
          cin >> radius;
          double area = radius * radius * PI;
          cout << "원의 면적 = " << area << endl;
          return 0;
      }
    

연산자

산술 연산자

  • 2항 연산자
    • 사칙 연산자
      • +, -, *, /
      수식수식의 값
      5 + 38
      3 / 21
      3.0 / 2.01.5
    • 나머지 연산자
      • %
      수식수식의 값
      5 % 32
      -5 % 3-2
      5 % -32
      -5 % -3-2
  • 단항 연산자
    • 증, 감 연산자
      • ++, --
      수식(a = 10일 때)a의 값b의 값
      b = ++a;1111
      b = a++;1110
      b = --a;99
      b = a--;910
    • 부호 연산자
      • +, -

대입 연산자

  • 대입 연산자(=)
    • 수식의 값
      • 저장 된 결과
    • 연산자의 결합 방향
      • 우 → 좌
    수식(a는 double형, b는 int형)실행 결과
    a = 0;a ← 0
    a = b = 0;b ← 0, a ← 0
    a = b = 1.5;b ← 1, a ← 1
  • 복합 대입 연산자
    • 이항 연산자와 대입 연산자를 결합
    • +=, -=, *=, /=, %=, <<=, >>=
    수식실행 결과
    a += b;a = a + b;와 동일

관계 연산자

  • 관계 연산자
    • >, <, >=, <=, ==,
    수식(a = 10, b = -5)수식의 값
    a > btrue
    a == 5false

논리 연산자

  • 논리 합 ||, 논리 곱 &&, 부정 !

    수식(a = 10, b = -5)수식의 값
    a > 0 && b > 0false
    a > 0 || b > 0true
    a < 0 && --b < 0false, b는 -5
    !(a > 0)false

비트 단위 연산자

  • 비트 단위 논리 연산자
    • 논리 합 |, 논리 곱 &, 배타적 논리 합 ^, 부정 ~
    수식(x = 0x35(0011 0101), y = 0xf0(1111 0000))수식의 값
    x | y0xf5 (1111 0101)
    x & y0x30 (0011 0000)
    x ^ y0xc5 (1100 0101)
    ~x0xca (1100 1010)
  • 비트 이동 연산자
    • 좌측 이동 (<<)

      1
      2
      
        unsigned char x = 0b00011101; // 29
        unsigned char y = x << 2;
      

      Untitled

      • 우측 피 연산자에 지정된 비트 수만큼 좌측 피 연산자를 좌측으로 이동
      • 우측의 비는 비트에는 0이 채워짐
      • 왼쪽으로 두 비트 이동 시 2의 제곱을 곱한 값과 같은 결과를 가짐
    • 우측 이동 (>>)

      1
      2
      
        char x = 0b10010100; // -108
        char y = x >> 2;
      

      image.png

      • 우측 피 연산자에 지정된 비트 수만큼 좌측 피 연산자를 우측으로 이동
      • signed 형에 대해서는 부호를 유지할 수 있도록 부호 비트가 좌측의 비는 비트에 채움(구현에 따라 다름)
      • 오른쪽으로 두 비트 이동 시 2의 제곱을 나눈 값과 같은 결과를 가짐

조건 연산자

  • 유일한 3항 연산자

    수식 ( a = 10, b = 20, c = 30)수식의 값
    a > 0 ? b : c20
    • 조건 ? 값1 : 값2
      • 조건이 true이면 수식의 값은 값1, false이면 값2

자료형의 변환

묵시적 형 변환

  • 묵시적 형 변환 개요
    • 두 값 사이의 연산에서는 우선 순위가 낮은 자료형의 값이 순위가 높은 자료형의 값과 같은 형으로 변환됨
    • 여러 개의 연산으로 구성된 수식에서 묵시적 형 변환은 연산자 단위로 이루어짐
    • 대입 연산자(=)는 값을 저장할 변수의 자료형으로 묵시적 형 변환을 함
      • 오차나 오버플로가 발생할 수 있으므로 주의해야 함
  • 묵시적 형 변환의 예

    image.png

명시적 형 변환

  • 형 변환 연산자
    • static_cast
      • 연관 된 자료형 간의 형 변환을 처리하며, 변환 처리는 컴파일 단계에서 정해짐
    • dynamic_cast
      • 기초 클래스와 파생 클래스 간의 포인터 또는 참조 형 변환이 프로그램 실행 중에 일어나도록 지시함
    • reinterpret_cast
      • 관련이 없는 자료형 사이의 변환을 처리하는 연산자로, 포인터를 다른 자료형의 포인터나 정수 자료형으로, 또는 그 역으로 변환
    • const_cast
      • const지정을 일시 해제함
  • 형 변환 연산자 사용 형식

    image.png



연습 문제


  1. 다음 중 부동 소수 점 표현 방식의 수는?

    a. 123e4

    • e는 부동 소수 점 수의 지수 부 값을 나타내기 위한 기호로 사용되므로 123.0×10^4을 나타내는 부동 소수 점 수
    • 123
      • 10진수
    • 0x24
      • 16진수
    • 0123
      • 8진수 정수(고정 소수 점)
  2. 위 지문에서 문장의 결과 a에 저장 되는 값은?

    1
    2
    3
    
     int x = 5, y = 2;
     double a, z=10.0;
     a = z + x / y;
    

    a. 12.0

    • x와 y는 int형이므로 x / y는 정수 연산이 이루어지며, 그 결과는 2이고 이 값을 z의 10.0과 더하므로 결과는 12.0임
  3. 위 지문의 프로그램에서 (가)와 (나)의 의미에 대한 설명으로 옳은 것은?

    1
    2
    3
    4
    5
    6
    
     constexpr int f(int x) { return x * x; }
     void g(int a) {
         constexpr int b = f(10); // (가)
         const int c = f(a); // (나)
         // (다)
     }
    

    a. (가)는 f(10)의 값을 컴파일할 때 계산한다.

    • constexpr함수는 모든 인수가 constexpr인 경우 컴파일할 때 값을 구할 수 있게 함
  4. 위 지문에서 변수 x, y가 모두 unsigned char 형이다. x의 하위 4비트는 변하지 않고 상위 4비트만 모두 0으로 만들려고 한다. y에는 어떠한 값을 가지고 있어야 하는가?

    1
    
     x &= y;
    

    a. 0x0f

    • y의 어떤 비트가 0이면, AND 결과에서 그 자리(x의 해당 비트)는 무조건 0이 됨
    • y의 어떤 비트가 1이면, 원래 x 값이 전달됨
    • 위 수식은 x = x & y;와 같음
      • &는 비트 단위 논리 곱 연산자임
      • 어느 비트의 값이 a일 때 a & 0은 a의 값에 관계없이 0임
      • 반면 a & 1은 a가 0이면 0, 1이면 1임
      • 즉, a & 1은 a와 같음
      • 그러므로 x의 값에서 0으로 지우고 싶은 비트는 0, 그대로 두고 싶은 비트는 1이 y에 들어 있다면 x의 원하는 비트를 0으로 지울 수 있음
      • 하위 4비트는 변하지 않고 상위 4비트만 0으로 만들려고 하므로 y는 2진수 00001111, 즉 16진수 0x0f를 저장하고 있으면 됨
  5. 다음의 변수 선언문 중 오류가 있는 것은?

    a. int d{1.5};

    • 1.5가 double이므로 int형 변수를 초기화하려면 축소 형 변환이 필요하여 오류임
    • 변수 선언문 중 옳은 것은?
      • int a = 100;
        • 필요하다면 묵시적 형 변환을 통해 변수가 초기화 됨
      • float b(20.0);
        • 필요하다면 묵시적 형 변환을 통해 변수가 초기화
      • int c = {200};
        • 초깃 값으로 사용된 수식에 대해 축소 형 변환이 일어나면 안 됨
  6. 위 지문 중 소스 파일에서 변수의 값을 수정하지 않았을 경우 (가) 영역에서 사용할 수 있는 변수와 그 값을 모두 올바르게 나열한 것은?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
     int a;
     static int b{10};
        
     int f() {
         int c{20}, d{30};
         {
             int d{40};
             int e{50};
         }
         // ······    // (가)
     }
    

    a. a:0, b:10, c:20, d:30

    • (가)를 포함하는 블록에 선언된 c와 d, 함수 f()의 앞에 선언된 a와 정적 변수 b를 모두 사용할 수 있으며, 함수 f()에 내포된 블록에 선언된 d와 e는 그 블록 안에서만 존재하며, (가)에서는 사용할 수 없음



정리 하기


  • C++에서 사용하는 단어는 반드시 정해진 용도로 사용하도록 지정된 키워드와 프로그램 내에서 여러 가지 대상을 구분하기 위해 만드는 식별자가 있음
  • 문자, 정수, 참/거짓, 실수를 표현하는 기본 자료형과 복합 자료형을 사용할 수 있음
  • 값을 저장하기 위해 사용하는 변수는 사용하기 전에 자료형과 이름을 미리 선언해야 함
  • 블록 안에 선언된 변수는 소속된 블록에서만 사용할 수 있는 지역 변수임
  • const한정어는 변수의 값을 변경할 수 없게 하며, constexpr한정어는 변수나 함수의 값을 컴파일할 때 평가할 수 있게 할 수 있게 함
  • 지역 변수는 자동 유효 기간, 전역 변수 및 정적 지역 변수는 정적 유효 기간을 갖음
  • 연산자는 산술, 논리, 관계, 비트 단위 논리, 대입 등의 처리를 하는 데 사용
  • 서로 다른 자료형이 연산에 사용될 경우 우선순위가 높은 자료형으로, 대입 연산의 경우 값을 저장할 변수의 자료형으로 묵시적 형 변환이 일어남
  • 형 변환 연산자를 이용하여 명시적으로 자료형을 변환할 수 있음

[C++ 프로그래밍] 1강 - C++ 언어의 소개

[C++ 프로그래밍] 3강 - C++ 언어의 기초