Part 1. C++ 로의 전환
2장. C 기반의 C++ 2
2-1 들어가기에 앞서
2-2 새로운 형태의 자료형 bool
2-3 레퍼런스(Reference)의 이해
2-4 레퍼런스와 함수
2-5 레퍼런스를 이용한 성능의 향상
2-6 레퍼런스를 리턴하는 함수의 정의
2-7 new & delete
1. 들어가기에 앞서
C언어에 대한 아주 간단한 내용이라 언급하지 않고 바로 다음으로 넘어간다.
2. 새로운 형태의 자료형 bool
C++ 에서는 bool 이라는 이름의 기본 자료형이 추가되었다.
#include <iostream>
using std::cout;
using std::endl;
using std::cin;
bool IsPositive(int num)
{
if (num <= 0)
return false;
else
return true;
}
int main(void)
{
bool isPos;
int num;
cout << "Input number: ";
cin >> num;
isPos = IsPositive(num);
if (isPos)
cout << "Positive number" << endl;
else
cout << "Negative number" << endl;
return 0;
}
bool 자료형은 true 또는 false 값을 가진다.
3. 레퍼런스의 이해
레퍼런스를 선언하는 부분은 다음과 같다.
int &ref = val;
int main(void){
int val = 10;
int *pVal = &val; // 주소 값을 얻으려고 & 연산자 사용
int &rVal = val; // 레퍼런스 선언을 위해 & 연산자 사용
return 0;
}
C언어에서는 주소 값을 얻기 위해 & 연산자를 사용했다.
레퍼런스 선언이란 이름이 존재하는 메모리 공간에 하나의 이름을 더 부여하는 행위이다.
레퍼런스와 변수는 생성되는 방법에 있어서만 차이를 보일 뿐 일단 만들어지고 나면 완전히 같다.
int function(void){
int val;
val = 20;
int &ref = val;
return val;
}
리턴타입이 int 형이고 리턴되는 대상도 int 형 변수이다. 전혀 문제가 없다.
int function(void){
int val;
val = 20;
int &ref = val;
return ref
}
리턴되는 대상이 레퍼런스인데 리턴타입이 위와 같이 int 형이다.
난해하게 생각될 수 있지만, ref도 만들어지는 과정이 일반 변수와 달라서 레퍼런스라고 하는 것이지 int 형 변수와 차이가 없다.
따라서 위의 두 코드는 같은 의미를 지닌다.
void function(void){
int val;
val = 20;
int &ref1 = val;
int &ref2 = ref1;
}
void function(void){
int val;
val = 20;
int &ref1 = val;
int &ref2 = val;
}
위의 두 코드에서 차이가 나는 부분은 ref2라는 이름의 레퍼런스를 선언하는 방식이다.
선언 방식은 다르지만, 앞서 여러번 말했듯 두 코드는 같은 의미를 지닌다.
4. 레퍼런스와 함수
// 레퍼런스 사용 예제
#include <iostream>
using namespace std;
void swap(int &a, int &b) {
int temp = a;
a = b;
b = temp;
}
int main() {
int x = 5;
int y = 10;
cout << "Before swap: x = " << x << ", y = " << y << endl;
swap(x, y);
cout << "After swap: x = " << x << ", y = " << y << endl;
return 0;
}
// 포인터 사용 예제
#include <iostream>
using namespace std;
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int x = 5;
int y = 10;
cout << "Before swap: x = " << x << ", y = " << y << endl;
swap(&x, &y);
cout << "After swap: x = " << x << ", y = " << y << endl;
return 0;
}
위는 '레퍼런스를 사용하면 포인터를 사용하는 것보다 더 간단하게 값을 교환할 수 있다'는 문장이 이해가 되지 않아 챗gpt로 물어본 내용이다. 해당 내용은 후에 다시 정리해 수정하도록 하겠다.
다시 책을 보자.
#include <iostream>
using std::cout;
using std::endl;
void swap(int &a, int &b){
int temp = a;
a = b;
b = temp;
}
int main(void){
int val1 = 10;
int val2 = 20;
cout<<"val1: "<<val1<<' ';
cout<<"val2: "<<val2<<endl;
swap(val1, val2);
cout<<"val1: "<<val1<<' ';
cout<<"val2: "<<val2<<endl;
return 0;
}
여기서 중요한 포인트는 레퍼런스 a와 b는 swap 함수의 매개 변수로 선언된 것이므로 swap 함수 내에서 참조 가능한 이름이라는 것이다. 결국 swap 함수 내에서는 a와 b라는 이름으로 main 함수 내에 선언된 변수 val1과 val2 에 직접 접근이 가능하게 된 것이다.
<실행결과>
val1:10 val2:20
val1:20 val1:10
5. 레퍼런스를 이용한 성능의 향상
Call-By-Value 의 기본 방식은 값의 복사이다. 그래서 때에따라 변수의 크기가 매우 큰 경우 함수의 호출이 부담스러울 수 있다.
이를 Call-By-Reference 가 대신할 수 있는데, 레퍼런스의 형태로 인자를 받게 되면 이름만 하나 더 추가하는 것이므로 복사는 발생하지 않는다. 하지만 이때 주의해야 할 점은 레퍼런스를 통한 데이터의 조작을 허용하지 않게 하기 위해 키워드 const 를 붙여주는 것이다.
6. 레퍼런스를 리턴하는 함수의 정의
레퍼런스를 리턴할 때 주의해야 할 사항이 하나 있다. 그것은 바로
" 지역변수는 레퍼런스로 리턴할 수 없다" 는 것이다. 함수가 종료되면 해당 함수의 지역변수는 사라져버린다.
7. new & delete
C언어의 malloc 과 free 함수는 C++에서 new 와 delete 로 쓰인다.
new 연산자는 메모리를 동적으로 할당하는 연산자이다.
뒤에서 더 자세히 다루게 된다.
'프로그래밍 언어 > C++' 카테고리의 다른 글
[열혈강의 C++] 5장. 복사 생성자 (0) | 2024.05.18 |
---|---|
[열혈강의 C++] 4장. 클래스의 완성 (0) | 2024.05.17 |
[열혈강의 C++] 3장. 클래스의 기본 (0) | 2024.05.17 |
[열혈강의 C++] 1장. C 기반의 C++ 1 (0) | 2024.05.17 |
[총정리] 윤성우 열혈 C++ 정리 (0) | 2024.05.17 |