23년 C++ chap6 함수 -> 매개변수와 오버로딩 / 스코프와 수명
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) 초기화
-자동 지역 변수는 초기화하지 않으면 쓰레기값을 가짐
-전역 변수 / 정적 지역 변수는 초기화하지 않으면 기본값으로 초기화됨