티스토리 뷰

연산자 오버로딩


연산자 오버로딩은 C++ 클래스 문법으로, +,-,>,<등의 연산자를 함수처럼 사용자가 임의로 정의해서 사용할 수 있다. 무슨 뜻인지 처음 접하는 경우에는 감이 잘 오지 않을 수 있습니다. 예를들어 우리가 문자열을 만들때 많이 사용하는 char형태의 배열이 있습니다. 이러한 배열끼리는 + (더하기) 연산이 성립하지 않습니다. 그러나 연산자 오버로딩을 통해서 이를 정의해서 사용할 수 있습니다. 소스코드를 한번 보시겠습니다.


1
2
3
4
5
6
7
8
class MyString
{
    private:
        char str[50];
 
    public:
        MyString operator+(const MyString &m); 
}
cs


MyString이라는 이름의 클래스 헤더부분입니다. 멤버변수로 str이라는 이름의 char형 배열을 가지고 있고, + 연산자에 대한 오버로딩을 설정해 두었습니다. 헤더를 보았을때 어느정도 감이 오시나요? 이제 오버레이터 함수의 정의부를 만들어 보겠습니다.


1
2
3
4
5
6
7
8
9
MyString::MyString(char[] str)
{
    strcpy(this->str,str);
}
 
MyString Mystring::operator+(const MyString &m);
{    
    return MyString(strcat(str, m.str));
}
cs


먼저 생성자부터 보겠습니다. char형 배열을 str이름의 전달인자로 받아서, 멤버변수 str을 만들어 주고 있습니다.
operator+ 함수는 자신의 멤버변수 str과 전달인자로 받은 m의 멤버변수 m.str의 문자열 값을 합쳐서 MyString 형으로 리턴합니다.

1
2
3
4
5
6
int main()
{
    MyString test("test ");
    MyString example("example");
    MyString result = test + example;
}
cs


이와같이 사용하였을때 result의 멤버변수 str에 들어갈 값은 무엇일까요? "test example"이 될 것입니다. 이런식으로 연산자 오버로딩을 이용하여 문자열 관련 함수를 정의하거나, 시간과 관련된 구조체를 정의할때 보다 직관적으로 코드를 작성할 수 있습니다. 예를들어 year, month, day, hour, minute라는 멤버변수를 가지고 있는 TIME라는 구조체를 정의해서 사용할 경우에 if(TIME1 < TIME2) 등과 같이 쉬운 코드를 작성할 수 있을것 입니다.


5번째 줄처럼 오버리딩된 연산자를 호출하는것은 test.operator+(example); 이라고 호출하는것과 결과가 같습니다. 오른쪽의 피 연산자를 전달인자로 넘겨버리죠.

코드와 설명으로 이해가 되셨나요? 설명이 부족하다면 이해가 안되는 부분에 대해서 댓글로 질문 남겨주시면 답변 드리겠습니다. 도움이 되셨다면 광고를 클릭해주시면 큰 도움이 됩니다!


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함