5/18 (코드카타, 팀프로젝트, 강의)

2026. 5. 11. 21:03·본캠프

0부터 9까지의 숫자 중 일부가 들어있는 정수 배열 numbers가 매개변수로 주어집니다. numbers에서 찾을 수 없는 0부터 9까지의 숫자를 모두 찾아 더한 수를 return 하도록 solution 함수를 완성해주세요.

#include <string>
#include <vector>

using namespace std;

int solution(vector<int> numbers) {
    int answer = 45;
    
    for (int i = 0; i < numbers.size(); i++) {
        answer -= numbers[i];
    }
    
    return answer;
}

 

Enemy클래스를 만들어 작성하였습니다.

 

일반 변수들은 대부분 스택 메모리 공간을 차지합니다.

스택 메모리의 가장 큰 특징은, 변수의 생존 주기가 끝나면 선언 시 할당되었던 메모리가 자동으로 회수된다는 점입니다.

따라서 사용자가 직접 메모리를 해제할 필요가 없습니다.

 

unique_ptr은 객체 소유권을 관리하는 스마트 포인터입니다. 즉, 단 하나의 포인터만 객체를 소유할 수 있습니다.

#include <iostream>
#include <memory> // unique_ptr 사용
using namespace std;

int main() {
    // unique_ptr 생성
    unique_ptr<int> ptr1 = make_unique<int>(10);

    // unique_ptr이 관리하는 값 출력
    cout << "ptr1의 값: " << *ptr1 << endl;

    // unique_ptr은 복사가 불가능
    // unique_ptr<int> ptr2 = ptr1; // 컴파일 에러 발생!

    // 범위를 벗어나면 메모리 자동 해제
    return 0;
}

 

shared_ptr 은 하나의 객체를 여러 개의 포인터가 함께 참조할 수 있는 스마트 포인터입니다. 내부적으로 레퍼런스 카운터를 관리합니다.

#include <iostream>
#include <memory> // shared_ptr 사용
using namespace std;

int main() {
    // shared_ptr 생성
    shared_ptr<int> ptr1 = make_shared<int>(10);

    // ptr1의 참조 카운트 출력
    cout << "ptr1의 참조 카운트: " << ptr1.use_count() << endl; // 출력: 1

    // ptr2가 ptr1과 리소스를 공유
    shared_ptr<int> ptr2 = ptr1;
    cout << "ptr2 생성 후 참조 카운트: " << ptr1.use_count() << endl; // 출력: 2

    // ptr2가 범위를 벗어나면 참조 카운트 감소
    ptr2.reset();
    cout << "ptr2 해제 후 참조 카운트: " << ptr1.use_count() << endl; // 출력: 1

    // 범위를 벗어나면 ptr1도 자동 해제
    return 0;
}

 

weak_ptr 은 레퍼런스 카운트를 증가시키지 않는 약한 참조방식으로 동작하는 스마트 포인터 입니다.

#include <iostream>
#include <memory>

class A {
public:
    void say_hello() {
        std::cout << "Hello from A\n";
    }
};

class B {
public:
    std::weak_ptr<A> a_ptr;

    void useA() {
        if (auto a_shared = a_ptr.lock()) { // 유효한지 확인
            a_shared->say_hello();
        } else {
            std::cout << "A is no longer available.\n";
        }
    }
};

int main() {
    std::shared_ptr<B> b = std::make_shared<B>();
    
    {
        std::shared_ptr<A> a = std::make_shared<A>();
        b->a_ptr = a;
        b->useA(); // A가 유효하므로 Hello 출력
    } // A는 scope을 벗어나며 소멸됨

    b->useA(); // A는 이미 소멸되었기 때문에 메시지 출력
}

 

 

복사 방식에는 얕은 복사와 깊은 복사가 있습니다. 일반적으로 포인터나 동적으로 할당된 자원을 관리하는 객체는 메모리 안정성을 위해 깊은 복사를 사용하는 것이 바람직합니다

'본캠프' 카테고리의 다른 글

5/8 (코드카타)  (0) 2026.05.08
5/7 (코드카타)  (0) 2026.05.07
텍스트던전rpg 분석  (0) 2026.05.06
5/6 (개인프로젝트,과제2도전step8)  (0) 2026.05.06
4/30(코드카타)  (0) 2026.04.30
'본캠프' 카테고리의 다른 글
  • 5/8 (코드카타)
  • 5/7 (코드카타)
  • 텍스트던전rpg 분석
  • 5/6 (개인프로젝트,과제2도전step8)
백구
백구
게임개발 공부블로그 입니다.
  • 백구
    백구 게임개발 스터디
    백구
  • 전체
    오늘
    어제
    • 분류 전체보기 (21) N
      • 사전캠프 (5)
      • 본캠프 (16) N
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
백구
5/18 (코드카타, 팀프로젝트, 강의)
상단으로

티스토리툴바