(수근수근)

참조(Reference) 본문

C++

참조(Reference)

InformationFarm 2020. 9. 11. 10:34

C에서 포인터의 역할이 많은 문제를 가지고왔고, 자바는 이런 포인터의 역할을 제한한 언어이다.

C++ 포인터의 역할을 좀 더 안전하게 사용하기 위해 참조를 제공하고 있다.

 

참조의 종류

  • 값에 의한 호출
  • 참조에 의한 호출
  • 포인터

값에 의한 호출

void swap(int argNum1, int argNum2) 
{
	int temp = argNum1;
	argNum1 = argNum2;
	argNum2 = temp;
}


int main{
	int num1 = 28;
	int num2 = 37;

	swap(num1, num2);
}

1) main함수에 변수인 num1(1111), num2(1112) 는 메모리에 쌓인다. (괄호가 메모리주소)

2) swap함수 불리면 argNum1(2223), argNum2(2224)에 새로운 메모리가 쌓이며

   main 에 사용된 변수인 28,37을 값 복사한다.

3) swap함수의 변수의 값이 37,28로 저장이 되고 나면 메모리에서 사라진다.(main은 전혀 영향 없음)

4) main 의 변수들은 값에 의해 복사되었었기 때문에, 값은 그대로 저장되어있다.

 

참조에 의한 호출

void swap(int* num1, int* num2) 
{
	int temp = *num1;
	*num1 = *num2;
	*num2 = temp;
}


int main{
	int num1 = 28;
	int num2 = 37;

	swap(&num1, &num2);
}참조에 의한 호출

=> 값에 의한게 아니라 참조 주소값을 주었기 때문에 두개의 주소값에 대한 값이 바뀌어 

      swap함수가 끝나면 num1, num2의 값이 변경이 된다.

 

JAVA

- 자바 객체는 참조에 의한 전달(원본을 고치느냐), 객체가 아니면 값에 의한 복사가 된다.

- 포인터 연산자가 없기 때문에 주소를 바꿀 수 없다.

- 이 포인터를 포기하며 성능을 줄였지만, 그 대신 개발자의 오류를 줄여준다.

 

 

참조 in c++

- 별명을 짓는다

  : 나를 부를 수 있는 호칭을 soon이라는 별명을 지어 다르게 부른다

  : String name = "배수지";

    String& alias =name; 

  : &  => 이것은 참조라는 것을 의미한다.

 

- 참조는 NULL이 불가능하다

  : String& reference = NULL;  => 컴파일에러

 

- 초기화 중에 반드시 선언되어야 한다.

  : String& reference;   => 컴파일에러

 

- 참조하는 대상을 바꾸는 것은 불가능!!!!

String name1 = "배수지";
String name2 = "오나미";

String& reference = name1;
reference = name2;

순수하게 값을 대입하는 것이다 모두가 오나미라는 값이 되는 것이다.

모든 이름이 오나미가 된다

 

void swap(int& num1, int& num2) 
{
	int temp = num1;
	num1 = num2;
	num2 = temp;
	
}

- num1, num2는 NULL값이 아니기 때문에 값이 유효함을 확인가능

- 메모리를 가지고 올 수 없다. 

 => 참조는 안전하다!


참조 = 포인터?

참조, 포인터에 대한 구분을 했는데 결국에 둘다 메모리 주소값을 통해서 연산을 한다.

그럼 둘이 같은 것일까 비슷한 것일까 다른 것일까? 

관점에 따라 다를 것 같다.

 

사용하는 개발자의 입장에선 비슷하거나 다르다고 생각할 것 같다.

포인터로 하면 문제가 발생하지만 참조를 통해 문제를 줄이고, 같은 상황에도 다른 결과를

가지고 올 수 있기 때문이다.

 

컴퓨터입장에서는 같은 것이라고 한다.

어셈블리어 단으로 가게되면 컴파일러는 기계가 이해할 수 있도록 포인터와 참조는 같은 명령어를

가지고 있다고 한다. C -> C++로 오면서 포인터 때문에 발생하는 문제들이 많아져서 제약사항, 그러한 문제점을

해결하기 위해 만든 것이기 때문이다.

'C++' 카테고리의 다른 글

MFC 함수 정리  (0) 2020.06.22
[C++] INI 파일 읽고 쓰기  (0) 2020.05.21
[2] C 메모리와 포인터  (0) 2020.05.19
[1] C 시작하기  (0) 2020.05.19
[C++] #define 대신 const enum inline  (0) 2020.05.18
Comments