상세 컨텐츠

본문 제목

C++언어 강좌(공부) #18~19장

카테고리 없음

by 바래다주기 2024. 5. 8. 00:17

본문

18. 함수 객체, 임시 객체

함수 객체


ex)
class CSum
{
public:
       int operator()(int _iA, int _iB)
       {
                 return (_iA + _iB);
        }
};

 

void main()
{
        CSum SUM;
        int iNum = SUM(10, 20);
        cout << iNum << endl;
}

 

함수 연산자를 오버로딩 하는 방식
객체를 함수처럼 사용한다
-> 이 또한 객체이므로 생성자와 소멸자가 존재한다
이러한 점을 활용하여 외부의 값을 매개변수로 받아서 연산할 수 있다

 

임시 객체
임시 메모리와 같은 원리로, 코드라인 탈출 시 소멸
따로 객체 선언 없이 객체타입(매개변수); 형태로 선언
해당 라인에서 생성되고 소멸되는 동작이 발생하여 연산 속도가 빠름
메모리를 할당받지 않는다는 점에서 효율이 좋음

19. Template

Template


ex)
template
T Func(T a, T b)
{
        return a + b;
}

 

Func(10, 20);
Func(3.14f, 2.98f);

 

함수 / 클래스가 다른 자료형에서 동작하도록 해주는 키워드
함수 매크로처럼 기능은 고정되어 있지만, 자료형에 얽매이지 않음
그 어떤 자료형도 사용이 가능하며, 특정 자료형으로 함수 템플릿을 사용시
해당 자료형을 가진 함수가 인스턴스화 되는 방식으로 동작
inline함수로 사용이 가능하며, 이로 인해 함수 매크로아 inline함수의 단점을 모두 보완

  1. 함수 매크로는 전처리기 문법으로 런타임의 에러 파악 불가
    => 템플릿은 런타임의 문법으로 에러 파악이 가능
  2. inline함수는 자료형에 종송적
    => 템플릿은 자료형에 구애받지 않음

Template의 특수화


ex)
template
T Func(T a, T b)
{
       return a + b;
}

 

template<>
char* Func(char* a, char* b)
{
       return (strcat_s(a, b));
}

 

특정 자료형에 대해 예외적으로 관리 / 작동하도록 지정해주는 문법
해당 문법 사용 시 자료형에 한해 정해진 자료형이 들어가므로 const키워드를 통한 오버로딩 문법을 사용할 수 있다

 

이항 Template


ex)
template <typename T1, typename T2, ...>

Func<int, float, double>();
여러 가지 형태에 대해 템플릿으로 사용이 가능

클래스 Template
ex)
template
class CObj
{
public:
       T Sum(T a, T b)
       {
                 return a + b;
       }
}

 

CObj intObj;

 

클래스의 형태를 띈 템플릿 -> 절대 클래스가 아님!
클래스는 아니지만. 클래스 템플릿 간에 상속은 발생할 수 있다
클래스 템플릿 사용 시 클래스 내부에서 모든 멤버에 대해 선언과 동시에 초기화 권유
이유?

  1. inline화를 통한 속도 증가의 목적
  2. 코드의 가독성 증가
  3. 클래스 템플릿은 클래스가 아니므로 기존 클래스의 방식대로 선언 및 정의가 안됨
    template
    class CObj
    {
    public:
            T Sum(T a, T b);
    }

template
T CObj::Sum(T a, T b)
{
          return a + b;
}


외부에서 정의 시

  1. template의 범위는 중괄호가 끝나는 지점까지 -> 정의부에 template 재선언 필요
  2. 클래스 템플릿에 대한 정의 -> CObj 형식으로 템플릿임을 밝혀야 함
  3. inline화도 진행되지 않음 -> 따라서 선언과 동시에 초기화 권장

Template 내에서의 Static


ex)
template
void Func(T a)
{
       static T Hello;
       Hello += a;
       cout << Hello << endl;
}

 

void main()
{
       Func(10);
       Func(3.14f);
       Func(1.23);

       Func(5);
       Func(5.55f);
       Func(4.44);
}


template 내에 선언된 static 변수는 같은 형끼리 공유한다
-> int형 템플릿 함수 생성
-> float형 템플릿 함수 생성
-> double형 템플릿 함수 생성
위 처럼 하나로 동작하는게 아닌, 각 자료형마다 따로 생성되기 때문!

 

Template의 장단점


장점 : 1. 모든 자료형과 호환됨
           2. 컴파일 시점의 문법으로 컴파일러가 에러 체크를 할 수 있다
           3. 컴파일러가 직접 사용할 타입에 함수를 생성하므로써 속도가 빠르다

 

단점 : 1. 자료형마다 함수가 만들어지므로 크기가 커지며 코드의 비대화가 일어난다