컴퓨터 공학 일지/C++

C++ 참조자 - 1

Basasakk 2019. 12. 16. 20:51

참조자의 이해

 

우리는 변수를 어떻게 이해하고 있나요?

 

우리는 데이터를 활용하여 무엇인가를 동작시켜야한다.

그러려면 그데이터를 담아둘 공간이 필요하고 꺼낼 수 도 있어야한다.

 

이를 필자는 비공학적으로 이야기해보겠습니다.

 

우리가 건축물을 짓는다고 상상해볼게요.

건축물을 짓기위해선 물,돌,시멘트,철근 등등과 같은 재료들이 우선적으로 필요하겠죠.

그리고 이 재료들을 옮길 수 있는 도구가 필요합니다.

현실에서는 이 재료들을 옮길 수 있는 도구는 바구니가 있겠죠?

 

이제 데이터 = 재료 , 변수 = 바구니라고 생각하고 진행해봅시다.

바구니

우리는 이렇게 막연한 바구니를 생각해내었습니다.

 

하지만 우리가 담아야할 재료들은 각기 다른 재료들이 존재하죠.

 

물, 돌, 시멘트, 철근 등등이요.

 

물 바구니

 

돌 바구니
철근 바구니
시멘트 바구니

 

우리는 이렇게 4가지의 바구니를 보유하고 있습니다.

이를 프로그래밍으로 비유하자면 변수들의 자료형이라고 생각하면 되겠죠.

 

이제 이 바구니 중 물 바구니에 물을 담아보겠습니다.

 

물이 담긴 물 바구니

'물이 담긴 물 바구니' 가 탄생 하였죠. 

이를 쪼개서 생각하여보면 '물[재료]' + '담겨져있는' + '물' + '바구니'가 됩니다.

한번 프로그래밍으로 생각해볼까요?

 

물 바구니가 완성된곳에 물을 담았으니 물바구니[변수]를 선언을 한것이고 물을 바구니에 채운[초기화]것입니다.

 

이를 프로그래밍 문법으로 작성하면

String bucket = "water"; 가 됩니다.

 

이해되셨나요?

 

혹시라도 이해가 안되신분들을 위해 풀어서 이야기드리겠습니다.

 

'물' = 자료형 (String)

'바구니' = 변수명 (bucket)

'담겨져있는' = 연산자 ( = )

'물[재료]' = 데이터 ( "water" )

 

이런 느낌으로 변수를 이해하시면 편할겁니다.

 

공학적으로 이야기하면 어떤 이름을 가진 메모리 공간을 할당하여 그 공간 내부에 데이터를 저장하는것을 변수의 선언및 초기화라고 이야기합니다. 그리고 그 변수가 바로 메모리 공간에 붙여진 이름이고 변수를 통해 메모리 공간에 접근이 가능해지죠.

 

하지만 여기서 의문이 듭니다. 

 

공사장에서 바구니를 부르는 말은 바구니, 통, 빠께쓰 등등 수십가지가 있는데 우리는 해당 변수를 다른 이름으로 부르지못할까요?

 

아닙니다. 다른 이름을 붙일 수 있습니다.

 

int num1 = 1000;

 

변수를 하나 생성했는데 우리는 1000이라는 데이터가 담긴 공간에 접근하려면 num1이란 이름을 사용해야합니다.

 

하지만 다음과 같이 사용한다면 여러개의 이름을 붙일 수 있습니다.

 

int &num2 = num1;

int &num3 = num1;

int &num4 = num1;

int &num5 = num1;

 

이를 해석하면 num1에 대한 참조자 num2,num3,num4,num5 를 선언한다 입니다.

 

이러면 num1에 num2,num3,num4,num5 의 이름이 더 붙게되는거죠.

 

cout << num2 << num3 << num4 << num5 << num1 ;

 

을 하게된다면 모두 1000 이 출력되게 됩니다.

 

또한 참조자는 보시다싶이 여러개의 선언이 가능하고 참조자를 대신하여 참조자를 생성할 수 도 있습니다.

 

 

 

참조자의 선언 가능 범위

 

  • 참조자는 변수에 대해서만 선언이 가능
  • 선언과 동시에 누군가를 참조해야만 함
  • 상수를 대상으로 참조자 선언 불가
  • 미리 참조자를 선언했다가 다른 누군가를 참조하는것 불가
  • 참조자 NULL 초기화 불가
  • 배열에도 동일하게 적용

 

 

Call by Value & Call by Reference

 

  • Call - by - value      값을 인자로 전달하는 함수의 호출방식
  • Call - by - reference 주소 값을 인자로 전달하는 함수의 호출방식

 

 

참조자를 이용한 함수 호출 방식

 

#include <iostream>

using namespace std;

void SwapByRef(int &ref1, int &ref2) {
	int temp = ref1;
	ref1 = ref2;
	ref2 = temp;
}

int main(void)
{
	int val1 = 10;
	int val2 = 20;

	SwapByRef(val1, val2);
	cout << "val1 :" << val1 << endl;
	cout << "val2 :" << val2 << endl;

	return 0;
}

위 예제는 SwapByRef 함수가 매개인자를 주소 값으로 전달 받고 주소 값이 참조하는 값을 함수 내에서 서로 바꿔치기 하는 과정이다.

 

이를 출력하면 val1과 val2의 값은 서로 변경되어 

 

val1 : 20

val2 : 10

 

이 출력된다.