코딩 47일차 C/ C++

마스터피스·2023년 11월 21일
0

C/ C++ 

목록 보기
19/35
post-thumbnail

오버라이드 / 오버로드

오버로드와 오버라이드

  1. 오버로드
  • 함수명은 실제로 함수의 이름과 파라미터 타입의 나열까지를 함수명이라고 봅니다. 오버로드라는 것의 원리는 기본적으로 함수명은 같으나. 파라미터가 달라 다른 동작을 하게 할 수 있는 것을 오버로드라고 합니다.

오버로딩 예시코드)

#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;

}
  1. 클래스에서의 함수 오버로딩

    -클래스 멤버 함수와 클래스 생성자에 대해서도 함수 오버로딩을 할 수 있습니다. 이는 클래스는 여러 개의 생성자를 가질 수 있다는 것을 의미합니다. 클래스 생성자가 여러 개가 있을 경우 하나의 생성자만 호출해주면 된다.

예제코드 )

#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;
}
profile
코딩 일지

0개의 댓글