메모내용

문자열 관련 함수

                

// 숫자를 문자열로 바꾸는 함수
int num_1 = 85;
wstring numstr_1 = to_wstring(num_1);

wsring text_1 = L"string function test ";

// 문자열 합치기 함수
wstring str_a = text_1 + L"number is " + numstr_1;
                
            
                
wchar_t buffer[100];
wsprintf(buffer,"number is %d.",5);
                
            

Pragma

Pragma 는 그리스어로 'action' 사전적으로는 '만능' '행하다', '실행하다' 등의 뉘앙스를 가진 단어. 컴파일러에게 뒤에오는 내용엥 따라 어떤일을 하라는 전처리 명령이다. 각각의 컴파일마다 독립적인 기능을 제공하기 위하여 이용한다. 다른 컴파일러에서는 처리 안 될 수도 있다.

                
#pragma once    // 중복 include 하는것을 막는다. 한번 컴파일 되면 더이상ㅇ 컴파일 하지 않는다.

#pragma comment(lib, "ws2_32") // 컴파일시 ws2_32.lib 파일을 링크하라 라는 명령

// #pragma warning // 컴파일시에 어떤 조건(#if, #ifndef) 에 의해 개발자에게 어떤것을 알려주고 싶은 경우 사용
#pragma warning(disable : 4244) // disable 은 해당 warning 이 output 창에 나오지 않도록 무시하라는 지정
#pragma warning(once : 4101) // once 는 동일한 warning 에 대해 한번만 나오라는 것
#pragma warning(error : 4700) // error 는 해당 warning 을 error 로 취급하라는 것

#pragma pack(n) // n 의 값으로 1,2,4,8 등이 올수 있으며, 특히 네트워크 통신쪽을 개발할때 구조체 멤버들 align 할때 사용
                
            

자료형 디버깅하는법

                
typeid(자료형).name() // 문자열로 반환한다.

// 예

int a = 20;
cout << typeid(a).name() << endl;

                
            

객체의 상태관리

프로그래밍에서 객체의 상태를 표현하기 위해 사용하는 여러가지 방법이 있다. Flag, Enum, BitMask, Struct, Descriptor/Property, StatePattern / FSM

상태에 관련되는 용어중 배타적 (Exclusive) : 한번에 한가지의 상태만 가질 수 있다. 비배타적 (non-Exclusive) : 한번에 여러가지의 상태를 가질 수 있다. 즉, 배타적 이라는 말은 서로 동시에 성립할 수 없는 상태를 의미한다.

유형 특징 예시
Enum
배타적인 상태 표현
명확하게 구분된 값들로 이루어진 경우
상태가 제한된 범위 안에 있음을 보장
작업상태(PENDING, PROGRESS, COMPLETE)
교통신호(RED, YELLOW, GREEN)
Flag
비배타적인 상태 표현
상태를 직관적으로 확인하고 여러 상태를 조합하기 쉽다.
주로 bool 값
사용자 권한(isAdmin, isActive, hasError)
옵션설정(isEnable, isVisible)
BitMask
비배타적인 상태 표현
비트연산으로 관리함으로서 상태조합 및 확인이 빠르다.
메모리 효율적이고 성능이 중요한 경우
파일권한(READ, WRITE, EXCUTE)
플래그 조합이 빈번히 필요한 시스템
Struct | Class
상태가 복잡하고 단순히 Flag 나 Enum 표현하기 어려운 경우
상태과 관련된 추가 메타데이터를 포함할 필요가 있는 경우
상태를 체계적으로 표현가능
상태전환 로직을 캡슐화 하여 요지보수성을 높임
복잡한 UI 상태 (Selected, Hovered, Disabled 등 여러속성 포함)
게임의 캐릭터 상태(HP, MP, StatusEffects 등)
Descriptor | Proeprty
상태에 대한 추가로직(검증, 계산, 로깅 등) 이 필요한 경우
상태를 접근하는 방식에 대해 세밀한 제어가 가능
상태의 캡슐화 강화
특정 조건에 따라 상태를 자동으로 업데이트 하거나
상태 변경을 감시해야 하는 경우
StatePattern
상태 전환 로직이 복잡한 경우
상태별로 객체를 생성하고, 객체가 상태 전환을 관리
FSM
(Finite State Machine)
상태와 상태전환이 명확히 정의된 경우
상태간 전환 규칙을 관리하기 위해 사용

매크로 # L#

디버깅 및 예외 처리시 실행된 표현식을 사람이 읽기 쉽게 문자열 형태로 제공하여 디버깅을 쉽게 하는 매크로의 문자열화 연산자 (stringification) # 은 매크로에서 전달된 내용을 문자열 리터럴로 변환하는 역할을 한다.

