오버라이드 / 오버로드
오버로드와 오버라이드

오버로딩 예시코드)
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
int sum(int a, int b) {
printf("sum(int, int)");
return a + b;
}
int sum(int a, int b, int c) {
printf("sum(int, int, int)");
return a + b + c;
}
int sum(int a, float b) {
printf("sum(int, float)");
return a + b;
}
int main() {
sum(1, 1.0f);
return 0;
}

예제코드 )
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <cstring>
class Student {
public:
int student_no;
char student_name[100];
Student() {
student_no = 0;
strcpy(student_name, "아무개");
}
Student(int studentNo,const char* studentName) {
this->student_no = studentNo;
strcpy(this->student_name, studentName);
}
void printInfo() {
printf("%s 학생의 학번 : %d \n", student_name, student_no);
}
};
int main() {
Student* s1 = new Student();
Student* s2 = new Student(20171735, "정용호");
s1->printInfo();
s2->printInfo();
return 0;
}
3) 연산자에서의 오버로딩
연산자 오버로딩을 하는 방법 : 연산자에 오버로딩에 해당하는 함수를 만들어 준다.
연산자를 오버로딩하게 되면 좌표, 벡터, 문자열 등에 대한 스택 기반 클래스 인스턴스에 대한 덧셈 곱셈 뺄셈 등등의 여러 연산자를 집어넣을 수 있습니다.
본래 연산자라는 것은 어사인 ( = ) 연산자를 제외한 나머지 모든 연산은 '기본형 데이터 타입' 에만 적용이 가능합니다.
그런데 C++에서는 연산자 오버로딩을 통해 이 장벽을 넘을 수 있습니다

예제코드 1)
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <cstring>
class Vector {
public :
float x;
float y;
Vector(float x, float y) {
this->x = x;
this->y = y;
}
Vector() {
x = 0.0f;
y = 0.0f;
}
};
// 연산자 오버로딩을 하는 방법 : 연산자에 오버로딩에 해당하는 함수를 만들어 준다.
Vector operator+(Vector& v1, Vector& v2) {
return Vector(v1.x + v2.x, v1.y + v2.y);
}
int main() {
Vector v1 = Vector(100, 200);
Vector v2 = Vector(1, 2);
Vector v3 = v1 + v2;
return 0;
}
예제코드 2)
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <cstring>
class Vector3 {
public :
float x;
float y;
float z;
Vector3(float x, float y, float z) {
this->x = x;
this->y = y;
this->z = z;
}
Vector3() {
x = 0.0f;
y = 0.0f;
z = 0.0f;
}
void printInfo() {
printf("%.2f, %.2f, %.2f", x, y, z);
}
};
//스칼라 곱
Vector3 operator*(Vector3& v1, float s) {
return Vector3(v1.x * s, v1.y * s, v1.z * s);
}
int main() {
Vector3 v = Vector3(10, 20, 30);
Vector3 result = v * 10;
result.printInfo();
return 0;
}
4) 다른언어에서의 연산자 오버로딩

이런 강력한 연산자 오버로딩은 다른 언어에서는 찾아보기 힘든 C++만의 특징입니다.
다른 언어들에서는 이런 내용이 제한적으로 가능하거나 아예 불가능한 경우가 많습니다.
5) 오버라이드

오버라이드 또는 오버라이딩은 부모 클래스의 함수의 정의를 자식클래스에서 새로 만들어내는 것을 의미합니다.
상속을 받았지만 해당 함수의 동작이 조금 바뀌고 싶을 때, 조금 다시 써야 할 때
그때 오버라이드를 활용하게 됩니다.
이 오버라이드는 가상함수와 밀접한 관련이 있습니다.
예제문제)
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <cstring>
class Animal {
public:
int legs;
char name[20];
Animal(int legs, const char* name) {
this->legs = legs;
strcpy(this->name, name);
}
void printInfo() {
printf("다리 : %d, 이름 : %s\n", legs, name );
}
};
class Human : public Animal {
public:
char regist_no[40];
Human(const char* regist_no) : Animal(2, "사람") {
strcpy(this->regist_no, regist_no);
}
void printInfo() {
printf("이름 : %s , 주민등록번호 : %s\n", name, regist_no);
}
};
int main() {
Human* human = new Human("1234-5678");
Animal* animal = new Animal(2, "닭");
human->printInfo();
animal->printInfo();
return 0;
}
과제형 프로그래밍)

sol)
헤더파일)
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <ctime>
class Matrix {
public:
float v11, v12, v13;
float v21, v22, v23;
float v31, v32, v33;
Matrix(float v11, float v12, float v13, float v21, float v22, float v23, float v31, float v32, float v33) {
this->v11 = v11;
this->v12 = v12;
this->v13 = v13;
this->v21 = v21;
this->v22 = v22;
this->v23 = v23;
this->v31 = v31;
this->v32 = v32;
this->v33 = v33;
}
void pirntInfo() {
printf("%.2f %.2f %.2f\n",v11, v12, v13 );
printf("%.2f %.2f %.2f\n", v21, v22, v23);
printf("%.2f %.2f %.2f\n", v31, v32, v33);
}
};
Matrix operator+(Matrix& m1, Matrix& m2);
소스파일)
#include "Header.h"
Matrix operator+(Matrix& m1, Matrix& m2) {
return Matrix(
m1.v11 + m2.v11, m1.v12 + m2.v12, m1.v13 + m2.v13,
m1.v21 + m2.v21, m1.v22 + m2.v22, m1.v23 + m2.v23,
m1.v31 + m2.v31, m1.v32 + m2.v32, m1.v33 + m2.v33
);
}
int main() {
Matrix m1 = Matrix(1, 2, 3, 4 ,5 ,6 ,7 ,8 ,9);
Matrix m2 = Matrix(10, 11, 12, 13, 14, 15, 16, 17, 18);
Matrix result = m1 + m2;
result.pirntInfo();
return 0;
}