bool 자료형
논리 자료형이라고도 하며 true(1), false(0)를 값으로 가지는 자료형이고 1byte의 크기를 가진다.
#include <iostream>
using namespace std;
int main() {
bool isTrue = true;
bool isFalse = false;
cout << boolalpha;
cout << isTrue << "\n";
cout << isFalse << "\n";
cout << noboolalpha;
cout << isTrue << "\n";
cout << isFalse << "\n";
return 0;
}
참조자(Reference)의 이해
참조자는 하나의 할당된 메모리 공간에 다른 이름을 붙이는 것이다. 즉, 변수에 별명을 붙여주는 것과 같다고 볼 수 있다.
참조자의 선언에는 아래의 조건들이 있다.
- 참조자는 변수에 대해서만 선언이 가능하다.
- 미리 참조자만 선언하고 후에 참조하는 것은 불가능하며, 참조의 대상을 바꾸는 것도 불가능하다
- NULL로 초기화 하는 것도 불가능하다
즉, 참조자는 무조건 선언과 동시에 변수를 참조하도록 해야 한다.
#include <iostream>
using namespace std;
int main() {
int num1 = 1020;
int& num2 = num1;
num2 = 3047;
cout << "VAL: " << num1 << endl;
cout << "REF: " << num2 << endl;
cout << "VAL: " << &num1 << endl;
cout << "REF: " << &num2 << endl;
return 0;
}
참조자(Reference)와 함수
함수의 호출방식은 아래의 두 가지가 있다.
- Call-by-value: 값을 인자로 전달하는 함수의 호출방식
- Call-by-reference: 주소 값을 인자로 전달하는 함수의 호출방식
Call-by-value 기반의 함수는 함수 내부에서 함수 외부에 선언된 변수에 접근이 불가능하다.
void SwapByValue(int a, int b) {
int tmp = a;
a = b;
b = tmp;
}
int main() {
int a = 10;
int b = 10;
SwapByValue(a, b);
cout << a << b;
return 0;
}
//출력결과를 확인하면 a, b에 저장된 값이 바뀌지 않았음을 알 수 있다
반면 Call-byreference 기반의 함수는 주소 값을 받아서, 그 주소 값이 참조하는 영역에 저장된 값을 직접 변경한다.
void SwapByRef(int* ptr1, int* ptr2) {
int tmp = *ptr1;
*ptr1 = *ptr2;
*ptr2 = tmp;
}
int main() {
int a = 10;
int b = 10;
SwapByRef(&a, &b);
cout << a << b;
return 0;
}
//출력결과를 확인하면 a, b에 저장된 값이 바뀌었음을 알 수 있다
이렇듯 주소 값을 이용한 Call-byreference 이외에도 C++에서는 참조자를 기반으로도 Call-by-reference(참조에 따른 호출)의 함수호출을 진행할 수 있다.
void SwapByRef2(int &ref1, int &ref2) {
int tmp = ref1;
ref1 = ref2;
ref2 = tmp;
}
int main() {
int a = 10;
int b = 10;
SwapByRef2(a, b);
cout << a << b;
return 0;
}
//마찬가지로 출력결과를 확인하면 a, b에 저장된 값이 바뀌었음을 알 수 있다
위 함수가 호출된 순간 참조자 ref1, ref2는 메인 함수의 a, b의 또 다른 이름이 되고 이 두 참조자를 통해 값을 교환했기 때문에 실제로 a와 b의 값의 교환이 발생한다.
추가로 위의 함수에 선언된 매개변수는 초기화가 되지 않은 것이 아니라, 함수호출 시에 전달되는 인자로 초기화를 하겠다는 의미이다.
new & delete
C에서 동적할당을 하기 위해선 아래와 같은 불편한 점이 있었다.
- 할당할 대상의 정보를 무조건 바이트 크기 단위로 전달해야한다.
- 반환형이 보이드형 포인터이기 때문에 형 변환을 거쳐야 했다.
그러나 C++에서 제공하는 new와 delete를 사용하면 위와 같은 불편한 점이 사라진다.
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>
#include <stack>
using namespace std;
char* MakeStrAdr(int len) {
char* str = new char[len];
return str;
}
int main() {
char* str = MakeStrAdr(20);
strcpy(str, "I am so happy~");
cout << str << "\n";
delete[] str;
return 0;
}
C++에서 C언어의 표준함수 호출하기
C | C++ |
#include <stdio.h> | #include <cstdio> |
#include <stdlilb.h> | #include <cstdlib> |
#include <math.h> | #include <cmath> |
#include <string.h> | #include <cstring> |
위처럼 헤더파일 확장자인 .h를 생략하고 앞에 c를 붙이면 C언어에 대응하는 C++의 헤더파일 이름이 된다.
C언어의 헤더파일을 그대로 사용해도 되지만, C++ 문법 기반으로 개선된 형태의 라이브러리 구성 등의 이유로 C++의 헤더파일을 이용해서 함수를 호출하는 것이 좋다.
'개인 공부 > C++' 카테고리의 다른 글
[C++] Chapter 05 정리 (0) | 2023.04.05 |
---|---|
[C++] Chapter 04 정리 (0) | 2023.03.29 |
[C++] Chapter 03 정리 (0) | 2023.03.28 |
[C++] Chapter 01 정리 (0) | 2023.03.22 |
[C++] C++ 공부 정리 관련 (0) | 2023.03.22 |