4/24(코드카타,C++실시간강의,FPS강의)

2026. 4. 24. 15:14·본캠프

코드카타 21번문제를 풀었습니다.

#include <string>
#include <vector>

using namespace std;

bool solution(int x) {
    bool answer = true;
    int sum = 0;
    for (int i = 0; i < x; i++) {
        int temp = x;
        for (; temp > 0; temp /= 10) {
            sum += temp % 10;
        }
        break;
    }
    if (x % sum == 0) {
        answer = true;
    }
    else {
        answer = false;
    }
    return answer;
}

 

바깥의 for문은 beak때문에 사실상 한번만 실행된다고 볼수있다.

아래 temp는 왜 x를 안쓰냐 -> 마지막에 검수할때 x를 썼다면 판별을 할수 없기 때문이다.

 

반복이 끝날 때 마다 temp를 10으로 나눔 

-> for문 끝에서 % 10을 해서 나머지를 sum에 더하기

의 반복이다.

 

그후 참거짓을 판별하는 코드이다.

 

그리고 블루프린트 발표자료를 만들었습니다.

 

c++실시간강의

배열(Array)

자료구조 중 가장 기초가 되는 자료구조.

사용할 메모리 크기를 고정해서 선언하는 것이 특징입니다.

선언된 후에는 절대 그 크기를 변경 불가합니다. 그래서 정적인 자료구조라고도 합니다.

선언된 메모리는 연속적으로 할당됩니다.

#include <stdio.h>

int main(void)
{
int i;
int Array[4] = { 1, 2, 3, 4 };

for (i = 0; i < 4; ++i)
{
printf("%d ", Array[i]);
}

return 0;
}

2차원 배열

#include <stdio.h>

int main(void)
{
int i, j;
int Array2D[4][3] = { { 1,  2,  3, },
  { 4,  5,  6, },
  { 7,  8,  9, },
  {10, 11, 12, } };

for (i = 0; i < 4; ++i)
{
for (j = 0; j < 3; ++j)
{
printf("%2d ", Array2D[i][j]);
}
printf("\n");
}

return 0;
}
함수(Function)

프로그래밍 언어에서 함수란, 코드 뭉치.

반복되는 코드 뭉치가 있다면 해당 코드 뭉치를 함수로 만들어서 재사용성을 높힐 수 있습니다.

입력 혹은 출력이 있는 경우 대부분 다 함수라고 봐도됩니다.

반환자료형 함수명(매개변수자료형 매개변수명) // 함수 선언(Declaration)이자, 정의(Definition)
{

return 반환값;
}

int main(void)
{
int num = 10;  // 자료형 변수명 = 값;

함수명(인자값); // 함수 호출(Call)

return 0;
}

스코프

변수나 함수 이름을 사용할 수 있는 범위를 뜻합니다.

 

스코프의 종류

1. 블럭 스코프(Block Scope)

2. 파일 스코프(File Scope)

블럭스코프

중괄호 내부에 선언된 변수는 해당 중괄호 내부에서만 사용할 수 있습니다.

조건문, 반복문 같은 문(statement)에 사용되는 중괄호 범위도 블럭 스코프라고 합니다.

블럭 스코프 안에 또 다른 블럭 스코프가 들어갈 수도 있습니다.

바깥쪽 블럭 스코프에서 안쪽 블럭 스코프에 선언된 지역 변수에 접근 불가능합니다.

반대로 바깥쪽 블럭 스코프에 선언된 지역 변수를 안쪽 블럭 스코프에서는 접근 가능합니다.

 

전방 선언

함수의 원형(머리부분)만 따서 파일 스코프 상단에 두고 함수의 정의는 파일 스코프의 하단에 위치 시키는 방법입니다.

변수의 종류

변수에는 지역 변수/전역 변수가 있습니다. 여기에 static이나 const, extern 같은 키워드가 붙어서 조금씩 뉘앙스가 달라집니다.

 

지역 변수

함수를 하나의 마을이라고 생각해봅시다.

main() 마을에서는 Add() 마을에서 선언된 지역 변수 A를 접근할 수 없습니다.

그리고 Add() 함수가 종료되면, 지역 변수 A도 사라진다고 이해합시다.

 

정적 지역 변수

지역 변수 앞에 static 키워드가 붙으면 데이터 섹션에 저장됩니다.

즉, 함수 종료시 접근 불가한 스택메모리에 저장되는게 아닙니다.

함수가 종료되어도 값이 유지가 됩니다 이런 변수를 정적 지역 변수라고 부릅니다.

 

