본문 바로가기

코딩/객체지향프로그래밍

[C++] 함수(2)

출처: https://commons.wikimedia.org/wiki/File:Function_machine2.svg

 

 


 

1. Variable Scope(변수의 범위)

 1. Local Variables(지역 변수) : 함수 안에서만 존재하고 효과가 있는 변수, 함수 내부에서 선언&사용되다가 함수의 실행이 종료되면 소멸됨

#include <iostream>
using namespace std;

int makeDouble(int param) {
	int x; //makeDouble함수의 지역변수 x
	cout << "03: " << x << endl; //값 할당 안됨 -> 쓰레기값 출력
	x = param;
	cout << "04: " << x << endl; //param출력
	return param * 2;
}

int main() {
	int x = 10; //main함수의 지역변수 x
	cout << "01: " << x << endl; //01: 10
	x = makeDouble(x); //03: -1031346592(쓰레기값), 04: 10
	cout << "02: " << x << endl; //02: 20(10 * 2 함수 return값)
    
	return 0;
}
  • main함수의 x를 변화시킨다고 해서 makeDouble함수의 x까지 변화되지 않음 (서로 다른 변수이기 때문)

2. Global Variables(전역 변수) : 함수 내부에서 선언하는 게 아니라 함수 외부에서 선언되고 모든 함수에서 공유되어 다 쓸 수 있음

*)교수님은 (필요 이외에) 전역 변수 되도록이면 쓰지 않는게 좋다고 하심.. → 프로그램이 종료될 때까지 없앨 수 있는 방법이 없음(메모리 비효율적), 나중에 전역 변수에 무슨 값을 저장했는지 기억 안날 수도, local과 global의 이름이 같아서 충돌할 때의 우선순위는 local!! (변수 이름이 같을 때 local을 먼저 쓰고 없으면 global 씀)

#include <iostream>
using namespace std;

int x = 10; //전역 변수

int makeDouble(int param) {
	int x; //makeDouble함수의 지역변수 x, 값 할당 안됨
	cout << "03: " << x << endl; //03: -1031346592(쓰레기값)
	x = param; //param을 makeDouble의 지역변수 x에 저장
	cout << "04: " << x << endl; //04: 10(makeDouble의 지역변수 x)
	return param * 2;
}

int main() {
	cout << "01: " << x << endl; //01: 10(전역변수 x)
	x = makeDouble(x); //전역변수 x = 10을 makeDouble 함수로 전달, 함수 return값을 전역변수 x에 저장
	cout << "02: " << x << endl; //02: 20
    
	return 0;
}

 

2. Recursive function(재귀함수)

#include <iostream>
using namespace std;

int factorial(int n) { //재귀함수
	if (n == 0)
		return 1;
	else
		return n * factorial(n - 1);
}

int main() {
	cout << "0! = " << factorial(0) << endl;
	cout << "1! = " << factorial(1) << endl;
	cout << "6! = " << factorial(6) << endl;
	cout << "10! = " << factorial(10) << endl;
}
  • 자기자신 함수를 그 함수 내부에서 반복적으로 호출함
  • 반드시 termination condition(재귀 종료 조건)을 만들어야 함 → 종료 조건 걸지 않으면 무한대로 동작함
  • 메모리 사용량&계산량 증가로 요새는 권장하지 않고 잘 쓰이지 않음

 

3. Reference Variable(참조변수)

int& y = x; //y는 x의 별명!!
  • y는 x의 reference variable = x와 y가 동기화 됨 = y가 x의 별명
  • x값이 바뀌면 y값도 같이 바뀌고 반대도 성립 → x와 y가 같은 메모리 공간을 가리키기 때문에 x와 y는 100% 동일! (함수에서 중요하게 사용됨)
#include <iostream>
using namespace std;

int main() {
	int x = 5;
	int y = x;
	int& r = x; //r과 x 동기화
    
	cout << "x = " << x << endl;
	cout << "y = " << y << endl;
	cout << "r = " << r << endl; //x = 5, y = 5, r = 5
    
	cout << "x에 7 할당\n";
	x = 7;
	cout << "x = " << x << endl;
	cout << "y = " << y << endl;
	cout << "r = " << r << endl; //x = 7, y = 5, r = 7
    
	cout << "y에 8 할당\n";
	y = 8;
	cout << "x = " << x << endl;
	cout << "y = " << y << endl;
	cout << "r = " << r << endl; //x = 7, y = 8, r = 7
    
	cout << "r에 2 할당\n";
	r = 2;
	cout << "x = " << x << endl;
	cout << "y = " << y << endl;
	cout << "r = " << r << endl; //x = 2, y = 8, r = 2
    
	return 0;
}

 

4. 변수에 저장된 값 바꾸기

1. pass by value

#include <iostream>
using namespace std;

void swap_call_by_value(int a, int b) {
	int temp = a;
	a = b;
	b = temp;
}


int main() {
	int x = 3, y = 5;

	cout << "swap_call_by_value함수 사용 전" << endl;
	cout << "x = " << x << '\t' << "y = " << y << endl; //x = 3, y = 5
	cout << "swap_call_by_value함수 사용 후" << endl;
	swap_call_by_value(x, y);
	cout << "x = " << x << '\t' << "y = " << y << endl << endl; //x = 3, y = 5 그대로!!

	return 0;
}
  • 단순히 값을 복사 → swap함수 안에서만 바뀌고 함수 실행 종료되면 main의 x와 y값은 그대로

2. pass by reference

#include <iostream>
using namespace std;

void swap_call_by_reference(int &a, int &b) {
	int temp = a;
	a = b;
	b = temp;
}

int main() {
	int x = 3, y = 5;
	cout << "swap_call_by_reference함수 사용 전" << endl;
	cout << "x = " << x << '\t' << "y = " << y << endl; //x = 3, y = 5
	cout << "swap_call_by_reference함수 사용 후" << endl;
	swap_call_by_reference(x, y);
	cout << "x = " << x << '\t' << "y = " << y << endl; //x = 5, y = 3
    
	return 0;
}
  • a와 x, b와 y를 묶음 → swap함수 안에서 동작하는 a, b가 main에서 선언한 x, y이기 때문에 실질적으로 x와 y가 서로 바뀜
  • 메모리 효율이 좋음 (값을 복사할 필요가 없기 때문에) → 1. pass by value. 를 사용한다면 a, b, x, y 모두 메모리 공간을 차지함 2. pass by ref.는 a와 x, b와 y가 동일한 메모리 공간을 가리키고 사용함

*) int& r = x; 하고 swap(int a, int& b)에 swap(r, y)이라 한다고 해서 r과 x가 묶인 거지 r과 a가 reference로 묶인 건 아님!! (함수 실행 후 main에서 y는 r로 바뀌나 r은 &안걸려있기 때문에 그대로임)

 


 

*)sample codes: https://github.com/halterman/CppBook-SourceCode

반응형

'코딩 > 객체지향프로그래밍' 카테고리의 다른 글

[C++] String, File - 문자열과 파일 (1)  (0) 2020.07.23
[C++] 조건문과 반복문 (2)  (0) 2020.07.21
[C++] 조건문과 반복문 (1)  (0) 2020.07.18
[C++] 함수(1)  (0) 2020.07.14
[C++] C++ basic  (0) 2020.07.13