전체 글 169

문자열 관련 함수 2 (strcmp, memset,mcmcpy)

strcmp strcmp : 문자열 비교 함수이다. 문자열이 같을 경우 0을 반환하고, 0이 아니면 다르다는 의미이다. 1인 경우, 오른쪽의 아스키코드가 더 작다는 뜻이고, -1인 경우는 왼쪽의 아스키코드가 더 작다는 뜻이다. memset memset : 메모리를 내가 원하는 크기만큼 원하는 값으로 채워주고자 할 때 사용한다. 단, 1바이트 단위로 값을 채워준다. 1번인자 : 메모리 주소 2번인자 : 채워줄 값 3번인자 : 채워줄 메모리 크기 memcpy memcpy : 메모리를 복사할 때 사용한다. 1번인자 : 메모리 주소 2번인자 : 복사할 메모리 주소 3번인자 : 복사할 메모리 크기 1번인자의 주소에 2번인자의 주소로부터 3번인자의 크기만큼을 복사한다.

C++ 문법 2022.04.12

문자열 관련 함수 1 (strcpy_s, strlen함수, strcat_s)

char : 1바이트를 차지하는 문자 wchar_t : 2바이트를 차지하는 문자 한글은 1글자당 2바이트를 차지하므로 char에 저장 할 때는, 2개의 공간이 필요하다. 문자열의 끝은 0(null문자)로 표현이 되어야 한다. strcpy_s strcpy_s : 문자열 복사 함수. 1번인자가 배열로 들어갈 경우, 인자가 2개이다. 1번인자에 2번인자에 들어간 문자열을 복사해주게 된다. 1번인자가 포인터일 경우, 인자가 3개이다. 1번인자에 3번인자의 문자열을 2번인자의 크기만큼 복사해주게 된다. ※ 문자열 리터럴은 rodata 영역에 저장이 된다. 문자열 리터럴은 const char* 로 인식한다. strlen 함수 strlen 함수를 이용해서 문자열의 수를 얻어올 수 있다. 바이트 크기가 아닌 문자열 개..

C++ 문법 2022.04.12

#define, 재귀함수, 꼬리재귀함수

#define #define은 전처리기이다. #define 이름 코드 코드에서 원하는 부분에 #define의 이름을 넣어주면 이름 뒤에 있는 코드를 컴파일 전에 그 곳에 붙여넣어주고 해당 코드로 컴파일을 진행해준다. #define은 한 줄로 작성해야 된다. (\ 해주면 다음 줄도 전처리기에 포함이 된다.) 단점: 디버깅이 안된다. 재귀함수 재귀함수 : 함수 안에서 자기 자신을 호출하는 함수를 말한다. 재귀함수를 사용할 때는 반드시 종료부분을 만들어주어야 한다. 재귀함수를 종료한다는 것은 더이상 자기 자신을 호출하는 것을 막아주는 것이다. 꼬리재귀함수 아래와 같은 함수를 꼬리재귀함수라 한다. 속성창에서 최적화를 제대로 설정하면 재귀함수의 불필요한 연산을 줄일수 있어 속도를 개선할 수 있다.

C++ 문법 2022.04.12

메모리 영역, 함수 포인터

메모리 영역 C++의 메모리 영역 : 스택영역, 데이터영역, 힙영역, 코드영역 스택영역 : 함수의 인자 혹은 함수의 내부에서 선언된 변수들의 메모리가 할당되는 영역이다. 함수의 내부에서 선언된 변수를 지역변수라고 한다. 지역변수들이 선언되는 메모리 공간이 스택영역이다. 함수의 인자는 매개변수라고 한다. 데이터영역 : 전역변수, 정적(static)변수들의 메모리가 할당되는 영역이다. 힙영역 : 동적할당된 메모리가 할당되는 영역이다. 필요할 때 공간을 할당하고, 원할 때 메모리를 제거할 수 있다. ※ 동적할당시 문제가 생길 수 있는 부분으로 메모리 단편화가 있다. 코드영역 : 작성한 코드를 컴파일러가 바이너리코드(0, 1 로 구성된 코드)로 만들어주고, 이 바이너리 코드를 이용해서 실행파일을 만들어 준다. ..

C++ 문법 2022.04.11

디폴트 인자, 정적 변수

디폴트 인자 함수의 인자는 호출시 값을 넣어주어야 한다. (nullptr 넣으면 에러가 발생한다) 하지만 함수의 디폴트 인자를 사용하게 되면 값을 넣어주어도 되고 안 넣어주어도 된다. 함수의 디폴트 인자는 함수의 인자에 이 인자가 가질 기본값을 정의해주어서 외부에서 함수를 호출할때 값을 넣어주면 해당 값으로 설정을 하고 값을 비워두면 기본값으로 설정이 되게 된다. 디폴트 인자는 함수의 인자중 가장 오른쪽부터 설정해야 한다. 오른쪽 인자가 디폴트 인자가 아니고 왼쪽 인자가 디폴트인자일 경우 에러가 발생한다. 함수오버로딩 시에 디폴트 인자를 잘못 사용하면 오버로딩에 문제가 발생할 수 있다. 위의 함수와 아래의 함수는 두 함수 모두 인자 1개만 넣어주어도 동작이 되기 때문에, 함수를 호출시 인자를 1개만 넣어..

