Download presentation
Presentation is loading. Please wait.
1
http://www.ilit.co.kr cx8537@naver.com 최호성
2
Chapter 2 C++ 함수와 네임스페이스
3
디폴트 매개변수, 다중 정의, 인라인 함수, 네임스페이스
2장의 핵심 개념 디폴트 매개변수, 다중 정의, 인라인 함수, 네임스페이스 디폴트 매개변수 : 기본값을 정해서 함수 이름만 쓰면 함수를 호출합니다. 다중 정의 : 이름은 같지만 매개변수 구성이 다른 함수를 정의합니다. 인라인 함수 : 함수와 매크로의 장점을 모았습니다. 네임스페이스 : 함수, 변수 등에 소속을 부여하고 보다 체계적으로 관리할 수 있습니다.
4
함수 매개변수의 디폴트 값을 선언에 명시하는 문법. 호출자 코드에서 실인수를 생략한 채 호출할 수 있다.
디폴트 매개변수 함수 매개변수의 디폴트 값을 선언에 명시하는 문법. 호출자 코드에서 실인수를 생략한 채 호출할 수 있다. #include "stdafx.h" #include <iostream> // nParam 매개변수의 디폴트 값은 10이다. int TestFunc(int nParam = 10) { return nParam; } int _tmain(int argc, _TCHAR* argv[]) // 호출자가 실인수를 기술하지 않았으므로 디폴트 값을 적용한다. std::cout << TestFunc() << std::endl; // 호출자가 실인수를 확정했으므로 디폴트 값을 무시한다. std::cout << TestFunc(20) << std::endl; return 0;
5
매개변수가 여럿이면 오른쪽 매개변수부터 디폴트 값을 선언할 수 있다.
디폴트 매개변수 매개변수가 여럿이면 오른쪽 매개변수부터 디폴트 값을 선언할 수 있다. #include "stdafx.h" #include <iostream> int TestFunc(int nParam1, int nParam2 = 2) { return nParam1 * nParam2; } int _tmain(int argc, _TCHAR* argv[]) std::cout << TestFunc(10) << std::endl; std::cout << TestFunc(10, 5) << std::endl; return 0;
6
디폴트 매개변수 피호출자 함수 매개변수의 디폴트 값을 반드시 오른쪽 매개변수부터 기술한다.
문법 및 활용상 주의사항 피호출자 함수 매개변수의 디폴트 값을 반드시 오른쪽 매개변수부터 기술한다. 호출자가 정의한 실인수는 왼쪽 매개변수에서부터 순서대로 매핑된다. 매개변수가 여럿이고 왼쪽 첫 번째에 대해 디폴트 값을 선언하려면 오른쪽 모든 매개변수에 대해 디폴트 값을 선언해야 한다. 따라서 다음과 같은 선언은 불가능하다. int TestFunc(int nParam1 = 5, int nParam2, int nParam3 = 10);
7
함수 다중 정의 이름이 같은 함수를 여러 번 정의하는 문법이다.
Function overloading 이름이 같은 함수를 여러 번 정의하는 문법이다. 이름은 같더라도 매개변수 구성은 다르게 선언 및 정의해야 한다. 디폴트 매개변수 문법과 조합됐을 때 대상함수 식별에 대한 ‘모호성’ 발생할 수 있으므로 주의해야 한다. 함수 템플릿으로 대체할 수 있다.
8
함수 다중 정의 int Add(int a, int b, int c) int Add(int a, int b)
이름이 같은 함수 여러 개가 공존하는 문법이다. int Add(int a, int b, int c) { std::cout << "Add(int, int, int): "; return a + b + c; } int Add(int a, int b) std::cout << "Add(int, int): "; return a + b; double Add(double a, double b) std::cout << "Add(double, double): ";
9
함수 템플릿 template <typename T> 에서 T는 자료형이다.
자료형에 대해 의존성이 없는 함수를 정의하는 문법이다. template <typename T> 에서 T는 자료형이다. 템플릿은 일종의 틀이며 판화를 인쇄하는 것처럼 함수를 인쇄하기 위한 원본이다. template <typename T> T Add(T a, T b) { return a + b; } int _tmain(int argc, _TCHAR* argv[]) std::cout << Add(3, 4) << std::endl; std::cout << Add(3.3, 4.4) << std::endl; return 0;
10
inline 함수는 매크로의 장점을 함수에 적용한 특수 함수이다.
인라인 함수 inline 함수는 매크로의 장점을 함수에 적용한 특수 함수이다. 컴파일러 최적화에 대해서는 C언어의 const, volatile 형한정어에 대해 적용하는 이론과 동일하다. 다음 두 온라인 강좌를 참고한다. (독하게 시작하는 C 프로그래밍 15장 변수와 상수 고급이론 강좌) Alt + F7(프로젝트 속성) > 구성속성 > C/C++ > 최적화 순으로 선택하고 오른쪽 목록에서 인라인 함수 확장에 대해 살펴본다.
11
inline 함수는 매크로의 장점을 함수에 적용한 특수 함수이다.
인라인 함수 inline 함수는 매크로의 장점을 함수에 적용한 특수 함수이다. 인라인 함수는 외형상 함수이나 컴파일 과정에서 함수가 아닌 일반 구문으로 처리된다. 함수 호출시 Stack frame에 변화가 없다. 일반 선언 앞에 inline 예약어를 붙여 선언한다. 일반적으로 컴파일러가 알아서 inline 확장을 시도한다. 따라서 굳이 inline이라고 선언하지 않더라도 inline 함수로 번역될 수 있다. 컴파일러 최적화와 밀접하게 관련된 문법이다.
12
네임스페이스 namespace TEST {
int g_nData = 100; void TestFunc(void) std::cout << "TEST::TestFunc()" << std::endl; } int _tmain(int argc, _TCHAR* argv[]) TEST::TestFunc(); std::cout << TEST::g_nData << std::endl; return 0;
13
using 선언을 통해 네임스페이스를 생략할 수 있다.
// std 네임스페이스를 using 예약어로 선언한다. using namespace std; namespace TEST { int g_nData = 100; void TestFunc(void) // cout에 대해서 범위를 지정을 하지 않아도 상관없다. cout << "TEST::TestFunc()" << endl; } // TEST 네임스페이스에 using 선언을 한다. using namespace TEST; int _tmain(int argc, _TCHAR* argv[]) // TestFunc()나 g_nData에 대해서도 범위 지정을 할 필요가 없다. TestFunc(); cout << g_nData << endl; return 0;
14
네임스페이스를 중첩해 선언할 수 있다. 그리고 속한 네임스페이스가 다르다면 이름이 같은 변수라도 다른 변수로 취급된다.
네임스페이스를 중첩해 선언할 수 있다. 그리고 속한 네임스페이스가 다르다면 이름이 같은 변수라도 다른 변수로 취급된다. namespace TEST { int g_nData = 100; namespace DEV int g_nData = 200; namespace WIN int g_nData = 300; } int _tmain(int argc, _TCHAR* argv[]) cout << TEST::g_nData << endl; cout << TEST::DEV::g_nData << endl; cout << TEST::DEV::WIN::g_nData << endl; return 0;
15
식별자 검색 순서 현재 블록 범위 현재 블록 범위를 포함하고 있는 상위 블록 범위. (최대 함수 몸체까지)
전역 함수인 경우 현재 블록 범위 현재 블록 범위를 포함하고 있는 상위 블록 범위. (최대 함수 몸체까지) 가장 최근에 선언된 전역 변수나 함수 using 선언된 네임스페이스 혹은 전역 네임스페이스. 단, 두 곳에 동일한 식별자가 존재할 경우 컴파일 오류 발생
16
식별자 검색 순서 현재 블록 범위 현재 블록 범위를 포함하고 있는 상위 블록 범위. (최대 함수 몸체까지) 클래스 멤버
클래스 메서드인 경우 현재 블록 범위 현재 블록 범위를 포함하고 있는 상위 블록 범위. (최대 함수 몸체까지) 클래스 멤버 부모 클래스 멤버 가장 최근에 선언된 전역 변수나 함수 호출자 코드가 속한 네임스페이스의 상위 네임스페이스 using 선언된 네임스페이스 혹은 전역 네임스페이스. 단, 두 곳에 동일한 식별자가 존재할 경우 컴파일 오류 발생
Similar presentations