상세 컨텐츠

본문 제목

C++ 참조자

Study/C++

by Ha학생 2023. 9. 5. 13:44

본문

안녕하세요 하학생입니다. 오늘은 참조자 클래스에 대해 공부를 진행했습니다.

재미있게 봐주세요!!

 


참조자(래퍼런스 - reference)

C언어에서 어떤 변수를 가리키고 싶을 때 포인터를 사용합니다.

하지만 C++에서는 다른 변수나 상수를 방법을 참조자라고 부릅니다.

#include <iostream>

int main() {
	int value = 3;
	int& conference = value;

	std::cout << "value : " << value << std::endl;
	std::cout << "conference : " << conference << std::endl;

	return 0;
}

참조자를 사용하는 방법은 다음과 같습니다.

C언어에서 포인터 사용하는 방법과 좀 다르다는 것을 확인할 수 있습니다.

 

만약 conference값을 3에서 10으로 바꾸면 어떻게 될까요?

 

#include <iostream>

int main() {
	int value = 3;
	int& conference = value;


	conference = 10;
	std::cout << "value : " << value << std::endl;
	std::cout << "conference : " << conference << std::endl;

	return 0;
}

conference 값을 3에서 10으로 바꾸면 다음 결과와 같이 value 값도 바뀌는 것을 알 수 있었습니다. 

 

참조자와 포인터는 상당히 유사한 개념입니다.

 

하지만 참조자와 포인터의 차이점

 

1. 참조자는 반드시 처음에 누구의 별명이 될 것인지 지정해야 합니다,

 

int value = 3;
int& conference = value
    
    
int* pointer;

위 코드와 같이 포인터인 경우 정의할 때 변수를 가리킬 필요가 없지만 참조자는 어떠한 변수를 지정해야 합니다.

 

 

2. 한번 어떤 변수의 참조자가 된다면 다른 변수의 참조가 될 수 없습니다.

 

int value = 3;
int& conference = value;

int a=10;
conference = a;
//안됨

위 코드와 같이 한다면 a=value가 동일한 값으로 변해 포인터와 다르게 참조를 바꾼다고 해서 원래 value값이 남아 있지 않습니다.

 

3. 참조자는 메모리상 존재하지 않을 수도 있다. 

 

포인터에서는 메모리상 어떠한 길이를 차지하게 됩니다. 하지만 참조자에서는 해당 변수의 메모리상 위치만 바꿔치기하면 되기 때문에 메모리상 존재하지 않습니다. 

 

 

 

함수 인자로 레퍼런스 받기

#include <iostream>

int reference_function(int& p) {
	p = 15;

	return 0;
}
int main() {
	int number = 10;

	std::cout << number << std::endl;
	reference_function(number);
	std::cout << number << std::endl;
}

 

함수에서 참조자로 받을 땐 왜 오류가 안 뜰까? 

사실 int& p = number이라고 생각하면 맘에 편할 거 같습니다. 

 

다음 코드를 실행해 보면

사진과 같이 값이 나오는 것을 알 수 있습니다. 

 

 

레퍼런스의 배열과  배열의 레퍼런스

 

레퍼런스의 배열은 결과로 말씀드리자면 안됩니다, 

이유는 문법 상 배열의 이름은 첫 번째 원소의 주소값으로 변환이 가능해야 합니다. 

하지만 레퍼런스는 특별한 경우가 아닌 이상 메모리상에서 공간을 차지 않기 때문에 배열을 정의하는 것은 

C++에서는 안됩니다. 

 

하지만 배열의 레퍼런스는 가능합니다, 

#include <iostream>

int main(){
    char arr[5] = {'H','A','P','P','Y'};
    char(&ref)[5]=arr;
    
    ref[0]='w';
    ref[1]='o';
    ref[2]='m';
    ref[3]='e';
    ref[4]='n';
    std::cout << arr[0] << arr[1] << arr[2]<<arr[3]<<arr[4] << std::endl;
    return 0;
}

다음 코드를 실행해 보면 결과는 사진과 같이 나옵니다. 

ref가 arr 배열을 참조하도록 했습니다.  그러면 ref [0]은 arr [0]을 참조하고 ref [1]은 arr [1]를 참조합니다.

 

 

레퍼런스를 리턴하는 함수

 

#include <iostream>

int& function(int& a) {
    int b = 10;
    a = a + b;

    return a;
}

int main() {
    int a = 10;
    int& reference = function(a);
    std::cout << reference << std::endl;
    return 0;
}

함수에서 레퍼런스 값으로 리턴은 다음과 같이 가능합니다.

여기서 주의 사항은 레퍼런스 변수로 함수를 실행해줘야 합니다. 

또 지역변수를 리턴할 때 스택에서 사라집니다.

지역 변수를 레퍼런스로 리턴해주고 있을 때에는 문제가 생길 수도 있습니다.

 

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

C++ 백준 10828번  (0) 2023.09.14
C++ 생성자 초기화 리스트, const,static변수 등등  (0) 2023.09.10
C++ 복사 생성자,소멸자  (0) 2023.09.10
C++ New,Delete, Class  (0) 2023.09.06
C++ 기초  (0) 2023.09.04

관련글 더보기

댓글 영역