본문 바로가기
C++/이것이 C++이다

[Chapter 02] C++ 함수와 네임스페이스 연습문제

by HHack 2024. 3. 21.
반응형

1. 다음 두 함수 원형에서 잘못된 점은 무엇인지 답하시오.

int TestFunc1(int nParam1 = 5, int nParam2, int nParam3 = 10)
int TestFunc2(int nParam1 = 5, int nParam2)

답 : TestFunc1과 TestFunc2 둘 다 디폴트 매개변수를 사용하기 위해선 오른쪽부터 디폴트 매개변수를 채워나가야 하지만 1번 경우는 중간에 디폴트 매개변수를 선언하지 않았으며 2번은 오른쪽부터가 아닌 왼쪽부터 채워 오류가 발생합니다.

 

2. 다음 두 함수는 문법적으로 문제가 없습니다. 하지만 호출하는 코드에서는 문제가 발생할 수 있습니다. 어떤 문제인지 답하세요.

void TestFunc(int a) {
	std::cout << "TestFunc(int)" << std::endl;
}

void TestFunc(int a, int b = 10) {
	std::cout << "TestFunc(int, int)" << std::endl;
}

답 : 호출 시 문제는 위 두 함수가 선언되어 있다면 TestFunc(int a) 함수는 호출할 수 있는 방법이 없습니다. 함수 호출 시 매개변수가 한 개로 호출하는 경우 컴파일러가 어떤걸 호출해야 할 지 모호하여 오류가 발생합니다.

 

3. 함수를 다중 정의하는 것보다는 함수 템플릿이 더 좋은 코드가 될 가능성이 높습니다. 이유를 답하세요.

답 :

  1. 코드 재사용성과 간결성: 함수 템플릿을 사용하면 다양한 데이터 타입에 대해 같은 로직을 적용할 수 있는 하나의 함수를 작성할 수 있습니다. 이는 비슷한 형태의 함수를 여러 번 다중 정의하는 것보다 코드의 양을 줄여주고, 코드의 가독성을 향상시킵니다.
  2. 유지 보수성: 함수를 다중 정의할 경우, 로직을 변경해야 할 때 모든 함수 정의를 찾아 수정해야 합니다. 이는 코드의 유지 보수를 어렵게 만들 수 있습니다. 반면, 함수 템플릿을 사용하면 하나의 템플릿만 수정하면 되므로 유지 보수가 훨씬 쉬워집니다.
  3. 타입 안정성: 함수 템플릿은 컴파일 타임에 타입 체크를 수행하기 때문에, 타입 안정성이 보장됩니다. 컴파일러는 템플릿을 인스턴스화할 때 타입을 검사하여, 타입이 일치하지 않는 경우 오류를 발생시킵니다. 이는 런타임에 발생할 수 있는 타입 관련 오류를 사전에 방지할 수 있게 해줍니다.
  4. 유연성: 함수 템플릿을 사용하면, 사용자 정의 타입 또는 라이브러리에서 제공하는 타입 등 다양한 타입에 대해 유연하게 함수를 적용할 수 있습니다. 이는 템플릿 함수가 타입에 독립적으로 작동하기 때문에 가능합니다. 따라서, 새로운 타입이 추가되거나 변경될 때 추가적인 함수 정의 없이도 기존 템플릿 함수를 재사용할 수 있습니다.

4. inline 함수와 매크로의 공통된 장점은 무엇인지 답하세요.

답 :

  1. 오버헤드 감소: 일반적인 함수 호출 과정에는 호출된 함수로의 제어 이동, 매개변수 전달, 리턴 값을 받기 위한 공간 확보 등 다양한 오버헤드가 발생합니다. 하지만 inline 함수와 매크로는 이러한 오버헤드를 줄일 수 있습니다. inline 함수는 컴파일 시 함수 호출 부분을 함수의 본문으로 대체하여, 함수 호출 오버헤드를 없앱니다. 매크로도 비슷한 방식으로 작동하며, 전처리기에 의해 매크로 호출 부분이 매크로 정의로 대체됩니다.
  2. 실행 시간 단축: 위에서 언급한 오버헤드 감소는 직접적으로 프로그램의 실행 시간을 단축시킵니다. 함수 호출과 관련된 추가적인 작업 없이 직접 코드가 삽입되어 실행되기 때문에, 프로그램의 성능이 향상됩니다.
  3. 코드 최적화: inline 함수와 매크로를 사용하면, 컴파일러나 전처리기가 코드를 최적화할 수 있는 여지가 더 많아집니다. 특히 inline 함수의 경우, 컴파일러가 함수의 본문을 직접 보고 호출 지점에서 최적화를 수행할 수 있습니다. 매크로도 비슷한 방식으로 작동하지만, 컴파일러 최적화보다는 전처리 단계에서의 코드 대체를 통해 이루어집니다.

5. 네임스페이스를 매번 작성하기 싫다면 미리 ( ) 선언을 하는것이 좋습니다. 괄호속에 알맞은 말은 무엇인가요?

답 : using 예약어

 

6. 다음 코드의 실행 결과를 작성하시오.

#include "pch.h"
#include <iostream>

using namespace std;

int nData = 200;

namespace TEST {
	int nData = 100;
    void TestFunc(void) {
    	cout << nData << endl;
    }
}

int main() {
	TEST::TestFunc();
    
    return 0;
}

 

답 : 100이 실행됩니다. 식별자 검색 순서에 따라 현재 블록범위의 지역변수로 선언되어 있는 nData = 100;에 우선적으로 접근하여 100을 출력하게 됩니다.

반응형

'C++ > 이것이 C++이다' 카테고리의 다른 글

[Chapter 02] C++ 함수와 네임스페이스  (2) 2024.03.21
[Chapter 01] C와는 다른 C++  (5) 2024.03.20