[Day8] C++ Basic Code Test

베리투스·2025년 8월 13일

TIL: Today I Learned

목록 보기
16/93

C++ 프로그래밍의 핵심 기초 문법을 실습 위주로 정리했다. 변수 선언부터 자료형별 연산, 입출력까지 직접 코드를 작성하며 기본기를 다졌다. 🚀 조건문(if)반복문(for)을 활용해 문제 해결 능력을 키웠고, 코드 재사용의 핵심인 함수값, 참조, 포인터 방식으로 다양하게 호출해보며 각각의 차이를 명확히 이해했다. 특히 const 포인터와 같은 헷갈리기 쉬운 개념들도 예제와 함께 정리하며 기초를 탄탄히 다졌다.


📌 목표

  1. 변수와 자료형 이해 및 실습
    • 선언, 초기화, 연산(산술·대입·비교·증감), 입출력(cin, getline)
  2. 제어문과 반복문 활용
    • if / switch, for / while / do...while 실습
  3. 함수 기본과 확장
    • 값 전달, 참조 전달, 포인터 전달, 함수 오버로딩, 참조 반환
  4. 전역/지역 변수 차이 확인
  5. 상수와 const 포인터 개념 정리 및 실습

💻 실습 코드

1. 변수 선언과 초기화

  • 각 자료형(int, float, char, string, bool)에 맞는 변수를 선언하고 초기화한 뒤, cout으로 출력했다. boolalpha를 사용하면 bool 타입이 1/0이 아닌 true/false로 출력된다.
#include <iostream>
#include <string>
using namespace std;

int main() {
    int a = 1;
    float b = 9.87f;
    char c = 'C';
    string d = "메롱";
    bool e = true;

    cout << boolalpha; // true/false로 출력
    cout << "a: " << a << ", b: " << b << ", c: " << c << ", d: " << d << ", e: " << e << endl;
    return 0;
}

2. 산술 연산 (정수/실수)

  • 정수와 실수의 사칙연산 및 나머지 연산을 실습했다. 실수의 나머지 연산은 %가 아닌 <cmath> 헤더의 fmod() 함수를 사용해야 한다.
#include <iostream>
#include <cmath> // fmod 함수 사용을 위해 포함
using namespace std;

int main() {
    int a = 123, b = 456;
    cout << a + b << endl; // 덧셈
    cout << a % b << endl; // 정수 나머지 연산

    float x = 123.0f, y = 456.0f;
    cout << x / y << endl; // 실수 나눗셈
    cout << fmod(x, y) << endl; // 실수 나머지 연산
    return 0;
}

3. 조건문 & 반복문

  • for 반복문으로 1부터 10까지 순회하면서, if 조건문으로 짝수만 골라내 합계를 구하는 예제다.
#include <iostream>
using namespace std;

int main() {
    int sum = 0;
    for (int i = 1; i <= 10; i++) {
        if (i % 2 == 0) { // i가 짝수일 때만
            sum += i;     // sum에 더함
        }
    }
    cout << "1부터 10까지 짝수의 합: " << sum << endl;
    return 0;
}

4. 함수와 오버로딩

  • 같은 이름의 multiply 함수를 매개변수 타입만 다르게(int, double) 하여 여러 개 정의했다. 컴파일러가 인자 타입에 맞는 함수를 알아서 호출해준다.
#include <iostream>
using namespace std;

// 정수형 곱셈 함수
int multiply(int x, int y) { return x * y; }
// 실수형 곱셈 함수 (오버로딩)
double multiply(double x, double y) { return x * y; }

int main() {
    cout << "정수 곱셈: " << multiply(3, 4) << endl;
    cout << "실수 곱셈: " << multiply(2.5, 4.0) << endl;
    return 0;
}

5. 참조 & 포인터 전달

  • 함수에 변수의 참조(별명)주소(포인터)를 전달하면, 함수 내에서 원본 변수의 값을 직접 수정할 수 있다.
#include <iostream>
using namespace std;

// 참조(reference)를 통해 원본 값 변경
void addOne(int& x) { x += 1; }
// 포인터(pointer)를 통해 원본 값 변경
void addOnePtr(int* x) { (*x) += 1; }

int main() {
    int a = 5;
    cout << "Original: " << a << endl;
    
    addOne(a); // 참조 전달
    cout << "After addOne: " << a << endl; // a가 6으로 변경됨
    
    addOnePtr(&a); // 주소 전달
    cout << "After addOnePtr: " << a << endl; // a가 7로 변경됨
    return 0;
}

