* 블로그에 작성된 따라배우는 C++ 관련 모든 코드와 사진들의 저작권은 강의의 저자이신 홍정모 교수님께 있습니다.
인프런 사이트(www.inflearn.com)의 '홍정모의 따라하며 배우는 C++' 유료강좌를 실제로 구매하였고
강의를 수강하며 제 스스로 복습 및 내용 정리를 위해
강의에 나오는 코드들을 따라친 코드와 교수님의 말씀, 그리고 강의에 나오는 사진들을
활용하였음을 미리 알립니다.
마지막으로, 좋은 강의를 제작해주신 홍정모 교수님께 감사드립니다.
______________________________________________________________________________________________
인자를 참조로 받았기 때문에 값과 주소값이 일치한다.
C와 C++의 경우 일반적으로 함수에서 return할 수 있는 값이 하나 뿐이다.
보통 이제 여러 값들을 한번에 반환하고 싶다면, 구조체로 묶어서 보낸다거나, tuple로 보내는 법이 있지만 그건 추후 사진에..
그래서 흔히 전통적으로 쓰던 방식이 인자로 값들을 받을 때 입력받는 값, 즉 변경시키지 않을 값은 const로.
내가 이 값들을 받아 수정해서 반환하고 싶다면 참조로 받는 것이다.
그러면 특정 함수에서 그 값들을 가지고 조작을 하면 따로 return을 안해줘도 자연스레 값이 수정되니까.
Error.
우리가 이미 배운 개념이다.
int& x = 5; 이건 틀린 문법이다. 참조는 말 그대로 다른 변수의 별명이라고 우리는 약속했다.
상수엔 해당이 안된다.
굳이 상수를 ref하고 싶다면, const로 받아야한다.
const int& x = 5; 이렇게. 근데 굳이 ref로 받아야하나 이러면 ㅋㅋ... 그냥 value로 받으면 되지 않을까?
내 개인적인 생각엔 함수의 인자에 상수, 변수 둘다 넣을 수 있게 해주려고 할 때 쓰면 유용할 듯 싶다.
그렇다면 포인터를 참조로 받는 경우는?
똑같다. 참조니까!
다만 헷갈릴 수 있는 부분은 int*& ptr이렇게 되어있으니 이해할 땐 (int*)& ptr로 하는게 좋다.
정 힘들면 typedef를 이용해서 봐도 좋고!
그냥 일반적인 정적배열을 참조로 보내려면
int(&arr)[4] 이렇게 배열의 갯수도 직접 입력해줘야하고 보기가 조금 까다롭다.
그래서 실제로는 std에 정의된 vector나 array를 활용해서 인자로 전달한다.
이러면 매우 좋은 점이 그냥 자료형으로 보이기 때문에 그냥 vector<int>& arr 이렇게 이해하기가 직관적이다.
항상 주의하는 거.
포인터 변수 예를 들어
void foo(int * ptr) 라고 한다면 ptr은 foo 함수 내에서만 존재하는 지역변수, 즉 새로운 변수이다.
착각하면 안됨. 그니까 그냥 main의 ptr과 foo의 ptr은 엄연히 다른 변수임.
일반적인 값을 return하는 함수를 작성하고 그 return 값을 value 라는 int형 변수가 받는다.
좋다.
근데 만약 반환하는 값이 구조체나 클래스처럼 크다면?
calll by value이기에 값을 다 복사하기 때문에 시간이 오래걸리겠지. 효율성도 떨어지고.
그렇다면 call by reference로 한다면?
주소값을 반환하고 이걸 포인터로 받으면 되겠지.
하지만 매우 주의할 점이 있다.
어떤 함수를 return 하고 종료하면 거기서 선언된 변수들은 사라진다.
내가 주소값을 반환하고 함수가 종료되면 그 주소값이 가리키는 변수가 없어져버릴 수도 있잖아?
그래서 주의해서 써야함.
return을 참조로 한다면
생각보다 편리하다. 배열을 참조로 가져가서 그걸 수정하거나 return하면 편리.
아니면 여러 값들을 한번에 return 하기 위해 tuple이라는 것도 있다.
좋은 점 확실히 있지만, 저렇게 get<0>, get<1> 이렇게 순서를 알고 있어야하니 또 어떻게 보면 불편할 수도.
최근 C++ 17 문법에서는 auto [ ] 라는 것도 지원한다.
이런게 있구나 정도 알자.
++) 오늘 원래는 chapter 7을 다 끝내려 했는데 이 게으른 몸, 반절밖에 못했다..
내일은 끝내야지..
'C++(따라하며 배우는 C++)' 카테고리의 다른 글
Chapter 7-(4). 함수 (0) | 2021.09.07 |
---|---|
chapter 7-(3). 함수 (0) | 2021.09.06 |
chapter 7-(2) . 함수 (0) | 2021.09.04 |
chapter 6-(2). 행렬, 문자열, 포인터, 참조 (0) | 2021.08.31 |
chapter 6-(1). 행렬, 문자열, 포인터, 참조 (0) | 2021.08.31 |