C++ 문법 2022.04.11

전역변수, 함수의 오버로딩

전역변수 전역변수 : 함수의 외부에 선언된 변수를 의미한다. 함수의 외부에 선언되어 있기 때문에 전역변수가 선언된 부분의 아래에 존재하는 함수들에서 이 변수를 공용으로 사용할 수 있게 된다. ​ 전역변수 선언시 g_를 붙여준 이유는 전역변수라고 표현하기 위해서이다. 전역변수를 선언하면 이 선언 아래에 있는 코드에서는 이 변수를 공용으로 사용할 수 있다. 전역변수는 값을 초기화 안해주면 자동으로 0으로 초기화가 된다. 지역변수는 해당 함수가 종료되면 스택에서 정리가 되지만, 전역변수는 프로그램이 종료될 때 메모리에서 정리가 된다. 함수의 오버로딩 함수의 오버로딩 : 같은 이름으로 함수를 만들어줄 때, 인자의 개수 혹은 타입이 서로 다를 경우 같은 이름으로 함수를 정의하는 것이 가능하다. 이를 함수의 오버로..

C++ 문법 2022.04.11

함수

함수 : 원하는 코드를 모아서 구현을 해놓은 뒤에 원할 때마다 해당 코드를 동작시켜줄 수 있게 해주는 기능을 함수라고 한다. 함수의 형태 반환타입 함수이름(인자) { 동작시킬 코드 } 반환타입 : 이 함수를 동작시키고 이 함수에서 원하는 결과가 있을 경우 그 결과를 얻어오고자 할때 해당 결과의 변수 타입을 지정하면된다. void를 반환타입으로 사용한다면 '결과를 반환하는것이 없다' 라는 의미로 사용하게 된다. int를 반환타입으로 사용한다면 '이 함수를 실행하고 결과로 정수를 얻어오고자 할 때' int를 반환타입으로 사용하는 것이다. return 키워드를 이용해서 함수의 결과를 반환한다. 함수이름 : 원하는대로 이름을 만들어줄 수 있다. 단, 이 함수가 수행하는 기능에 맞는 이름을 잘 작성해주어야 한다...

C++ 문법 2022.04.11

구조체 struct, 레퍼런스

구조체 struct 구조체 : 서로 다른 타입의 변수 여러개를 한번에 묶어서 하나의 사용자정의 변수 타입으로 만들어줄 수 있는 기능이다. struct 구조체 이름 { 원하는 변수 선언 }; 프로젝트 속성의 구조체 멤버 맞춤이 기본값 으로 설정이 되어 있을 경우, 구조체 내에서 용량이 가장 큰 변수의 크기를 기본값으로 잡아서 메모리를 할당하게 된다. 컴퓨터는 메모리를 4의 배수 또는 2의 제곱 단위로 처리할 때가 가장 빠르다. 아래는 8바이트 단위로 잡게 될 것이다. 멤버가 없더라도 최소바이트인 1바이트가 할당된다. 변수를 선언하게 되면 메모리에 공간이 잡혀야 하므로, 최소 바이트 수인 1바이트 공간을 차지하게 하여 변수를 잡아주는 것이다. 레퍼런스 & 레퍼런스 : 다른 변수를 참조하여 값을 컨트롤 할 수..

C++ 문법 2022.04.11

동적할당, 메모리 릭

#include 를 하고, 아래 코드를 이용해서 메모리 릭을 체크할 수 있다. 단, Ctrl + F5를 이용해서 실행을 하면 릭이 체크가 안된다. 릭을 체크하고자 한다면 F5(디버그 모드 실행)을 이용해서 실행하면 릭이 있을 경우 출력창에 릭을 알려준다. _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 동적 할당 동적할당 : 메모리를 시작할 때 만들어주는 것이 아닌, 필요한 순간에 공간을 만들어주는 기능이다. new와 delete 키워드를 이용해서 동적으로 메모리를 할당하고 동적으로 할당된 메모리를 제거할 수 있다. 단, 동적할당된 메모리는 delete를 통해서 제거를 안 할 경우 메모리공간을 그대로 계속 차지하고 있게 된다. 이 상태에서 프..

C++ 문법 2022.04.11

<포인터> void 타입, 이중 포인터

void 타입 void : 타입이 없다는 의미이다. 일반 void 타입은 변수 선언시에는 사용할 수 없다. void는 포인터 타입을 선언하여 사용이 가능하다. void포인터를 선언하면 타입이 없는 포인터가 선언되어 어떤 변수타입의 메모리 주소라도 다 저장이 가능하다. 단, 반쪽짜리 만능이다. 왜냐하면 역참조가 불가능하다. 그래서 저장된 주소로 역참조를 하기 위해서는 형변환을 통해 접근해야 한다. 이중 포인터 이중포인터 : 포인터의 포인터이다. 일반 포인터가 일반 변수의 메모리 주소를 저장하기 위한 변수라면 이중포인터는 포인터 변수의 메모리 주소를 저장하기 위한 변수이다. 삼중포인터 : 이중 포인터 변수의 메모리 주소를 저장하기 위한 변수이다. ppNumber는 pNumber5의 주소를 가지고 있으므로, ..

C++ 문법 2022.04.11