티스토리 뷰
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->멤버로 접근하게 된다.
'C++ << C & Java' 카테고리의 다른 글
C++ 클래스 예제 (2) - 자바 코드를 C++로 바꾸기 - Store 클래스 (0) | 2019.04.05 |
---|---|
C++ 객체 변수와 객체의 생성 및 소멸 (0) | 2019.04.01 |
C++에서 출력 포매팅 (0) | 2019.03.28 |
C++ 클래스 맛보기 (0) | 2019.03.28 |
Hello, C++!! (0) | 2019.03.28 |
- Total
- Today
- Yesterday
- 스트링 +
- python example
- TypeError
- 동적바인딩
- zip
- 콜렉션
- comparable
- contentEquals
- follow
- 이터러블
- 자바regex
- Iterator
- Camel Style
- 지연계산
- typedef
- CompareTo
- sort key
- 이터레이터
- C++ 클래스
- max
- python exercise
- APPEND
- indexof
- Lazy evaluation
- rust
- contains
- 패턴
- format
- 스트링
- ToString
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |