재바기
JaeTech
재바기
전체 방문자
오늘
어제
  • 분류 전체보기 (77)
    • Computer Vision (2)
    • 선형대수학 (9)
    • Papers (1)
    • 알쓸신잡 (7)
    • 삽질 기록 (0)
    • 3D\Multiview Geometry (10)
      • CS231A (10)
    • Computer Science (46)
      • Algorithm (14)
      • JavaScript (3)
      • C || C++ (5)
      • Git || Github (3)
      • Linux (2)
      • DL || ML (5)
      • Operating System (8)
      • Computer Network (0)
      • Database (1)
      • Effective Python (5)
      • Data Communication (0)
    • 회고 (0)
    • Latex (1)

블로그 메뉴

  • 홈
  • 태그

Github

공지사항

  • 주인장에 대해

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
재바기

JaeTech

(C++) 참조 변수
Computer Science/C || C++

(C++) 참조 변수

2021. 3. 2. 00:28
728x90

참조 변수

 

포인터를 선언할 때   * 기호를 이용하는 것은 낯설지가 않다.

참조 변수를 선언할 때는 &기호를 이용하여 선언을 해준다.

#include <iostream>

int main()
{
	using namespace std;
	
	int value = 3;

	int *ptr = &value;

	int &ref = value;

	cout << &value << endl;
	cout << &ref << endl;
	cout << ptr << endl;
	cout << &ptr << endl;

	return 0;
}
    

 

참조변수는 즉 다른말로 하면 어떤 특정한 변수의 별명이라고 할 수 있다. 위의 코드를 실행했을 때 왼쪽과 같은 주소값이 나온다. 즉, 참조변수 ref는 변수 value 의 별명이기 때문에 주소값도 같은 것이다.

 

 

참조변수는 반드시 선언시에 초기화를 해주어야 한다.

 

참조변수를 선언하고 초기화 해줄 때 상수 값을 넣어줄 수 없습니다. 상수 값 자체로 주소를 가질 수 없기 때문이다.

ref에서 value 의 값을 마음대로 바꿀 수도 있기 때문에 const 형식의 변수값은 초기화가 허용이 안된다.

 

 

대신 위와 같이 const 를 참조변수 앞에도 붙여주면 문법적으로 허용이 된다.

 

#include <iostream>

using namespace std;

void function(int n)
{
    n = 20;
    cout << "In function " << n << endl;
}

int main()
{
    int n = 10;
    
    cout << n << endl;
    
    function(n);
    
    cout << n << endl;
    
    return 0;
}

 

위와 같은 상황에서는 function 함수 내에서만 n이 유효한 것이므로 다시 함수를 나왔을 때는 n 의 값이 그대로 10 임을 알 수 있다.

 

 

 

#include <iostream>

using namespace std;

void function(int &n)
{
    n = 20;
    cout << "In function " << n << endl;
}

int main()
{
    int n = 10;
    
    cout << n << endl;
    
    function(n);
    
    cout << n << endl;
    
    return 0;
}

위와 같은 경우에는 n 의값이 20으로 바뀐 것을 확인할 수 있다. 포인터의 개념(인자에 포인터가 들어갈 때)과는 비슷하지만 reference 를 사용하게 되면 변수 자체가 함수에 넘어가게 되는 것이기 때문에 n의 값에 영향을 주게 되는 것이다. 또한 포인터를 이용할 때는 변수의 주소를 한 번 복사해주어야 하지만 이 경우에는 그럴 필요가 없기 때문에 퍼포먼스 측면에서도 더욱 효율적이다.

 

#include <iostream>

using namespace std;

struct A
{
	int a1;
	float a2;
};

struct B
{
	A A_a;
};

int main()
{
	B B_b;

	B_b.A_a.a1 = 1;
	
	return 0;
}

한 가지 용례가 더 있다. 위의 코드처럼 struct A 에 있는 a1 을 struct B를 통해

접근하려고 하면 B_b.A_a.a1 과 같이 접근을 해야 했다. 하지만 reference 를 이용하면

위와 같이 사용할 수 있다. 특히나 a1을 여러번 사용할 경우에는 더더욱 효율적이다.

 

참조(Reference)에 대해 배워보았다.

아직 실전적으로 많이 쓰지 않아서 유용성에 대해서는 체감하지 못했지만 실제로 많은 개발자들이 잘 사용하는 개념중의 하나라고 하니 익혀둬야겠다.

 

//피드백 및 문제제기 감사히 받겠습니다.

728x90
저작자표시 비영리 (새창열림)

'Computer Science > C || C++' 카테고리의 다른 글

(C++) 열거형(enumerated types)  (0) 2021.02.07
전역변수 앞에서의 extern 과 static  (0) 2021.02.07
헤더가드의 필요성  (0) 2021.01.27
첫 발걸음  (0) 2021.01.25
    'Computer Science/C || C++' 카테고리의 다른 글
    • (C++) 열거형(enumerated types)
    • 전역변수 앞에서의 extern 과 static
    • 헤더가드의 필요성
    • 첫 발걸음
    재바기
    재바기
    재박이의 테크블로그

    티스토리툴바