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

+ Recent posts