티스토리 뷰

C++ << C & Java

C++의 참조형

plas 2019. 3. 28. 16:34

C++의 큰 특징 중 하나로 참조형을 들 수 있다. 이것은 C와도 다르고 자바와도 다른 상당히 독창적인 기능을 제공한다. 참조형은 객체의 매개변수 전달이나 반환형 등에서 강력한 기능을 제공하여 C++의 세련된 코드를 가능하게 한다.

먼저 참조형이 무엇인지 살펴보자. 참조형이란 포인터와 비슷하게 뭔가를 가리키는 변수를 선언할 수 있게 해준다. 자바의 객체 참조 변수와 비슷한데 C++의 참조형은 포인터가 그렇듯이 기본 타입도 가리킬 수 있다. 또한 그 변수에 할당된 공간을 바로 가리켜서 자바와는 다른 용법으로 사용된다.

int a;
int& aRef = a;
int* aptr = &a;

aptr와 같이 aRef는 a에 할당된 공간을 가리킨다. 그렇지만 초기화할 때 aRef는 a 그 자체를 참조하는 것처럼 지정된다. 사용도 좀 달라진다.

a = 55;
aRef = 70;
*aptr = 80;

aRef는 이와 같이 a가 사용될 수 있는 곳이면 어디든지 a와 똑같이 쓰인다. 이것은 함수 호출 시에 편리한데 다음 두 swap 함수 코드를 비교해 보자.

void ptrswap(int* ap, int* bp) {
   int temp = *ap;
   *ap = *bp;
   *bp = temp;
}
void refswap(int& ar, int& br) {
   int temp = ar;
   ar = br;
   br = temp;
}

두 수 a, b를 서로 값을 바꾸기 위해서는 그냥 int 매개변수만 전달해서는 호출부의 변수 값을 바꿀 수 없다. C에서는 포인터를 이용하여 주소를 보내고 그 주소에 있는 값을 바꾸는 ptrswap을 써야 한다. C++은 참조 매개변수를 이용하여 두 번째와 같이 할 수 있다. 호출부도 달라진다.

int a, b;
cin >> a >> b;
ptrswap(&a, &b);
refswap(a, b);

이와 같이 호출부에서도 &를 안 붙여도 되고 그 함수 안에서도 *을 안 붙여도 되므로 상당히 편리하다. 조심. 이 코드를  그대로 실행하면 a, b의 값이 두 번 바뀌어서 그대로 남아있을 것이다.

참조형의 용도는 여기서 끝나지 않는다. 반환값을 참조형으로 한 경우 우리는 함수 호출 결과에 또다른 값을 저장할 수 있다.

int& increase(int& pt) {
   pt++;
   return pt;
}
void main() {
   int point=0;
   increase(point) += 10;
}

이 코드는 point를 increase한 함수가 다시 point의 참조를 돌려주므로 함수 호출부가 그대로 지정문의 좌변에 나타날 수 있다. 이것은 의외로 강력한 기능이 될 수 있는데, 나중에 살펴보겠지만 연산자 오버로딩에서 참조형을 통해 연산자의 연속된 적용이 가능해 진다.

여기서 한가지 참조형의 중요한 역할을 살펴보자. Student 객체를 매개변수로 넘길 때 다음의 세 가지 방식은 각각 다른 의미를 가진다.

class Student {
    ...
public:
    ....
    int compare(Student st);
    int compare(Student& stRef);
    int compare(Student* stp);
}

첫번째는 매개변수 st가 생성되고 호출한 쪽에서 넘겨준 Student 객체를 st에 복사한다. 즉 새로운 학생을 하나 더 만들어 값을 복사하여 전달한다. (값에 의한 전달) 이 때 복사를 하려면 복사생성자 또는 복사지정연산이 있어야 하는데 이것은 좀더 복잡한 문제이므로 일단 덮어두자. 두번째는 참조를 넘기므로 같은 객체에 대한 참조를 stRef가 가져간다. 세 번째는 포인터를 넘겨야 하므로 주소 연산자를 붙여서 전달하게 된다. 각 함수의 코드 안에서 사용은 st와 stRef가 같아서 객체.멤버로 접근하게 될 것이다. 반면에 stp는 포인터이므로 stp->멤버로 접근하게 된다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함