[C++] Chapter 02 - C언어 기반의 C++ 2

Lee Jeong Min·2020년 11월 26일
0

Cpp

목록 보기
2/16
post-thumbnail

02 – 1 Chapter 02의 시작에 앞서

키워드 const의 의미

-const int num = 10; -> 변수 num을 상수화
-const int ptr1 = &val1; -> 포인터 ptr1을 이용해서 val1의 값을 변경 X
-int
const ptr2 = &val2; -> 포인터 ptr2가 상수화
-const int * const ptr3 = &val3; -> 포인터 ptr3가 상수화 되었으며, ptr3을 이용해서 val3의 값 변경 X

실행중인 프로그램의 메모리 공간

데이터 – 전역변수가 저장되는 영역
스택 – 지역변수 및 매개변수가 저장되는 영역
힙 – malloc 함수호출에 의해 동적으로 메모리 할당이 이루어지는 영역
Malloc & free – malloc 함수 호출에 의해 할당된 메모리 공간은 free 함수호출을 통해서 소멸하지 않으면 해제되지 않음


02 – 2 새로운 자료형 bool

#include <iostream>

using namespace std;

int main(void)
{
	int num = 10;
	int i = 0;

	cout << "true: " << true << endl;
	cout << "false: " << false << endl;

	while (true)
	{
		cout << i++ << ' ';
		if (i > num)
			break;
	}
	cout << endl;

	cout << "sizeof 1: " << sizeof(1) << endl;
	cout << "sizeof 0: " << sizeof(0) << endl;
	cout << "sizeof true: " << sizeof(true) << endl;
	cout << "sizeof false: " << sizeof(false) << endl;
	return 0;
}

자료형 bool은 1byte이며 함수의 반환형으로도 사용이 가능함


02 – 3 참조자(Reference)의 이해

#include <iostream>

using namespace std;

int main(void)
{
	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;
}

int &num2 = num1 이와 같이 참조자는 변수로 초기화를 시켜주며 할당된 하나의 메모리 공간에 둘 이상의 이름을 부여하고 싶을 때 사용한다.
또한 참조자는 자신이 참조하는 변수를 대신할 수 있는 또 하나의 이름으로써 사용할 수 있음.

참조자는 변수에 대해서만 선언이 가능함

int num = 12;
int * ptr = &num;	
int ** dptr = &ptr;

int &ref = num;
int *(&pref) = ptr;
int **(&dpref) = dptr;

int &ref = arr[0]; // 배열의 요소도 변수로 간주됨

02 – 4 참조자(Reference)와 함수

주소값을 이용한 Call-by-reference

Void Swap(int *ptr1, int * ptr2)
{
  int temp = *ptr1;
  *ptr1 = *ptr2;
  *ptr2 = temp;
}

참조자를 이용한 Call-by-reference

Void Swap(int &ref1, int &ref2)
{
  int temp = ref1;
  Ref1 = ref2;
  Ref2 = temp;
}

int num = 24;
HappyFunc(num);
cout << num << endl;

다음과 같은 문장에 num의 값은 변하지 않겠지만
Void HappyFunc(int &ref)인 경우 함수만 보고 값이 변할지 안변할지 확인할 수 없음! 따라서 이 단점을 보완하기 위해 const int &ref를 사용하여 참조자의 단점을 보완함 (참조자를 통한 값의 변경을 진행하지 않는 경우)

반환형이 참조형인 경우

int& RefRetFuncOne(int &ref)
{
    ref++;
    return ref;
}

int main(void)
{
    int num1 = 4;
    int &num2 = RefRetFuncOne(num1);
    
    ...
}

이러한 코드가 있을때 참조형으로 반환된 값을 참조자에 저장하게 되면 num1과 num2만 남고 ref는 함수가 반환될때 사라지므로 num1 = num2 = 4 가 됨.

int num2 = RefRetFuncOne(num1);

이 경우에는 참조자가 아닌 변수로 값을 반환받았으므로 num1과 num2가 각기 다른 공간을 가지고 있음

마지막으로 반환형이 기본 자료형인 경우

int RefRetFuncOne(int &ref)
...

이고 반환 받을 때 num2에 저장을 하게 되면 참조형 ref가 가지고 있는 값이 num2에 저장이 됨. 이러한 경우

int &num2 = RefRetFuncOne(num1) (x)

반환 값이 상수이기때문에 참조형에다가 저장을 할 수 가 없음!

또한 지역변수를 반환하는 경우에도 참조의 형태로 반환을 하게 되면 지역변수는 소멸이 되기 때문에 참조형으로 반환 하는 일이 없어야 함!

const 참조자

const int &ref = 50

위와 같이 const 선언에 의해서 만들어진 변수를 상수화된 변수라고 하며 임시변수를 만들어 줌(참조자가 위와 같이 상수변수를 참조할 수 있도록)


02 – 5 malloc & free를 대신하는 new & delete

  • 기존의 malloc은 할당할 대상의 정보를 무조건 바이트 크기 단위로 전달해야함
  • 반환형이 void형 포인터이기 때문에 적절한 형 변환을 거쳐야함.
int * ptr = new int;
int * arr1 = new int[3];

delete ptr;
delete []arr1;

그러나 new의 경우 다음과 같이 간결하게 동적할당을 해줄 수 있음.

기존 malloc&free 와 new&delete의 동작 방식의 차이

#include <iostream>
#include <string.h>
using namespace std;

class Simple
{
public:
	Simple()
	{
		cout << "I'm simple constructor!" << endl;
	}
};

int main(void)
{
	cout << "case 1: ";
	Simple* sp1 = new Simple;

	cout << "case 2: ";
	Simple* sp2 = (Simple*)malloc(sizeof(Simple) * 1);

	cout << endl << "end of main" << endl;
	delete sp1;
	free(sp2);
	return 0;
}

다음을 실행시켰을 때 class Simple의 constructor가 malloc일때는 실행이 되지 않고 new일 때만 실행이 됨!
cpp 에서 객체의 생성은 무조건 new&delete사용을 원칙으로 함.


02 – 6 C++에서 C언어의 표준함수 호출하기

c를 더하고 .h를 빼면 c++헤더 기반으로 호출할 수 있음

#include<stdio.h> -> #include<cstdio>
#include<stdlib.h> -> #include<cstdlib>
#include<math.h> -> #include<cmath>
#include<string.h> -> #include<cstring>

C와 다르게 C++ 표준 라이브러리에서는 함수 오버로딩이 가능하기 때문에 함수를 사용처에 따라 아무렇게나 사용할 수 있도록 함수 오버로딩을 해놓았기 때문에 가급적 C++문법을 기반으로 개선된 형태로 라이브러리가 구성되어 있으므로 C++의 표준헤더를 이용해서 함수를 호출하는 것이 좋음.

profile
It is possible for ordinary people to choose to be extraordinary.

0개의 댓글