얕은 복사 & 깊은 복사
- 얕은복사(Shallow Copy) : 클래스 내부의 포인터 멤버를 복사할 때 포인터가 저장하고 있는 주소값만 복사하는것. 두 객체가 동일한 동적 메모리 영역을 가리키게되어 Dangling Pointer 가 발생할 수 있다.

- 깊은 복사(Deep Copy) : 클래스 내부의 포인터 멤버가 가리키는 동적 데이터를 새로 할당된 독립적인 메모리 영역에 복제하는것. 원본 객체와 복사된 객체는 서로 독립적인 메모리 공간을 소유하기때문에 Dangling Pointer가 발생하지 않는다.

함수 오버로딩
C++ 에서는 동일한 이름의 함수를 여러개 정의할 수 있다. 이는 함수의 이름과 매개변수 타입 정보를 함께 사용해 구분하기 때문에 가능한 일이다. 단, 함수의 반환형만으로는 오버로딩이 성립하지 않기때문에 주의해야한다.
함수 오버로딩을 적용하려면 매개변수 타입이 다르던지 매개변수의 개수가 다른 등, 이름이 같더라도 함수들이 명확하게 구분이 되도록 해야한다.
함수 오버로딩이 되지 않는 경우
1. 타입 변환이 가능한 매개변수로 인해 두 개 이상의 오버로딩된 함수가 호출 후보가 되는 경우
2. 디폴트 매개변수로 인해 함수 호출 형태가 중복되는 경우
3. 매개변수의 타입만 포인터와 배열로 다른 경우
4. 함수의 반환 타입만 다른 경우
함수 오버로딩 순서
1. 정확한 매개변수 타입 일치 - 호출 인자 타입과 매개변수 타입이 정확히 일치하는 경우

2. 타입 승격 변환 - 값이 손실되지 않는 선에서 타입이 변환되는 경우

3. 표준 타입 변환 - 타입이 변경되면서 값이 손실되는 경우
(ex. int -> double / double -> int / double -> float)

4. 사용자 정의 타입 변환 - 클래스 타입의 변환 함수나 생성자 등을 통해 변환이 이뤄지는 경우
// 목적: 표준 변환이 불가능하면 사용자 정의 변환이 호출됨을 학습
#include <iostream>
using namespace std;
class MyNumber {
public:
operator int() const { return 42; }
};
void print(int a) {
cout << "int 타입 호출됨, 값: " << a << endl;
}
void print(double a) {
cout << "double 타입 호출됨, 값: " << a << endl;
}
int main() {
MyNumber num;
print(num); // 사용자 정의 변환을 통해 MyNumber→int로 변환됨
return 0;
}
// 출력결과:
// int 타입 호출됨, 값: 42
템플릿
타입에 관계 없이 일반화된 코드를 작성하기위한 문법이다. 템플릿은 다음과 같은 형태로 정의한다.
template <typename T>
어떤 타입이 올지는 모르겠으나 그 타입을 T 라고 부르겠다는 의미, 이후 일반화하려는 타입 자리에 실제 타입 대신 T를 사용하면 된다. 아래는 예시 코드이다.
#include <iostream>
using namespace std;
template <typename T>
T add(T a, T b) {
return a + b;
}
int main() {
cout << add(10, 20) << endl; // 정수 더하기
cout << add(3.5, 7.1) << endl; // 실수 더하기
return 0;
}
// 출력결과:
// 30
// 10.6
'내배캠 TIL' 카테고리의 다른 글
| [내배캠 TIL 251218] C++ STL 기초 2 (0) | 2025.12.19 |
|---|---|
| [내배캠 TIL 251218] C++ STL 기초 1 (0) | 2025.12.18 |
| [내배캠 TIL 251216] C++ 자원 관리 1 (0) | 2025.12.16 |
| [내배캠 TIL 251211] C++ Class 활용한 예제 2 (0) | 2025.12.15 |
| [내배캠 TIL 251211] C++ Class 활용한 예제 (0) | 2025.12.11 |