1. 함수 오버로딩으로 일관된 형태의 함수 만들기

 

C++은 인자를 다르게 하여 같은 이름의 함수를 여러개 만들 수 있다.

 

이를 이용하여 인자 타입에 따라 같은 동작을 하는 라이브러리를 만들 수 있다.

(그렇지 않고 한 타입에 대해서만 정의한다면, 다른 타입에서 사용할 수 없거나 강제로 형변환 되어버린다)

 

 

만일 double square(double x)가 없다면, square(3.3)은 3.3이 int로 형변환 된 후 int로 반환되어버린다.

 

이렇게 동일한 코드를 반복적으로 정의하기 위해서는 C의 매크로를 쓰거나 C++의 템플릿을 쓸 수 있다.

 

 

 

2-1. 매크로

 

매크로를 이용하면 전처리 시간에 코드를 생성할 수 있다.

 

위의 동작을 아래와 같이 매크로로 처리하면 한줄로 타입에 대해 정의할 수 있다.

 


단점은 매번 함수를 사용하기 전에 자기가 원하는 타입으로 선언했는지 생각해보고,

 

사용 안 했으면 먼저 MAKE_SQUARE()를 선언해줘야 한다는 것이다.


그리고 두번 같은 선언을 하면 에러가 발생한다.

 

2-2. 템플릿

 

C++에서 추가된 템플릿을 사용하면 컴파일 시간에 코드를 생성할 수 있다.

 


이렇게 코드를 추가하면 square 함수를 사용할 때마다 컴파일 시간에 함수를 추가한다.

(이미 추가되어 있다면 추가된 함수를 사용한다.)

 

즉 템플릿 구문 만으로는 함수가 아니고, 만일 사용하지 않았다면 어셈블리 코드에 함수가 하나도 추가되지 않는다.


여기에는 square 에 대한 내용이 없다.


여기에는 Line 44에 square<int>, Line 64에 square<double>가 생성된 것이 보인다.


이를 지연된 인스턴스화 (Lazy Instantiation)라 부른다.




3. 지연된 인스턴스화 (Lazy Instantiation)


클래스 템플릿 중 사용되지 않은 멤버 함수는 인스턴스화 되지 않는다.



Line 73의 _ZN4TestIiE3addEii(Test<int>::add), Line 97의 _ZN4TestIiE3subEii(Test<int>::sub), Line 120의 _ZN4TestIdE3subEdd(Test<double>::sub) 세 개는 인스턴스화 되었는데, Test<double>::add는 되지 않았다.


같은 원리로 설사 코드에 문제가 있더라도 사용되지 않았다면 컴파일러가 생성하지 않기 때문에 컴파일이 잘 된다.

(클래스 템플릿이 아닌 경우는 사용되지 않더라도 컴파일 에러 발생)



위의 코드에서 Test1은 에러가 있는 멤버 함수 erroneous가 있더라도 컴파일러에 의해 에러가 발생하지 않는 반면, Test2는 사용된 적도 없지만 컴파일 에러가 발생한다.


'프로그래밍 > C++' 카테고리의 다른 글

typename명령어, template 명령어  (0) 2018.12.26
템플릿 주의할 점  (0) 2018.12.24
함수 바인딩  (0) 2018.10.29
가상 함수 (Virtual Function)  (0) 2018.10.23
상속 (Inheritance)  (0) 2018.10.22

+ Recent posts