과학

C++의 기능을 알아보자 - 연산자 오버로딩 Part 1.

모두들 즐거운 크리스마스 였나? ㅋㅋ

나는 학교에서 크리스마스를... ㅠㅠ


지난번에는 템플릿에 대해서 알아봤었는데 main함수에 템플릿을 주고 하면 어떻게 될까? 할때의 결과를 안알려 줬네...

답은 컴파일이 안된다야.. 템플릿은 단지 껍데기만 만들어주는거라서.. main함수를 찾을수 없다고 나올거야..

뭐 OS가 타입을 정해서 main을 호출해주는것도 아니니깐 말이야.


템플릿은 이만 여기서 끝내고. 오늘은 연산자 오버로딩에 대해서 알아보자.

물론 틀린거 지적이랑 덧붙힘 환영. ㅋ


오버로딩이랑 무엇일까?

오버로딩은 함수이름은 같은데 매개 변수 타입이 다른걸 말해.


bool compare(float a, float b);

bool compare(int a, int b);


이렇게 이름이 같이 선언해도 매개 변수 타입이 다르면 다른 함수로 쳐줘.

컴파일러 입장에서도 호출할때 변수 타입에 따라 알아서 선택 해주지.


왜 오버로딩을 할까?

위에 compare와 같이 무엇인가를 비교를 하려고해.

근데 변수타입이 달라. 그럼 어떻게 해야될까? (물론 전시간에 알아본 템플릿을 써도되.. ;;;)

그 타입에 맞게 비교 해주는 함수를 만들면되.


bool compareInt(int a, int b);

bool compareFloat(float a, float b);


근데 이렇게 하면 가독성면에서 좀 그래...

그래서 아예 이름은 같게하고 매개 변수만 다르게 하는거지.


또 한가지는 클래스에서 생성자를 만드려고해.. (생성자 알지?? ㅎㅎ)

생성자는 간단히 객체를 만들때 이루어 지는 사전 작업이라고 생각하면 편해.

생성자는 반환형이 없고 항상 클래스 이름이야.

이때 문제가 생기는거야 "생성자는 클래스의 이름."


Student라는 클래스가 있으면, 

Student s;

이렇게 해서 객체를 만들게 되면 Student()라는 생성자를 사용해서 객체를 만들게되.


근데 만약

Student s("1300000", "잉텔", "컴퓨터공학과");

이렇게 이미 학번, 이름, 학과를 지정해서 만들게되면

대략적으로 Student(char*, char*, char*); 이렇게 생긴 생성자를 사용해서 객체를 만들게되.


즉, 어쩔수 없이 Student라는 같은 이름을 가진 함수를 오버로딩 하게된셈이지.


그럼 어떻게 오버로딩이 가능할까?

완전히 같은 함수를 만들게 되면 VS에서 오류가.

그때 심볼 이름을 보게 되면 "함수이름@1#G$#2F" 이런식으로 함수 이름뒤에 이상한 기호들이 붙게 되.

그러한 이유로 오버로딩이 가능하게 되.


연산자 오버로딩이란?

기본적으로 C에서 기본적으로 제공해주는 연산자들은 int나 float같이 실수를 포함한 모든 타입에만 사용할수 있어.


그런데 C++에서는 객체라는 개념이 생기게 되었어.

객체는 보통 클래스가 타입이 되는거야.

즉, 사용자가 만들수 있는 새로운 타입이 생겼다는거지.(물론 구조체도 사용자가 정의 할수 있는 새로운타입이 되겠지)


위에서 만든 Student클래스로 한번 보자.

Student s1("1300000", "잉텔", "컴퓨터공학과");

Student s2("1200000", "히힣", "국어국문학과");


s1과 s2의 변수 타입은 Student가 되는거야.

그러면 s1과 s2의 연산은 어떻게 할까?


s1 + s2를 하게되면? s1 > s2를 하게되면? s1 == s2를 하게되면?

char str[10] = s1;이렇게 하게되면?


일단 저렇게 하게되면 컴파일러입장에서는

"우이씨! 뭘 연산 하라는건지 안알려줬잖아! 오류!" 이렇게 될꺼야.


그래서 컴파일러에게 이러한 연산자는 이러이러하게 연산을 하라고 정의를 내려줄수가 있어.

그게 바로 연산자 오버로딩이야.


왜 연산자 오버로딩을 할까?

string 클래스 알지?

string str = "Hello World";

이렇게 하게되면 str에는 Hello World라는 문자열이 들어가게되.

