1. Day10

  • C++ 문법 학습
  • 학습 가이드 실습 과제
  • 개인공부

2. C++ 문법 학습(Day10)

게임 개발자를 위한 C++ 문법(1-7, 2-1)

  • 1-7 과제
#include <iostream>
using namespace std;

// TODO: Phone 클래스 구현
// - displayBrand()와 showFeature() 순수 가상 함수를 포함하도록 구현하세요
// - 소멸자를 반드시 virtual로 선언하세요
class Phone
{
public:
    virtual void displayBrand() = 0;
    virtual void showFeature() = 0;
    virtual ~Phone() {}
};

// Samsung 클래스 작성 (Phone 클래스를 상속받음)
class Samsung : public Phone 
{
public:
    void displayBrand() 
    {
        cout << "Samsung" << endl;
    }
    void showFeature() 
    {
        cout << "Galaxy S 시리즈" << endl;
    }

};

// pple 클래스 작성 (Phone 클래스를 상속받음)
class Apple : public Phone 
{
public:
    void displayBrand() 
    {
        cout << "Apple" << endl;
    }
    void showFeature() 
    {
        cout << "iPhone Pro 시리즈" << endl;
    }
};

// Xiaomi 클래스 작성 (Phone 클래스를 상속받음)
class Xiaomi : public Phone 
{
public:
    void displayBrand() 
    {
        cout << "Xiaomi" << endl;
    }
    void showFeature() 
    {
        cout << "Redmi Note 시리즈" << endl;
    }
};

int main() 
{

    Phone* P[3];

    P[0] = new Samsung;
    P[1] = new Apple;
    P[2] = new Xiaomi;

    for (int i = 0; i < 3; i++)
    {
        P[i]->displayBrand();
        P[i]->showFeature();

    }

    for (int i = 0; i < 3; i++)
    {
        delete P[i];
    }
    return 0;
}
  • 2-1 스마트 포인터 vs 일반 포인터
  • 비교
구분 일반 포인터 스마트 포인터
메모리 해제 수동(delete) 자동
메모리 누수 위험 높음 낮음
소유권 관리 없음 명확함
  • 스마트 포인터 종류
종류 특징 사용 시점
unique_ptr 단독 소유권 복사 불가 하나의 소유자만 필요할 때
shared_ptr 공유 소유권, 참조 카운트 여러 곳에서 공유할 때
weak_ptr 소유권 없음, 관찰만 순환 참조 방지
  • 스마트 포인터에서 원시 포인터 얻기
    • 원시포인터를 얻은 다음 원본 수정가능
unique_ptr<int> up = make_unique<int>(10);
shared_ptr<int> sp = make_shared<int>(20);
weak_ptr<int> wp = sp;

// 원시 포인터 얻기
int* p1 = up.get();              // unique_ptr
int* p2 = sp.get();              // shared_ptr
int* p3 = wp.lock().get();       // weak_ptr (lock 먼저 필요)
스마트 포인터 직접 대입 get() 사용
unique_ptr X O
shared_ptr X O
weak_ptr X X(lock 필요)

3. CH2 학습 가이드 - 12/10

  • 미니 실습
#include <iostream>
using namespace std;

void PrintNumber(int* pNumber)
{
    for (int i = 0; i < 10; i++)
    {
        cout << pNumber[i] << " ";
    }
    cout << '\n';
}

int main() 
{
    int number[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

    PrintNumber(number);

    return 0;
}
  • 도전 실습
#include <iostream>
using namespace std;

void SwapByPointer(int* pA, int* pB)
{
    if (pA == nullptr || pB == nullptr)
    {
        cout << "비정상적인 접근" << '\n';
        return;
    }

    int temp = *pA;

    *pA = *pB;
    *pB = temp;
}

void SwapByReference(int& refA, int& refB)
{
    int temp = refA;

    refA = refB;
    refB = temp;
}

int main() 
{
    int a, b;
    a = 10;
    b = 20;

    // 초기 값
    cout << a << " " << b << '\n';

    int* A = nullptr;
    int* B = &b;

    // 예외 처리 확인용
    SwapByPointer(A, B);

    A = &a;

    // 정상적인 포인터 교환 함수 사용
    SwapByPointer(A, B);
    cout << a << " " << b << '\n';

    // 레퍼런스 교환 함수 사용
    SwapByReference(a, b);

    cout << a << " " << b << '\n';
    return 0;
}

4. 내일 계획 : 지금 템포에서 알고리즘 문제 풀이 추가

+ Recent posts