C++ 프로그래밍 - 02 C++ 언어의 기초(1)

Wonil Jang·2024년 8월 27일

컴퓨터과학

목록 보기
6/12
post-thumbnail

C++ 언어의 기초 (1)

1. 키워드와 식별자

  1. 키워드, Keyword

    • c++ 언어에서 미리 용도를 정해 놓은 단어
    • 반드시 정해진 용도로만 사용해야 함
    • 예약어 reserved word라고도 한다.
    • 키워드의 예
      #include <iostream>
      /*
        아래 코드에서 
        using, namespace, int, return 이 키워드에 해당됨
      */
      using namespace std;
      int main() {
        cout << "first step" << endl;
        return 0;
      }
  2. 식별자, Identifier

    • 여러가지 대상을 구분하기 위해 만든 이름

      • 변수나 함수, 클래스 등의 이름
    • 식별자를 만드는 규칙

      • 첫자는 비 숫자 문자를 사용 (c++11부터 다국어 문자 포함)
        • 비 숫자 문자: 영문 대/소문자와 _ (※ MS C++에서는 $ 포함)
        • _ 또는 __ 문자로 시작하는 식별자는 C++의 구현 환경에 따라 특수한 용도로 활용하기 위해 이미 예약되어 있을 가능성이 있다. 따라서 사용 지양
      • 이후의 문자는 비 숫자 문자와 숫자를 사용 (특수문자 사용 불가)
      • 길이 제한 없음
      • 키워드는 식별자로 사용할 수 없음
    • 적절한 식별자의 예

        myname 
        my_name // snake_case
        myName // camelCase 
        MyName // PascalCase
        a3 
        VALUE
        Int 
        initial_value
        합계 (c++11 이후) $price (MS C++)

      *실무에서는 코딩 컨벤션을 만들어 상황에 따라 선택해서 사용하지만 주로 camelCase를 사용함

    • 사용할 수 없는 식별자의 예

        4days my name my#name int
        intial-value  min:value