# 매크로에 전달된 매개변수를 문자열로 변환한다.
L# 메크로에 전달된 매개변수를 와이드 문자열로 변환한다.
                
#define STRINGIFY(x) #x

STRINGIFY(Hello World) // 결과 "Hello World"
                
            

함수의 인수, 델리게이트의 인수 는 구조체로 전달하자

구조체를 만들어 전달하면 좋은점 함수의 인수가 바뀌어야 하는 상황에서 애초에 함수 인수를 구조체로 묶어 전달하면 내부 인수가 바뀌어도 함수 시그니쳐를 변경할 필요가 없다. 함수 내부에서 추가 로직만 구성하면 된다. 필수 정보를 받지 못할수도 있다는 단점이 있지만 내부 멤버 수정에 대해 좀더 자유롭게 수정할 수 있습니다. 멤버를 수정한다고 해서 함수의 시그니쳐를 바꿀 필요가 없어진다.

구조체 끼리는 최대한 의존성을 없애도록 설계하자

내부 멤버변수는 최대한 기본 자료형으로 사용하도록 한다.

변수명

변수명은 구체적일 수록 좋다 최대한 구체적이고 범용적으로 명명하자

nullptr

항상 nullptr 을 잘 체크해야 한다

직렬화는 객체의 내용을 그대로 전송하기 위해 사용합니다 메모리에서 하드디스크 메모리 에서 네트워크 서버 메모리 에서 파일

{ 객체 } << 역직렬화 --- 직렬화 >> {데이터베이스, 파일}

C 와 C++ 에서의 함수 스타일

C++ 은 객체의 멤버함수를 호출하여 객체의 값을 설정하지만 (값은 줄게 니가 알아서 넣어), C 는 구조체의 주소와 사이즈를 받아서 직접 접근하여 구조체에 값을 채워주는 스타일 이다.

실행 파일 그리고 연산(실행)

실행 파일이란 CPU 가 인식하고 정해진 연산을 수행할 수 있는 명령들의 유의미한 집합이다.

하나하나의 연산은 유의미한 결과를 내 주진 않지만 연속된 명령어의 집합(OP Code) 이 모여 어떤 유의미한 결과를 만들어 내고 그것이 하나의 흐름 또는 문맥 (context) 이라 할 수 있다.

Flague ( 플래그 )

프로그래밍 언어 용어로서, 특정 동작을 수행할지 말지 결정하는 (보통 1비트인) 변수를 플래그라고 부른다. 깃발을 신호용으로 (ex 경주, 함선간 신호, 전투시의 신호) 쓰곤 하던 전통에서 따온 용어. 깃발은 '올린다'와 '내린다' 두가지 상태로만 신호를 줄 수 있는 것을 고려하면, 깃발 색깔은? 변수 이름으로 하자 1비트 정보를 저장하거나 전달하기에 최적인 비유이다. 기계어 혹은 어셈블리어에서 처음 사용하기 시작하였으나 C나 자바 등의 고급 프로그래밍 언어에서도 사용하는 용어.

최초의 프로그래밍 언어인 기계어 혹은 어셈블리어에서는 기본적으로 순차적으로 명령을 수행하고, jump 명령으로 실행할 명령어의 위치를 바꾸는데, 조건에 따라 jump 를 할지 말지를 결정하는 명령어 집합이 있다. 이 명령어들을 조건 분기 명령어라 하며, 이 명령어 집합이 참조하는 조건이 flag이다. 기본적으로 Z(zero), N(negative), C(carry), V(overflow) 4개의 플래그가 있으며, 이를 기반으로 분기조건을 판단한다. 각 flag는 1bit로 참 (=1) 또는 거짓(=0)의 값을 가지며, 이름의 의미대로 깃발(flag)이 올라가거나 내려간 것으로 표현하기도 한다. 이 flag들을 모아놓은 레지스터를 flag register라 하며, flag register는 (ALU를 사용하는) 연산의 결과로만 변경된다. 따라서, flag 값이 변경된 후 조건 분기문에 다다르기 전에 연산 명령이 없다면 그 연산 명령의 결과에 따라 분기되어 프로그램이 수행되지만, 그 사이에 다른 연산 명령이 있다면 flag 값이 변할 수 있으므로 결국 조건 분기문에 다다라서는 앞 연산의 결과와 반대 방향으로 분기될 수 있다. 혹은, 더 이상 해당 flag를 참조하는 조건 분기문이 없을 수도 있다.