근데 str은 string이라는 클래스이고 "Hello World"는 char*인데 어떻게 이게 가능할까?

바로 =연산에 대해서 따로 연산자 오버로딩을 했기 때문에이야.. ㅎㅎ


연산자 오버로딩을 사용하려면 클래스 안에다가 할수도 있고, 그냥 소스파일 아무데서나도 할수 있어.

근데 나는 클래스 안에다 하는걸 권장해. ㅎㅎ


그럼 실제로 해보자!

연산자 오버로딩은 


반환타입 operator연산자(매개변수1, ...);


이렇게 해서 선언을 하게되면 할수 있어. 위에서 말했다 시피 클래스 안에다가 하든, 밖에다하든 신경 안써.

다만 클래스 안에다가 하는거랑 밖에다가 하는거랑 매개 변수가 좀 차이가 날거야...

나는 소스를 클래스 안에다가 작성한다는 기준으로 만들거야..


위에 Student라는 클래스가 있었지?

Student라는 클래스끼리 +을 연산하도록 정의를 해보자고.

 

Student operator+(Student t)

{

Student ret = t;


/* To-Do. */

/* 두개의 이름을 합친다. */

strcat(ret.getName(), this.getName());


return ret;

}

이렇게 하게되면 Student타입의 대해서 +연산은 두 학생의 이름을 합치도록 정의가 됬어.


여기서 몇가지 의문점이 나올거야.


1. 왜 반환값이 Student 객체일까??

2. 저 this는 뭐지?

3. 클래스 밖에다가 연산자 오버로딩을 했을때는?

4. 꼭 피연산자가 자기와 같은 타입의 객체여야 하는가?


첫번째에 대한 답, 말이 s1 + s2를 정의 했다 이지만, 실제로는 s1.operator+(s2);이렇게 생긴 놈이야. operator+라는 메소드라고 볼수 있어.

결국은 더하기를 함수를 썼으니 더했던 값이 나와야 겠지?

근데 굳이 Student객제 자신일 필욘 없어.. 만약 < > == <= >= != 와같은 비교 연산자라면 bool값이 반환 되야겠지...


두번째에 대한 답, 실제로는 s1.operator+(s2);라고 했지? s1라는 객체 입장에서 보자면 Student클래스의 operator+를 호출한거지.

s1이 호출했으니 this는 s1인거야. s2는 t이고.


세번째에 대한 답, 뭐 간단하지, 매개변수를 하나 더받으면 되지.. 클래스가 아닌곳에서는 this키워드를 사용할수 없으니깐.


네번째에 대한 답, 꼭 자기와 같은 타입의 객체가 아니여도되. string클래스의 =연산을 보게되면 char*이 들어오면 string이 반환되지.

string operator=(char *_str); 이렇게 생겨먹었다는거지 뭐..


오늘은 개발툴이 꼬여 버리는 바람에 여기까지만 쓸게..

다음에는 <<을 오버로딩해서 cout으로 객체를 출력하는법, STL에서 연산자 오버로딩에 대해서 쓸거야...


ps, 프로세스 메모리 영역에 대해서 써볼까 생각중...

9개의 댓글

2013.12.26
크~ 아쉬운건, 입문자가 보기보다는 오랜만에, 배웠던 C++가 쓸 일이 있을 때 다시 생각할 겸 보는 글로 젖절할듯.
게이들의 유아유아틱한 수준에 맞지 않타!
0
2013.12.26
만약에, 입문자들을 위한 글을 싸고 싶다면 컴퓨터의 구조와 네트워크의 구조를 싸는게 좋을듯.
그 둘을 배우면 이후 프로그래밍을 배우던 뭘 하든간에 무척 도움이 되니까 ㅇㅇ.
0
2013.12.26
@StudyOfIT
그거 좋겠다.. 알려줘알려줘
0
2013.12.27
@StudyOfIT
입문자가 그런걸 궁금해 할까 ㅋㅋ
최소 함수까지는 배워서 프로그래밍에 재미를 붙인 후에도 읽고 그렇구나~ 할정도고
테트리스라도 만들면서는 그런 부분도 좋아하겠지
0
2013.12.27
요즘 플밍관련해서 읽게가 많이 올라오는데 보면 잼있고
너무너무 좋은글인데 많은 사람한테 호응을 못받는거 같아서
아쉬운 마음에 댓글을 적을께~


어느정도 프로그래밍을 배운 사람은 이해하기 쉬우나
입문을 하는 사람에게는 어려운 말이 많다는 것!

