C++ Chapter 1.1 : C++의 기초 2

Date:     Updated:

카테고리:

태그:

변수

숫자 경계값

숫자의 경계값을 알아내는 것은 <limits>에서 제공하는 std::numeric_limits 클래스 탬플릿을 사용하는 것이 바람직하다.

    cout << "double:\n";
    cout << format("Max double value: {}\n", numeric_limits<double>::max());
    cout << format("Min double value: {}\n", numeric_limits<double>::min());
    cout << format("Lowest double value: {}\n", numeric_limits<double>::lowest());

    // double:
    // Max double value: 1.79769e+308
    // Min double value: 5355807e-308
    // Lowest double value: -1.9769e+308

정수에서는 최소값minimum value과 최저값lowest value이 같지만,
부동소수점에서는 최소값은 표현 가능한 가장 작은 양의 값인 반면, 최저값은 표현 가능한 가장 작은 음수(-max())다.

캐스트

변수의 타입은 실행 중에 바꿀 수 있다. 이를 캐스트Cast라 한다.

C++에서 변수의 타입을 명시적으로 변환하는 세가지 방법

    float myFloat { 3.14f };
    int i1 {(int)myFloat}; // C 언어에서 사용
    int i2 {int(myFloat)}; // 거의 사용 X
    int i3 { static_cast<int>(mtFloat)}; // 가장 권장하는 방식

변수를 자동으로 캐스트할 떄 데이터가 손실될 수 있다.
왼쪽에 나온 타입이 오른쪽에 나온 타입과 완전히 호환된다고 확신할 때만 자동 캐스트를 사용한다.

부동소수점수

  • 소수점 자리가 다른 부동소수점수끼리 연산할 때 에러가 발생할 가능성이 있다.
  • 거의 동일한 부동소수점수끼리 뺄셈을 할 때 정밀도 손실이 발생할 수 있다.

연산자

C++ 연산자

  1. 이항binary 연산자 : 표현식 두 개 계산
  2. 단항unary 연산자 : 표현식 한 개만 계산
  3. 삼항ternary 연산자 : 표현식 세 개 계산

연산자는 우선순위에 따라 평가된다.
우선순위가 높은 연산자는 낮은 연산자보다 먼저 실행된다.

열거 타입

강력한 열거 타입strongly typed enumeration type을 적용하면 변수에 지정할 수 있는 값의 범위를 엄격하게 제한

    enum class PieceType { King, Queen, Rook, Pawn }; // 0 1 2 3 할당

    PieceType piece { PieceType::King };

값의 범위를 지정할 수도 있다

    enum class PieceType
    {
        King = 1,   // 1
        Queen,      // 2
        Rook = 10,  // 10
        Pawn        // 11 할당
    };

논리 연산자

C++은 논리 표현식을 평가할 때 단락 논리short-circuit logic(축약 논리)를 사용한다.
즉 표현식을 평가하는 도중에 최종 결과가 나오면 나머지 부분은 평가하지 않는다.

단락 기능은 프로그램 성능을 높이는 데 도움이 된다.
단락되는 논리식을 작성할 때는 가볍게 검사할 수 있는 부분을 앞에 적고, 시간이 좀 걸리는 부분은 뒤에 둔다.

3방향 비교 연산자 (C++20)

3방향 비교 연산자three-way comparison operator는 두 값의 순서를 결정하는 데 사용된다. 우주선 연산자라고도 불린다.

피연산자가 정수 : 강한 순서strong ordering

  • strong_ordering::less : 첫 번째 피연산자 < 두 번째 피연산자
  • strong_ordering::greater : 첫 번째 피연산자 > 두 번째 피 연산자
  • strong_ordering::equal : 두 피연산자가 같다

피연산자가 부동소수점 : 부분 순서partial_ordering

  • partial_ordering::less : 첫 번째 피연산자 < 두 번째 피연산자
  • partial_ordering::greater : 첫 번째 피연산자 > 두 번째 피연산자
  • partial_ordering::equivalent : 두 피연산자 같다
  • partial_ordering::unordered : 두 피연산자중 하나는 숫자가 아니다

약한순서weak ordering

  • weak_ordering::less : 첫 번째 피연산자 < 두 번째 피연산자
  • weak_ordering::greater : 첫 번째 피연산자 > 두 번째 피 연산자
  • weak_ordering::equivalent : 두 피연산자가 같다

기본 타입에 대해서는 3방향 비교 연산자를 사용해도 기존 비교 연산자(==, < , >)를 사용하는 것보다 좋은 점은 없다.
하지만 비교 작업이 복잡한 객체에서는 상당히 유용하다.

함수

프로그램의 가독성을 높이기 위해 코드를 간결하고 명확한 함수 단위로 나눈다.

함수 리턴 타입 추론

auto 키워드를 통해 함수의 리턴 타입을 컴파일러가 알아서 지정할 수 있다.

    auto addNumbers(int number1, int number2)
    {
        return number1 + number2
    }

컴파일러는 return 문에 나온 표현식의 타입에 따라 리턴 타입을 추론한다.
함수 안에 return 문이 여러 개가 있다면 모두 타입이 같아야 한다.

함수 오버로딩

함수 오버로딩overloading : 이름은 같지만 매개변수 구성은 다른 함수
리턴 타입만 달라서는 안 된다. 매개변수의 타입이나 개수도 달라야 한다.

    int addNumbers(int a, int b) { return a + b; }
    double addNumbers(double a, double b) { return a + b;}

    cout << addNumbers(1, 2) << endl; // int 버전 호출
    cout << addNumbers(1.11, 2.22) << endl; // double 버전 호출

맨 위로 이동하기

Cpp 카테고리 내 다른 글 보러가기

댓글남기기