(수근수근)
참조(Reference) 본문
C에서 포인터의 역할이 많은 문제를 가지고왔고, 자바는 이런 포인터의 역할을 제한한 언어이다.
C++ 포인터의 역할을 좀 더 안전하게 사용하기 위해 참조를 제공하고 있다.
참조의 종류
- 값에 의한 호출
- 참조에 의한 호출
- 포인터
값에 의한 호출
void swap(int argNum1, int argNum2)
{
int temp = argNum1;
argNum1 = argNum2;
argNum2 = temp;
}
int main{
int num1 = 28;
int num2 = 37;
swap(num1, num2);
}
1) main함수에 변수인 num1(1111), num2(1112) 는 메모리에 쌓인다. (괄호가 메모리주소)
2) swap함수 불리면 argNum1(2223), argNum2(2224)에 새로운 메모리가 쌓이며
main 에 사용된 변수인 28,37을 값 복사한다.
3) swap함수의 변수의 값이 37,28로 저장이 되고 나면 메모리에서 사라진다.(main은 전혀 영향 없음)
4) main 의 변수들은 값에 의해 복사되었었기 때문에, 값은 그대로 저장되어있다.
참조에 의한 호출
void swap(int* num1, int* num2)
{
int temp = *num1;
*num1 = *num2;
*num2 = temp;
}
int main{
int num1 = 28;
int num2 = 37;
swap(&num1, &num2);
}참조에 의한 호출
=> 값에 의한게 아니라 참조 주소값을 주었기 때문에 두개의 주소값에 대한 값이 바뀌어
swap함수가 끝나면 num1, num2의 값이 변경이 된다.
JAVA
- 자바 객체는 참조에 의한 전달(원본을 고치느냐), 객체가 아니면 값에 의한 복사가 된다.
- 포인터 연산자가 없기 때문에 주소를 바꿀 수 없다.
- 이 포인터를 포기하며 성능을 줄였지만, 그 대신 개발자의 오류를 줄여준다.
참조 in c++
- 별명을 짓는다
: 나를 부를 수 있는 호칭을 soon이라는 별명을 지어 다르게 부른다
: String name = "배수지";
String& alias =name;
: & => 이것은 참조라는 것을 의미한다.
- 참조는 NULL이 불가능하다
: String& reference = NULL; => 컴파일에러
- 초기화 중에 반드시 선언되어야 한다.
: String& reference; => 컴파일에러
- 참조하는 대상을 바꾸는 것은 불가능!!!!
String name1 = "배수지";
String name2 = "오나미";
String& reference = name1;
reference = name2;
순수하게 값을 대입하는 것이다 모두가 오나미라는 값이 되는 것이다.
모든 이름이 오나미가 된다
void swap(int& num1, int& num2)
{
int temp = num1;
num1 = num2;
num2 = temp;
}
- num1, num2는 NULL값이 아니기 때문에 값이 유효함을 확인가능
- 메모리를 가지고 올 수 없다.
=> 참조는 안전하다!
참조 = 포인터?
참조, 포인터에 대한 구분을 했는데 결국에 둘다 메모리 주소값을 통해서 연산을 한다.
그럼 둘이 같은 것일까 비슷한 것일까 다른 것일까?
관점에 따라 다를 것 같다.
사용하는 개발자의 입장에선 비슷하거나 다르다고 생각할 것 같다.
포인터로 하면 문제가 발생하지만 참조를 통해 문제를 줄이고, 같은 상황에도 다른 결과를
가지고 올 수 있기 때문이다.
컴퓨터입장에서는 같은 것이라고 한다.
어셈블리어 단으로 가게되면 컴파일러는 기계가 이해할 수 있도록 포인터와 참조는 같은 명령어를
가지고 있다고 한다. C -> C++로 오면서 포인터 때문에 발생하는 문제들이 많아져서 제약사항, 그러한 문제점을
해결하기 위해 만든 것이기 때문이다.
'C++' 카테고리의 다른 글
MFC 함수 정리 (0) | 2020.06.22 |
---|---|
[C++] INI 파일 읽고 쓰기 (0) | 2020.05.21 |
[2] C 메모리와 포인터 (0) | 2020.05.19 |
[1] C 시작하기 (0) | 2020.05.19 |
[C++] #define 대신 const enum inline (0) | 2020.05.18 |