전역 변수

파일 스코프에 선언된 변수. 데이터 섹션에 저장됩니다.

 

const 변수

const 키워드가 붙은 변수. 초기화 이후에 값을 변경할 수 없습니다. 초기화가 강제됩니다.

 

포인터

자료형 변수명 = 값;

자료형* 변수명 = 메모리주소값; // 자료형쪽에 Asterisk를 붙힙시다.
    // 변수명쪽에 Asterisk를 붙히면 뒤에서 배울 역참조 연산자와 심히 헷갈립니다.

 

포인터를 선언할 때 자료형은 왜 필요할까요?

해당 메모리 주소로 가서 얼마만큼의 크기로 읽어야 내 데이터인지 모르기 때문입니다.

자료형이 있어야 크기를 알 수 있습니다.

더 나아가서, 자료형 크기만큼 가면 다음 데이터를 얻을 수도 있습니다.

 

주소 연산자와 역참조 연산자

 

역참조 연산자

피연산자로 포인터를 받아서, 해당 메모리 주소에 저장된 값을 읽거나 값을 수정할 때 사용하는 연산자.

#include <stdio.h>

int main(void)
{
int X = 10;
int* PtrToX = &X;

printf("%d\n", *PtrToX);

*PtrToX = 100;

printf("%d\n", *PtrToX);

return 0;
}

 

포인터의 단점

큰 데이터들의 시작 메모리 주소만으로 가볍게 공유할 수 있다는 점은 좋습니다.

다만, 공유 받은 사람이 착한 사람인지는 모릅니다.

해당 주소로 가서 들어있는 값을 마음대로 수정 할수도 있습니다.

아주 강력한 기능임과 동시에 그만큼 잘못쓰면 큰일 날 수도 있습니다.

 

NULL 포인터

#define NULL ((void*)0)

아무것도 가르키지 않는 포인터.

 

자료형이 정해지지 않은 포인터

 

자료형* 변수명 = 메모리주소값;

NULL 포인터는 메모리주소값이 아직 정해지지 않았을 때 사용 했습니다.

자료형을 지금 바로 정할 수 없을 때도 있습니다.

 

void 포인터

범용 포인터라고도 부릅니다.

void* 변수명 = 메모리 주소 값;

 

코드 섹션과 데이터 섹션

코드 섹션: 우리가 작성한 소스코드들이 빌드된 결과물들이 저장되는 곳입니다.

데이터 섹션: 전역 변수와 정적 변수등이 저장되는 곳입니다.

 

스택 메모리의 단점

 

스택 메모리에 저장되는 지역 변수(배열 등)의 크기는 컴파일 타임에 고정됩니다.

런타임에 더 필요해진다 해도 크기를 늘릴 수 없습니다.

함수가 종료되면 해당 스택 프레임에 더이상 접근 불가능합니다.

즉, 지역변수의 수명은 함수의 수명과 함께합니다.

더 오래 보존하려면 전역변수 혹은 정적변수로 선언해야 합니다.

근데 이 변수들은 너무 또 극단적입니다. 프로그램의 수명과 함께합니다.

 

힙 메모리

스택 메모리에 비교해 할당/해제 속도가 느립니다.

스택 메모리는 자료구조 스택의 특성상 할당 및 해제에 O(1) 시간이 걸립니다.

힙 메모리는 할당 받아오려면 사용중이지 않은 메모리이면서 크기가 맞는지 체크 후 제공됩니다.

또한 메모리 공간에 구멍(메모리 단편화)이 생길 수도 있어서 효율적인 메모리 관리가 어렵기도 합니다.

 

동적 할당의 세 가지 단계

1. 메모리 할당(대여)

힙 메모리 관리자에게 필요한 바이트만큼의 메모리를 달라고 요청합니다.

힙 메모리 관리자는 해당 크기의 연속된 메모리를 찾아서 반환합니다.

반환된 값은 시작 메모리 주소입니다.

 

2. 메모리 사용 할당된 힙 메모리 시작 주소를 가지고 원하는 작업 수행합니다.

이때 할당된 메모리 속 데이터는 쓰레기값입니다.

 

3. 메모리 해제(반납) 힙 메모리 관리자에게 해당 메모리 주소를 돌려주면서 다 썼다고 알립니다.

힙 메모리 관리자는 해당 메모리를 점유되지 않은 메모리 상태로 바꿉니다.

메모리 주소를 돌려주지 않으면 메모리 누수(Memory leak) 발생합니다.

메모리 누수란, 해당 메모리가 점유 상태를 벗어나지 못해 사용가능한 메모리가 줄어드는 현상입니다.

 

malloc() 함수와 free() 함수

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
size_t i;
int* Nums = (int*)malloc(10 * sizeof(int));
if (NULL == Nums)
{
return 0;
}

// Do something....

free(Nums);
Nums = NULL;

if (NULL != Nums)
{
// TODO.
}

return 0;
}

 

구조체

필요한 여러 자료형의 변수들을 한데 묶어서 하나의 자료형처럼 만들 수 있습니다.

 

함수의 인자로 구조체 변수 전달

#include <stdio.h>

struct Date
{
int Year;
int Month;
int Day;
};

void PrintBirthday(struct Date InBirthday);

int main(void)
{
struct Date Birthday;
Birthday.Year = 2024;
Birthday.Month = 1;
Birthday.Day = 13;
// 구조체 변수 Birthday는 어느 메모리에 저장 될까요?.
// 당연하게도 스택 메모리입니다. 다른 기본 자료형과 마찬가지입니다.
// 초기화 하지 않으면 0이 아닌 쓰레기 값이 저장되어 있습니다.

PrintBirthday(Birthday);

return 0;
}

void PrintBirthday(struct Date InBirthday)
{
printf("%d/%d/%d\n", InBirthday.Year, InBirthday.Month, InBirthday.Day);
}

구조체와 객체지향 프로그래밍

나만의 자료형처럼 만든다는 것은 OOP에서 하나의 물체를 정의하는 것과 같습니다.

나만의 자료형으로 물체(객체)를 정의하고, 동적할당을 이용해서 물체를 생성 후 원하는 때에 해당 물체를 제거합니다.

이는 객체지향 프로그래밍과 유사합니다.

 

멤버 함수

#include <stdio.h>
#include <stdlib.h>

struct Human
{
float Height;

float Weight;

size_t Age;

void SayHello(void)
{
printf("Hello!\n");

return;
}

void SayMyInfo(void)
{
printf("My Height is %.1f.\n", Height);
printf("My Weight is %.1f.\n", Weight);
printf("My age is %zu.\n\n", Age);

return;
}

};
typedef struct Human Human_t;

int main(void)
{
Human_t* Park = (Human_t*)malloc(1 * sizeof(Human_t));
Park->Height = 173.f;
Park->Weight = 70.f;
Park->Age = 19;

Park->SayHello();
Park->SayMyInfo();

free(Park);
Park = NULL;

return 0;
}

 

열거형

정수에 별명을 붙여서 소스코드를 이해하기 쉽게 해줍니다.

enum

#include <stdio.h>

enum EMonth
{
MONTH_JAN = 1,
MONTH_FEB = 2,
MONTH_MAR = 3,
MONTH_APR = 4
};

enum EASCII
{
ASCII_A = 65,
ASCII_B,
ASCII_C,
ASCII_D
};

int main(void)
{
printf("This month's(%d) lucky character is %c.", 3, 66);
// 갑자기 숫자 3과 66이 튀어나오면 이해가 안될 수 있습니다.

int March = 3, B = 66;
printf("This month's(%d) lucky character is %c.", March, B);
// 물론 위와 같이 하면 가독성이 좋아지긴 하나, 변수가 메모리 공간을 잡아먹음.

printf("This month's(%d) lucky character is %c.", MONTH_MAR, ASCII_B);

return 0;
}

 

이후

 

블루프린트 fps강의만들었습니다.

https://youtu.be/FBxpE3OSPPI

 

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

4/28 (코드카타,c++,과제1,과제2/step4)  (0) 2026.04.28
4/27(코드카타,발표)  (0) 2026.04.27
발표자료  (1) 2026.04.23
4/23(코드 카타,FPS실시간강의)  (0) 2026.04.23
4/22 (코드카타,FPS게임,C++실시간 강의cp4)  (0) 2026.04.22
'본캠프' 카테고리의 다른 글
  • 4/28 (코드카타,c++,과제1,과제2/step4)
  • 4/27(코드카타,발표)
  • 발표자료
  • 4/23(코드 카타,FPS실시간강의)
백구
백구
게임개발 공부블로그 입니다.
  • 백구
    백구 게임개발 스터디
    백구
  • 전체
    오늘
    어제
    • 분류 전체보기 (20)
      • 사전캠프 (5)
      • 본캠프 (15)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
백구
4/24(코드카타,C++실시간강의,FPS강의)
상단으로

티스토리툴바