2023 c++

23년 C++ chap6 함수 -> 매개변수와 오버로딩 / 스코프와 수명

gy8879 2023. 7. 19. 13:14

05 매개변수와 함수 오버로딩

1 기본 매개변수

-기본 매개변수를 사용해서 변수에 기본값을 지정할 수 있다

-기본 매개변수를 적용하려면 오른쪽에 위치하는 매개변수들에만 적용할 수 있다

ex) int test(int a, int b, int c, int d) -> (d), (c,d), (b,c,d), (a,b,c,d) 같이 오른쪽에 위치하는 것만 적용 가능

double calcEarnings(double rate, double hours = 40.0);

ㄴ> 이와 같이 적용할 수 있다

 

2 함수 오버로딩

-이름이 같은 함수를 2개 이상 정의하고 싶을 때

-시그니처: 함수들을 구분하기 위해 사용하는 기준 -> 함수 시그니처매개변수들의 자료형과 조합

int max(int a, int b)
{
	...
}
double max(double a, double b)
{
	...
}

ㄴ> 이와 같이 오버로딩할 수 있다

 

*다음 두 함수는 시그니처가 같으므로 오버로딩이 불가하다

int get()
{
	...
}
double get()
{
	...
}

 

06 함수의 사용 범위와 유지 기간

1 스코프

-소스 코드 내부에서 어떤 엔티티(상수, 변수, 객체, 함수 등)를 사용할 수 있는 범위

 

(1) 지역 스코프

-지역 스코프를 가진 엔티티는 선언된 위치부터 블록이 끝나는 부분(닫는 중괄호) 내부에서 사용 가능

-지역 스코프 주의사항

 

1-스코프 겹침 문제

int calculate(int num)
{
	int num = 0; // 오류 발생
    ...
}

ㄴ> 블록 내부에 같은 이름을 가진 엔티티 2개가 올 수는 없다(컴파일 오류 발생)

 

2-중첩 블록

ㄴ> 외부블록 선언된 엔티티는 내부 블록에서도 사용 가능한 넓은 스코프

       내부블록 선언된 엔티티는 내부 블록에서만 사용 가능한 좁은 스코프

 

3-지역 스코프의 셰도잉

-외부 블록과 내부 블록의 변수 이름이 같다면? -> 컴파일 오류가 발생하지 않는다

-BUT 함수 셰도잉 발생

-함수 셰도잉: 내부 블록의 엔티티가 외부 블록의 엔티티를 가려 외부 블록에 있는 엔티티 사용 불가능한 것

int main()
{
	int sum=5;
	cout << sum << endl;
	{
		int sum=3;
		cout << sum << endl;
	}
cout << sum << endl;
return 0;
}
실행결과
5
3
5

 

(2) 전역 스코프

-모든 함수의 외부에 선언된 엔티티는 전역 스코프를 갖는다

-범위 해결 연산자(::)

ㄴ> 셰도잉을 무시하고 전역 엔티티에 접근해야 하는 경우 사용

ㄴ> 왼쪽 형태에서는 스코프가 프로그램의 전역 스코프로 암묵적 지정

int num = 5;

int main()
{
	int num = 25;
    cout << "전역 변수 num의 값 = " << ::num << endl;
    cout << "지역 변수 num의 값 = " << num << endl;
    return 0;
}
실행결과
전역 변수 num의 값 = 5
지역 변수 num의 값 = 25

 

(3) 함수와 관련된 스코프

-함수는 함수를 선언한 시점부터 프로그램 마지막 부분까지 스코프로 갖는다

1-함수 이름의 스코프

ㄴ> 두 번째 경우, 함수 정의가 선언의 역할까지 함 -> 따라서 함수 이름의 스코프는 함수 헤더부터 프로그램 끝까지다

*프로토타입 = 선언

 

2-함수 매개변수의 스코프

-함수 매개변수는 함수 헤더부터 함수 블록이 종료될 때까지다

 

2 수명

(1) 자동 지역 변수

-함수가 호출될 때 생성되고, 함수가 종료될 때 소멸

-기본적으로 함수 내부 모든 지역 변수들은 자동 지역 변수이다

(2) 정적 지역 변수

-static 변경자를 앞에 붙여서 만든다

-프로그램이 종료되기 전까지 유지

-한 번만 초기화됨 -> 이후에는 초기화되지 않고 값 유지됨

(3) 초기화

-자동 지역 변수는 초기화하지 않으면 쓰레기값을 가짐

-전역 변수 / 정적 지역 변수는 초기화하지 않으면 기본값으로 초기화됨