Call-by-Value vs Call-by-Reference
- Call by Value : 단지 인자의 값이 사용됨.
- Call by Reference : 인자는 변수이고, 온전한 변수가 사용됨. 메모리 주소 직접 접근.
Overloading
- 같은 함수 이름으로 두 가지 이상의 함수 정의가 주어질 때.
Fn argument로서의 array
void sumArray(double& sum, double a[], int size);
- 배열은 fn에서 값이 변경될 경우 반영되기 때문에 Call-by-Reference에 가깝다.
- 하지만, 배열은 메모리의 연속된 공간에 저장됨을 생각해보면 아래 3가지를 필요로 한다.
- 첫 번째 인덱스 변수의 주소(메모리 위치)
- 배열의 기본형(이는 각각의 인덱스 변수가 얼마만큼의 메모리를 사용하는 지 결정한다.)
- 배열의 크기(인덱스 변수의 개수)
- 배열이 함수의 인자로 사용될 때는 세 가지 정보 중 첫 번째만 함수에 주어진다. 또한, 기본형은 형식 매개변수의 기본형과 일치해야 하므로 함수는 배열의 기본형을 알고 있다.
- 따라서 배열의 크기는 함수가 알 수 없다.
- 즉, 컴퓨터는 배열이 얼마만큼의 인덱스 변수를 갖고 있는지 알지 못한다. 이것이 항상 배열의 크기를 별도의 int형으로 함수에게 알려줘야 하는 이유이며, Call-by-Reference와 엄연히 다른 이유이다.
생각해보면, 이렇게 사이즈를 규정짓지 않음으로서 오히려 다양한 크기의 배열이 해당 함수를 사용할 수 있다는 점에서 재사용률을 증가시켜준다는 걸 알 수 있다.
- 만약 배열의 값 변경을 막고싶다면 함수 헤드에서 선언해줘도 된다.
void showtheWorld(const int a[], int sizeOfa);
- 함수는 보통 int, double과 같은 기본형을 리턴한다. 만약 배열의 포인터를 사용한다면 유사하게 배열을 리턴해주는 함수를 작성할 수 있다.
-> or . ?
접근자로 ->와 .중에 뭘 써야 하는가?
객체를 가리킬 땐 .
포인터를 가리킬 땐 ->