static의 정의
#include <iostream>
#include <vector>
using namespace std;
int& fun()
{
static int x = 10;
return x;
}
int main()
{
fun() = 30;
cout << fun();
return 0;
}
static으로 정의해준 경우
첫 번째 코드에서는 fun() 함수가 정적 지역 변수인 'x'의 참조를 반환합니다. 정적 지역 변수는 함수가 호출될 때 생성되고 프로그램이 종료될 때까지 유지됩니다. 따라서 fun() 함수를 호출하여 x의 참조를 반환하고, 그 참조를 통해 'x'의 값을 변경할 수 있습니다.
그래서 fun()함수를 호출한 후에 x의 값을 30으로 변경하고 있습니다.
static으로 정의하지 않은 경우
하지만 static이 없는 int x = 10;이라고 정의를 해줄 경우 지역변수인 x의 참조를 반환합니다. x는 함수가 종료될 때 소멸되는 지역 변수로 인식되어 fun() 함수가 종료되면 x도 함께 종료됩니다. 따라서 fun() 함수를 호출하여 반환된 참조를 통해 x의 값을 변경하더라도 이 값의 함수가 종료되면서 소멸되었기 때문에 변경이 이루어지지 않습니다.
`
참조를 사용한 예시
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int x = 10;
int& ref = x;
ref = 20;
cout << " x = " << x << endl;
x = 30;
cout << "ref = " << ref << endl;
return 0;
}
먼저 x = 10을 통해 x 선언 및 초기화를 해줍니다. 그 다음 int & ref = x;를 통해 x의 참조인 ref를 선언합니다. 이는 ref가 x의 별칭이라는 뜻입니다.
ref = 20; 을 통해 ref가 가리키는 위치에 있는 값을 20으로 변경합니다. 이것은 실제로 x에 대한 변경이므로 x의 값이 변경되게 됩니다.
그리고 다시 x = 30으로 한다면 x의 값이 30으로 변경합니다. 이것은 ref랑 무관하게 x에 대한 직접적인 변경입니다. 그렇게 ref를 출력해주고 x의 값이 있는 30을 반환해줍니다.
배열의 특이한 요소
#include <iostream>
#include <vector>
using namespace std;
void func(int arr[])
{
arr[0]++, arr[1]++, arr[2]++;
}
int main()
{
int num[] = { 1, 2, 3 };
func(num);
cout << num[0] << " " << num[1] << " " << num[2];
}
배열 같은 경우 배열은 함수에 전달될 때 포인터로 전달됩니다. 함수의 매개변수로 배열을 선언하면 실제로는 배열의 첫 번째 요소를 가리키는 포인터로 처리됩니다. 이러한 동작은 배열이 함수에 전달될 때 배열의 복사본을 만드는 것을 방지하고 메모리를 절약하기 위한 것입니다.
따라서 함수 내에서 배열의 요소를 변경하면 원래 배열도 변경됩니다. 이것이 배열이 함수에 전달될 때 참조하는 방식입니다. 배열은 포인터가 아닙니다. 배열의 이름은 해당 배열의 첫 번째 요소를 가리키는 포인터로 해석되지만 이 포인터는 상수형이므로 변경할 수 없습니다.
따라서 배열의 이름 자체를 변경하는 것은 불가능하며 요소에 접근해서 값을 변경하는 것은 가능합니다.
#include <iostream>
#include <vector>
using namespace std;
void func(vector<int> v)
{
v[0]++, v[1]++, v[2]++;
}
int main()
{
vector<int> num{ 1, 2, 3 };
func(num);
cout << num[0] << " " << num[1] << " " << num[2];
}
같은 배열이라도 벡터를 이용한 배열은 다르게 작동하는데요. 벡터를 전달할 때는 기본적으로 값에 의한 전달이 발생합니다. 이는 벡터가 원본 벡터의 복사본이 되어 함수 내에서 변경되더라도 원본 벡터에는 영향을 주지 않습니다.
따라서 func 함수 내에서 v 벡터의 요소를 변경해도 원본 num 벡터는 변경되지 않습니다. 원본 벡터를 변경하기 위해서는 함수에 벡터를 참조 혹은 포인터로 전달해주어야 합니다.
'IT 프로그래밍 > 객체지향프로그래밍' 카테고리의 다른 글
[C++] 양의 정수 n을 받은 후 합을 구하는 프로그램 (0) | 2024.04.17 |
---|---|
[c++] 중복 숫자 제거 벡터 사용 (0) | 2024.04.17 |
객체지향프로그래밍 그룹액티비티 2문제 (0) | 2024.04.16 |
[C++] 피보나치 수열 초보자용 만들기 (0) | 2024.04.10 |
객체지향프로그래밍 그룹 액티비티 5번 문제 해설 (0) | 2024.04.10 |