C++

[C++] 오버로딩(overloading), 오버라이딩(overriding), 템플릿(Template)

2h1824 2024. 12. 31. 20:58

오버로딩(Overloading) : 함수 중복 정의

ㅡ> 같은 이름의 함수에 매개변수를 다르게 사용하여 매개 변수에 따라 다른 함수가 실행되는 것

  • 메소드 이름이 같다
  • 리턴형이 같아도 되고 달라도 됨 ㅡ> 리턴형만 다를 경우 에러 발생 (호출해야 할 함수 모호)
  • 파라미터 개수가 다르다
  • 파라미터 개수가 같을 경우, 자료형이 다르다 ㅡ> 배열과 포인터는 구별 불가(컴파일 에러)

오버라이딩(Overriding) : 함수 재정의

ㅡ> 상속 받았을 때 부모 클래스의 함수가 아닌 다른 기능을 사용하려 함수를 자식 클래스에서 같은 이름과 매개변수로   재정의 해서 사용하는 것

  • 오버라이딩 하려는 메소드가 상위(부모) 클래스에 존재해야 함
  • 메소드 이름이 같음
  • 메소드 파라미터 개수, 파라미터의 자료형이 같다
  • 메소드 리턴형이 같다
  • 상위 메소드와 동일하거나 내용이 추가되어야 한다

템플릿(Template) : 함수나 클래스를 만들 때, 기능은 명확하지만 자료형을 모호하게 두는 것

int sum(int a, int b){
	return a+b;
}
double sum(double a, double b){
	return a+b;
}

위와 같이 매개변수의 자료형에 따라 함수를 각각 만들던 것을 템플릿을 사용하면 아래와 같이 만들 수 있게 됩니다.

template <typename T>
T sum(T a, T b){
	return a+b;
}

이렇게 템플릿을 사용하면 자료형마다 sum 함수를 만들어 줄 필요 없이 하나의 함수만으로 여러 자료형에 대해 한번에 처리가 가능해 집니다.

template <typename T>
class Vector {
	T* data;
  	int capacity;
}

위 코드와 같이 클래스에도 템플릿을 적용할 수 있습니다. 이때, <typename T> 대신에 <class T>도 사용 가능합니다.

Vector<int> arr1;
Vector<string> arr2;

템플릿으로 클래스를 생성할 때, <>안에 전달하는 자료형이 템플릿으로 선언한 변수의 자료형이 되어 컴파일러가 이를 보고 실제 코드를 생성하는 것입니다. 이처럼 클래스 템플릿에 인자를 전달해서 실제 코드를 생성하는 것을 클래스 템플릿 인스턴스화(class template instantiation)라고 합니다.

*템플릿 특수화 (template specialization)

Vector<bool> BB;

위와 같은 경우에는 bool 데이터 형은 1개 비트 만으로 충분히 저장 가능하기 때문에 C++에서 기본으로 처리하는 단위인 1byte나 사용하게 되는 것은 낭비입니다. 그렇기에 이러한 경우에 템플릿 특수화를 통해 따로 처리하는 것이 효율적입니다. 

template <>
class Vector<bool>{
	...
}

이처럼 템플릿 인자가 없더라도 특수화 하는 경우에는 'template <>'를 명시하여 bool 벡터를 따로 처리해줄 수 있습니다.

 

참고자료

https://modoocode.com/219

 

씹어먹는 C++ - <9 - 1. 코드를 찍어내는 틀 - C++ 템플릿(template)>

모두의 코드 씹어먹는 C++ - <9 - 1. 코드를 찍어내는 틀 - C++ 템플릿(template)> 작성일 : 2017-04-07 이 글은 79849 번 읽혔습니다. 에 대해서 배웁니다. 안녕하세요 여러분! 지난번 강좌 생각해보기는 잘

modoocode.com