2. 기본 자료형 및 상수와 변수

  1. C++의 자료형

    1. 기본 자료형

      • 기본 자료형이란?
        • 데이터를 표현하기 위한 기본적인 표현 형식
      1. 정수 자료형
        • char, int, short, long, bool 등
      2. 실수 자료형
        • float, double, long double
    2. 복합 자료형

      • 배열, 구조체(struct), 클래스(class), 열거형(enum), 공용체(union)
      • 포인터, 참조(C++에서 추가)
  2. C++의 기본 자료형

    1. 정수 자료형, Integral type
      • 고정소수점(fixed-point) 방식의 숫자 표현
        • 소수점이 특정 위치에 있다고 가정하는 자료형, 정수 자료형은 소수점 왼쪽의 숫자만 표현, 말 그대로 정수만 표현
        • 오버플로(overflow)가 발생하지 않도록 주의해야 함
        1. 문자를 표현하는 자료형
          • char
          • 일반적으로 1byte(8bit)로 문자를 표현
        2. 정수를 표현하는 자료형
          • int
          • short
          • long
          • long long
        • 문자, 정수를 표현하는 자료형은 부호 표현 가능
          • signed: 부호 표현
          • unsigned: 양수만 표현
        1. 참/거짓을 표현하는 자료형
          • bool: true(참) 또는 false(거짓) 저장
        2. 다국어 표현을 위한 자료형
          • wchar_t, char16_t, char32_t
    2. 실수 자료형
      • 부동소수점(floating-point) 방식의 숫자 표현
      • float (4byte)
        • 부호 1비트, 지수부 8비트, 가수부 23비트로 구성
        • 1.17549 x 10⁻³⁸ ~ 3.40282 x 10³⁸ 범위의 값을 표현함
          (numeric_limits::min(), numeric_limits::max())
      • double (4byte)
        • 부호 1비트, 지수부 11비트, 가수부 52비트로 구성
        • 2.22507 x 10⁻³⁰⁸ ~ 1.79769 x 10³⁰⁸ 범위의 값을 표현함
          (numeric_limits::min(), numeric_limits::max())
  3. 상수의 표현 - 리터럴(literal)

    • 리터럴이란?
      • 기본 자료형의 값을 직접 표현하는 방식
      • 리터럴은 그 값을 프로그램에서 변경할 수 없으므로 상수에 해당
    1. 정수형 리터럴의 표현

      • 숫자를 표현하는 문자와 부호만으로 표현됨

        • 숫자를 표현하는 문자
          • 0~9까지의 숫자
          • 10~15에 해당되는 16진수를 표현하기 위한 문자 a~f와 A~F
      • 접두사를 이용한 진법의 표현

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

        표현의미
        123int형
        123uunsigned int형
        123Llong형
        123ulunsigned long형
        123lllong long형
    2. 문자 리터럴의 표현

      • 작은 따옴표('')안에 문자를 표기하는 방법

      • 8진수나 16진수 문자 코드로 표기하는 방법

        표현의미
        'A'문자 'A' (ASCII 코드에 해당되는 정수 65와 동일)
        '\101''A'와 동일함 (65의 8진수 표현)
        '\x41''A'와 동일함 (65의 16진수 표현)
    3. 실수형 리터럴의 표현

      • 소수점이 있거나 10의 거듭제곱을 표현하기 위한 지수 기호인 e가 있으면 실수형 리터럴임

        표현의미
        1200., 1200.0, 12e2, 1.2e+3,double형 값 1200
        1200.0f, 12e2ffloat형 값 1200
  4. 변수

    1. 변수란?

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

      • 불필요한 값이 들어있지 않게 변수를 만들 때 지정된 값을 할당하는 것

        int total = 0; // 형식 1
        int total(0)  // 형식 2
        
        // 초기화 오류
        int x(131070.5)  // 오류 1
        short y(x); // 오류 2
        
        int total{0}; // 형식 3

        *초기화 오류

        1. 오류 1
          x 변수를 초기화하기 위해 131070.5란 값을 할당했는데 x는 int 자료형이고 131070.05는 double 자료형이므로 실제 x에 할당되는 값은 131070으로 축소가 된다. 따라서 .05라는 오차가 생겨 오류 발생
        2. 오류 2
          초기화된 x의 값을 y변수에 할당하여 초기화하였는데 x의 자료형은 int이고 y는 short다. int 자료형은 32비트의 저장 공간을 가지고 있고 short 자료형은 16비트의 저장 공간을 가지고 있다. 따라서 y변수에 32비트의 x값을 다 할당하지 못하고 초과(오버플로)하여 발생하는 오류
    3. 자료형 추론

      • 변수를 초기화할 때 초기화하는 값의 자료형으로 변수의 자료형을 추론함
        auto i(10); // int i(10); 과 동일
    4. 변수의 사용 영역(scope)

      • 변수가 유효성을 갖는 영역
      // s1.cpp
      // 비 지역변수(non-local variable)
      int a; // 선언된 이후 프로그램의 전역에서 사용 가능
      static int b{10}; 
      int f() {
        int c{20}, d{30}; // 선언된 이후 소속 블록의 전체 영역에서 사용 가능
        {
          int d{40}; // 선언된 이후 소속 블록의 내부 영역에서 사용 가능, 지역 변수(local variable)
          int e{50};
          .
          .
        }
      }
      
      // s2.cpp
      extern int a; // extern이란 키워드를 사용하면 s1.cpp파일 내부에 있는 int a 변수를 가지고 온다.
      static int b{50};
      int g() {
        ...
      }
      • static 키워드를 사용하여 선언된 변수는 해당 파일 내부에서만 사용 가능
      • f함수의 내부에 d변수가 선언되어있지만 새로운 {}, block을 생성하고 해당 블록 내부에 d변수를 새로 선언하였을 경우 해당 블록 내부에선 새로 선언한 d변수는 사용 가능하지만 f함수의 d변수를 사용하지 못한다. 이를 이름가리기라고 한다.
      • 다른 파일에서 선언된 변수를 extern 키워드를 사용하여 가져와 사용할 수 있다.
    5. const 한정어

      • const를 사용하여 선언한 변수는 값을 재할당할 수 없다.
      • 초기화를 통해서 할당한 값만 사용할 수 있다.
      const double PI {3.14159};
    6. constexpr 한정어

      • 값을 컴파일할 때 평가한다는 의미
      • 실행 중 값을 평가하는 것에 비해 효율적으로 동작할 수 있게 한다.
      int a;
      std::cin >> a;
      const int b = 20;
      const int C1 = a; // cin을 통해 입력된 a의 값으로 초기화
      constexpr int C2 = a + 10; // 오류1: 컴파일 시 평가하기로 요청했지만 a는 사용자의 입력을 받아 할당하는 값이므로 컴파일 과정에서 오류가 난다.
      constexpr int C3 = b + 100; // b + 100을 컴파일 시에 계산할 수 있음 
      constexpr int C4 = C1 * 2 // 오류: 오류1과 비슷한 상황으로 에러
    7. constexpr 함수

      • 모든 인수가 constexpr인 경우 컴파일할 때 값을 구할 수 있게 한다.
      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); // 실행 중 계산 
      }
    8. 변수의 유효기간

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

        정적 지역변수
        기존 유효기간에선 f함수가 종료되는 시점에 y와 z 변수는 소멸되어야하는데 z 변수는 static 키워드를 사용하여 선언을 함으로써 할당되어있는 값을 보존하고 f함수가 다시 실행되었을 때 보존한 z변수의 값을 다시 재사용한다.

    9. 변수와 상수 사용 예제

      // CircleArea.cpp
      #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;
      }
  5. 연산자

    1. 2항 연산자

      • 2개의 피연산자를 사용하는 연산자

      • 사칙 연산자: +, -, *, /

        수식수식의 값
        5 + 38
        3 / 21
        3.0 / 2.01.5
      • 나머지 연산자: %

        수식수식의 값
        5 % 32
        -5 % 3-2
        5 % -32
        -5 % -3-2
    2. 단항 연산자

      • 피연산자가 하나인 연산자
      1. 증, 감 연산자: ++, --

        • 전위표기: 변화된 값이 수식의 값
        • 후위표기: 원래의 값이 수식이 값
      2. 부호 연산자: +, -

        • 양/음수의 값
    3. 대입 연산자(=)

      • 수식의 값: 저장된 결과

      • 연산자의 결합 방향: 우 -> 좌

        수식수식의 값
        a = 0;a = 0
        a = b = 0;b = 0, a = 0
        a = b = 1.5b = 1, a = 1

        *a는 double형, b는 int형일 떄

    4. 복합 대입 연산자

      • 이항 연산자와 대입 연산자를 결합

      • +=, -=, *=, %=, <<=, >>=

        수식수식의 값
        a += b;a = a + b 와 동일
    5. 관계 연산자

      • >, <, >=, <=, ==, !=

        수식수식의 값
        a > btrue
        a == 5false

        *a = 10, b = -5일때

    6. 논리 연산자

      • 논리 합 ||, 논리 곱 &&, 부정 !
      • 논리 곱의 경우 앞의 연산이 거짓일 경우 뒤의 연산으로 넘어가지 않는다.
      • 논리 합의 경우 앞의 연산이 참일 경우 뒤의 연산으로 넘어가지 않는다.
    7. 비트 단위 논리 연산자

      • 비트 단위로 계산이 필요할 떄 사용하는 연산자
      • 논리 합 |, 논리 곱 &, 배타적 논리 합 ^, 부정 ~
      • 논리 합: 피연산자가 둘 중 하나라도 참일 경우 참으로 연산
      • 논리 곱: 피연산자가 둘 중 하나라도 거짓일 경우 거짓으로 연산
      • 배타적 논리 합: 피연산자가 서로 값이 같지 않을 경우 참으로 연산
      • 부정: 피연산자의 값을 반전시킨다.
    8. 비트 이동 연산자

      1. 좌측 이동 (<<): 우측 피연산자에 지정된 비트 수만큼 좌측 피연산자를 좌측으로 이동
        • 우측의 비는 비트에는 0이 채워진다.
      unsigned char x = 0b00011101; // 29
      unsigned char y = x << 2;
      // y = 01110100
      1. 우측 이동 (>>): 우측 피연산자에 지정된 비트 수만큼 좌측 피연자를 우측으로 이동
        • signed 자료형에 대해서 부호를 유지할 수 있도록 부호 비트가 좌측의 비는 비트에 채움(구현에 따라 다름)
        char x = 0b10010100; // -108
        char y = x >> 2;
        // y = 11100101, -27
    9. 유일한 3항 연산자

      • 조건 ? 값 1 : 값 2
        • 조건이 참이면 수식의 값은 값, 거짓이면 값2
  6. 자료형의 변환

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

        정수 자료형의 변환 순위
        bool < char < short int < int < long int < long long int
        signed와 unsigned 자료형은 동일 함

      • 묵시적 형 변환의 예
      intVar = doubleVar + intVar * floatVar;
      • intVar * floatVar 연산에서 float이 우선 순위가 더 높으므로 intVar 변수는 float으로 형 변환 발생
      • doubleVar와의 연산에선 double이 우선 순위가 더 높으므로 float으로 형 변환된 변수는 다시 double 자료형으로 형 변환 발생
      • double로 형 변환이 발생한 값이 할당되는 변수는 int 자료형의 변수로 double 형으로 변환된 값은 최종적으로 int 자료형으로 변환되어 할당 된다.
    2. 형 변환 연산자
      1. static_cast: 연관된 자료형 간의 형 변환 처리, 변환 처리는 컴파일 단계에서 정해진다.
      2. dynamic_cast: 기초 클래스와 파생 클래스 간의 포인터 또는 참조 형 변환이 프로그램 실행 중에 일어나도록 지시한다.
      3. reinterpret_cast: 관련이 없는 자료형 사이의 변환을 처리하는 연산자로, 포인터를 다른 자료형의 포인터나 정수 자료형으로, 또는 그 역으로 변환한다.
      4. const_cast: const 지정을 일시 해제한다.
profile
아 좀 신나고 싶네! XD

0개의 댓글