자기가 배운걸 설명하는게 어렵다는건 알고
좀더 쉽게 표현하는 것도 알지만
댓글단 읽게이(StudyOfIT)가 말한 것처럼
아쉬운감이 너무 없지 않아 있어..

나도 요즘 플젝을 하는게 있어서 그거만 마무리된다면
컴퓨터 내부 구조(프로그램 구동관련)에 대해 적어보려고 했는데
이거 보니까 더 쉽게 작성하려면 역시나 좀 더 다듬어야될꺼 같아~

아무튼 읽게에 좋은 글 투척해줘서 고마워~
0
2013.12.27
그냥 읽다보니 눈에 보여서
생성자 리턴 타입은 this이고
기본적으로 대입연산은 허용이 돼는거로 알고있는대
0
2013.12.27
@프로그래머
반환형이 this라는건 처음 알았다 ㅋㅋ 지적 ㄱㅅ
근데 대입 연산은 같은 객체끼리만 되는걸로 알고 있음... 여기서는 이형간 대입을 말한거였어 ㅋㅋㅋ
0
2013.12.28
잘봤어. 한창 C++공부할때 생각나네. 난 연산자 오버로딩 공부하는데 꽤 힘들었어. 용어도 오버라이딩이랑 비슷하고 해서 헤깔리고.
상당히 편한 기능이긴 한데 막상 구조를 설계할때 나같은 경우는 걍 각각 클래스 맴버변수에 맞는 set함수를 만들어서 하는편이 더 편하긴 하더라. 코딩할때도 그렇고.
0
2014.01.01
C++ 클래스에 대해서도 자세히 써주면 좋겟어 추가로 왜써야하는지 어떻게 써야 하는지 말이야.
0
무분별한 사용은 차단될 수 있습니다.
번호 제목 글쓴이 추천 수 날짜
563 [과학] 경계선 지능이 700만 있다는 기사들에 대해 34 LinkedList 12 21 일 전
562 [과학] 번역)새들은 왜 알을 많이 낳는가? - 후투티의 형제살해 습성... 7 리보솜 3 2024.03.23
561 [과학] 학계와 AI, 그리고 Bitter Lesson (쓰라린 교훈) 26 elomn 35 2024.02.17
560 [과학] 지구의 속삭임, 골든 레코드의 우주 9 Archaea 10 2024.02.16
559 [과학] 잔혹한 과학실험 이야기 <1> 절망의 구덩이 19 개드립하면안됨 37 2024.02.15
558 [과학] 스트레스를 받으면 술이 땡기는 이유 12 동식 16 2024.02.10
557 [과학] 지능은 모계유전이 아니다. 40 울릉특별자치도 35 2024.01.26
556 [과학] 진화를 생각할 때 고려할 것들 23 날씨가나쁘잖아 12 2024.01.17
555 [과학] 학문적(과학적) 접근과 유사 진화심리"학" 26 날씨가나쁘잖아 19 2024.01.15
554 [과학] 호모 사피엔스의 야릇한 은폐된 배란에 대한 남녀 학자의 다... 14 개드립하면안됨 15 2023.12.29
553 [과학] 김영하의 작별인사를 읽고 느낀 점 (스포있음) 21 장문주의 2 2023.11.28
552 [과학] 제4회 포스텍 SF 어워드 공모전 ( SF 단편소설 / SF 미니픽션 ) 2 따스땅 1 2023.11.25
551 [과학] 펌) CRISPR 유전자 가위 치료제 "최초" 승인 12 리보솜 7 2023.11.25
550 [과학] 러시아는 기술산업을 어떻게 파괴시켰는가(펌) 9 세기노비는역사비... 15 2023.11.18
549 [과학] 고양이에 의한 섬생태계 교란과 생물 종의 절멸 (펌) 2 힘들힘들고 6 2023.11.16
548 [과학] 번역) 알츠하이머병 유전자는 어떻게 살아남았는가? 12 리보솜 10 2023.11.15
547 [과학] 『우영우』의 자폐 스펙트럼 장애 개념이 왜곡인 이유 (펌) 47 힘들힘들고 10 2023.11.12
546 [과학] 흑수저 문과충 출신 구글 취직하는 파이썬 특강 -1 14 지방흡입기 11 2023.09.27
545 [과학] 국가별 당뇨 유병율 이거 뭐가 바뀐건지 아는사람? 8 LAMBDA 1 2023.09.27
544 [과학] 물샤워 ㅇㅈㄹ 하는 놈들 봐라 171 철동이 48 2023.09.23