상세 컨텐츠

본문 제목

[TIL] 1 - 6. 객체지향 기본 문법 - 참조

언어/C++

by 민:하 2022. 2. 9. 08:54

본문

 

< C++에서의 변수의 종류 >

  • 일반 변수 : 일반 상수 저장 (숫자, 문자)     ex) int a = 7;
  • 포인터 변수 : 주소 상수 저장     ex) int *p = &a;
  • 참조 변수 : 기존 변수의 별명     ex) int &b = a;

 

< 함수 호출 기법 >

  • call by value : argument의 값을 전달
  • call by pointer : argument의 주소 전달
  • call by reference : argument의 이름 전달

1. 참조변수

참조변수는 이미 선언되어 있는 변수에 별명을 붙이는 것이다.

  • 참조변수를 만들 때에는 '&'(reference)기호를 사용
  • 참조형 변수는 주소값 추출과 역참조 연산이 자동으로 수행되는 특수한 포인터 변수
  • 참조 변수의 자료형은 참조대상이 되는 변수의 자료형과 동일
  • 참조에 대한 모든 수정사항은 참조형 변수가 가리키고 있는 실제 변수에 반영
  • 참조 변수는 선언과 동시에 참조하고자 하는 변수로 초기화 필수
  • 초기화 이후에는 참조 대상을 변경할 수 없음 (컴파일러에서 참조 변수의 메모리 접근을 차단)
  • 일반 함수 . 클래스의 멤버 함수의 parameter나 return type으로 사용 가능

▶ 참조 변수 : 일반 변수의 참조형

data - type  일반 변수명;
data - type  & 참조 변수명 = 일반 변수명;
포인터 참조 변수
int a = 10;
int *b = &a;
*b += 20;
int a  = 10;
int &b = a;
b += 20;

 

▶ 참조 포인터 변수 : 포인터 변수의 참조형

data - type  포인터 변수명;
data - type  & 참조 변수명 = 포인터 변수명;

 

▶ 참조 배열 : 배열의 참조형

data - type  배열명[n];
data - type  (& 참조 변수명)[n] = 배열명;

 


2. 포인터변수에 대한 참조변수

  • 참조변수는 비록 별명이지만 일반변수처럼 주소연산자로 주소값을 구할 수 있고 값을 포인터 변수에 저장하여 참조변수의 기억공간을 가르키게 할 수 있다.
1
2
3
4
int age = 10;
int &num = age;
int *p1 = &age;
int *p2 = &num;
cs

 

1
2
3
4
char message[] = "Hello, nice to meet you";
const char *str = message;
const char * &msg = str;
papa = "Nice to meet you, too";
cs

 


3. 참조 배열

  • 자주 사용되지는 않는다. call by reference보다 call by pointer가 훨씬 효율적이기 때문이다.
  • 참조 배열은 매개변수로 사용할 때 정확한 배열 크기를 입력해야하기 때문에 효율성이 안 좋다.


4. 매개변수에 사용되는 참조변수

  • 참조변수는 주로 함수의 매개변수로 사용
  • 참조변수를 매개변수로 사용하면 C언어에서 사용되었던 포인터변수의 역할을 대신 사용 가능
  • 매개변수를 참조변수로 사용하는 함수 호출기법을 call by reference 기법이라 함
  • call by reference 기법에서 argument의 값을 보호하려면 참조변수에 const 사용
  • 참조변수를 매개변수로 사용하려 할 때 const화 시키면 상수값도 전달인자로 받을 수 있는 장점
1
2
3
4
5
6
const char *name = "홍길동";
int age = 30;
double height = 175.3;
profile(name, age, height);
 
void profile(const char* const &np, const int &a, const double &h) { ... }
cs
  • 함수 오버로딩 시 주의 필요 (모호성으로 인한 에러 가능)
1
2
3
4
5
6
void func(int x, int y);
void func(int &x, int &y);
 
int a = 10;
int b = 20;
fun(a, b);
cs

 


5. 참조를 리턴하는 함수

  • 리턴값의 형태를 참조형으로 선언하면 피호출함수에서 사용하던 기억공간을 호출함수에서 공유할 수 있다.
  • 함수 호출부가 L-Value로 사용 가능하다. (단, const 참조를 리턴(=상수 리턴)하는 경우는 불가하다.)
  • 단, 리턴된 후에도 기억공간이 계속 유지되는 변수만 리턴해야 한다. (매개변수, 외부변수, 정적변수)
  • 리턴되면 기억공간이 사라지는 auto 변수를 리턴하면 컴파일이 가능은 하나, 데이터의 안전은 보장할 수 없다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
int &sub();
int num = 0;
 
int main(void) {
    int res;
    res = sub();    // res = num;
    sub() = 10;     // num = 10;
    sub()++;        // num++
    return 0;
}
 
int &sub() {
    num++;
    return num;
}
cs

 

관련글 더보기

댓글 영역