6. 참조 반환

  • 함수가 변수의 참조를 반환하면, 함수 호출 자체가 변수처럼 동작하여 값을 읽거나 쓸 수 있다(l-value가 됨).
#include <iostream>
using namespace std;

// 두 변수 중 더 큰 변수의 '참조'를 반환
int& getMax(int& x, int& y) {
    return (x > y) ? x : y;
}

int main() {
    int a = 10, b = 20;
    getMax(a, b) = 100; // b가 100으로 변경됨
    cout << "a: " << a << ", b: " << b << endl; // 출력: a: 10, b: 100
    return 0;
}

7. const 포인터

  • const 키워드의 위치에 따라 포인터가 가리키는 을 보호할지, 포인터 변수 자체의 주소를 보호할지 결정된다.
int main() {
    int a = 10;
    int b = 20;

    // p1이 가리키는 '값'을 바꿀 수 없음 (*p1 = 30; // 에러)
    const int* p1 = &a;
    p1 = &b; // p1이 다른 변수를 가리키는 것은 가능

    // p2가 가리키는 '주소'를 바꿀 수 없음 (p2 = &b; // 에러)
    int* const p2 = &a;
    *p2 = 30; // p2가 가리키는 값 변경은 가능

    // p3는 값과 주소 둘 다 변경 불가
    const int* const p3 = &a;
    return 0;
}

⚠️ 실수

  1. 벡터 연산 착각: vector<int> v = {1, 2};v * 2; 같은 연산이 될 줄 알았는데, 벡터는 이런 식의 일괄 연산을 지원하지 않았다. 원소별로 연산하려면 반복문이나 <algorithm>transform 함수가 필요했다.
  2. 정수 vs 실수 나눗셈: int a = 5, b = 2; 일 때 a / b의 결과가 2.5가 아닌 2가 나와서 당황했다. 정수끼리의 나눗셈은 소수점 이하를 버린다는 것을 잊고 있었다. 정확한 결과를 원하면 (float)a / b 처럼 형 변환을 해야 했다.
  3. % 연산 제한: 실수(float, double)에는 나머지 연산자 %를 사용할 수 없다는 것을 몰랐다. fmod() 함수를 써야 한다는 것을 새로 배웠다.
  4. 전위/후위 증감 차이: int a = 5; int b = a++;int c = ++a; 의 결과가 다른 이유를 헷갈렸다. a++는 값을 먼저 대입하고 a를 증가시키고, ++aa를 먼저 증가시키고 값을 대입한다는 순서 차이를 명심해야겠다.
  5. const 포인터 헷갈림: const int* pint* const p의 차이가 너무 헷갈렸다. const*의 왼쪽에 있으면 값을, 오른쪽에 있으면 포인터 자체를 보호한다고 외워야겠다.
  6. = vs == 실수: if (x = 5) 처럼 조건문에 대입 연산자를 써서 의도치 않은 버그를 만들었다. 비교는 반드시 ==를 사용해야 한다.

✅ 핵심 요약

구분핵심 개념예시 코드 / 특징
변수 선언·초기화자료형 + 이름, 초기값 할당int a = 1;
산술 연산+, -, *, /, %%는 정수 전용, 실수는 fmod()
대입 연산=, +=, -=, *=, /=a += 3;
비교 연산==, !=, <, >, <=, >=if (a == b)
증감 연산++, -- (전위/후위)++x (증가 후 사용) vs x++ (사용 후 증가)
입출력cin / getlinegetline은 공백 포함 한 줄 읽기
= vs ==대입(Assignment) vs 비교(Comparison)if (x == 5)
unsigned음수 불가, 양수 표현 범위 2배unsigned int u
조건문if / switchswitch는 정수 계열 타입으로 분기
반복문for / while / do...whiledo...while은 조건을 나중에 검사하여 최소 1회 실행 보장
함수값/참조/포인터 전달, 오버로딩참조 반환: int& getMax(int&, int&)
전역/지역 변수변수의 범위(scope)와 수명(lifetime)이 다름전역은 프로그램 전체, 지역은 해당 블록({}) 내에서만 유효
상수값이 변하지 않는 변수const double PI = 3.14;
const 포인터값 상수 / 포인터 상수 / 둘 다 상수const int* p, int* const p, const int* const p
profile
Shin Ji Yong // Unreal Engine 5 공부중입니다~

0개의 댓글