객체객체객체객체지향지향지향지향프로그래밍프로그래밍프로그래밍프로그래밍 (Object Oriented Programming)(Object Oriented Programming)(Object Oriented Programming)(Object Oriented Programming)
1 1 장 강 사 – 강 대 기
차례차례차례차례(Agenda)(Agenda)(Agenda)(Agenda) 연산자오버로딩 프렌드함수 << 연산자오버로딩 자동데이터형변환과데이터형캐스트 클래스변환함수
연산자연산자연산자연산자오버로딩오버로딩오버로딩오버로딩 기본적으로함수오버로딩과같음 operator
o p
(a rg u m e n t lis t
) –Time Time::operator+(constTime& t) const; // 640쪽 –coding+fixingcoding.operator+(fixing) // 643쪽 –t1+t2+t3t1.operator+(t2+t3) t1.operator+(t2.operator+(t3)) // 644쪽연산자연산자연산자연산자오버로딩의오버로딩의오버로딩의오버로딩의제약제약제약제약(644(644(644(644쪽쪽쪽쪽)))) 피연산자중하나가사용자정의데이터형 원래연산자의문법규칙을따라야한다–예를들어 이항연산자를단항연산자로쓰지못하며, 연산자 우선순위도못바꿈 연산자기호를새로만들수없음–예. “**” 오버로딩할수없는연산자들이있음(645쪽, 646쪽 표11.1) 멤버함수로만오버로딩가능한연산자들(646쪽)
프렌드프렌드프렌드프렌드 외부에서클래스객체의private 부분에접근하는다 른통로 프렌드함수, 프렌드클래스(15장1000쪽), 프렌드 멤버함수(15장1006쪽) 왜? –Time A = B*2.75; A = B.operator+(2.75); –Time A = 2.75*B; ??? Time operator*(double m, const time& t); –어떻게Time t 객체의private 데이터에접근한단말인가?
프렌드프렌드프렌드프렌드함수함수함수함수생성생성생성생성 클래스선언안에원형을넣는다 –friend Time operator*(double m, const time& t); –멤버함수가아님, 그러나동등한접근권한을가짐 함수정의를외부에만든다(friend 키워드안 씀) 이러한방법은OOP 의철학에맞는가? (653 쪽)
–
멤버함수와프렌드는단순히클래스의 인터페이스방식연산자를연산자를연산자를연산자를오버로딩하는오버로딩하는오버로딩하는오버로딩하는두가지두가지두가지두가지방법방법방법방법 멤버함수(Point 클래스의예) –Point Point::operator+(constPoint& p) const; 프렌드함수(Point 클래스에수를곱하는예) –Point Point::operator+(doublem, const Point& p);
<<<<<<<< 연산자연산자연산자연산자오버로딩오버로딩오버로딩오버로딩 ostream클래스를바꾸는것은좋지않다 –Time 클래스에대한프렌드함수 첫번째버전(655쪽)
참조반환안함, void cout<< x << y 에대해서는동작안함 –(cout<<x) << y 이기때문 두번째버전(657쪽, 659쪽) ostream객 체를참조로반환멤버멤버멤버멤버함수함수함수함수vs. vs. vs. vs. 프렌드프렌드프렌드프렌드함수함수함수함수 T1 = T2 + T3; –T1 = T2.operator+(T3); –T1 = operator+(T2,T3); 둘다쓰게되면, 모호해져서에러가남
예예예예: : : : 벡터벡터벡터벡터클래스클래스클래스클래스(664(664(664(664쪽쪽쪽쪽)))) 소스(667쪽부터) getter / setter –shove.set(100,3000); –shove = Vector (100,3000); 상태멤버–플랙과같은것으로, 그클래스객체의상태를반영 (극좌표냐, 직각좌표냐) 방어적프로그래밍(675쪽) 산술연산자오버로딩 –덧셈: 두좌표계를모두고려해야한다(676쪽) –곱셈: double 값과곱하는경우, 인라인프렌드함수사용 –마이너스부호: 이항마이너스와시그너춰가다르므로오버로딩한 걸다시한번오버로딩(678쪽) Random Walk (680쪽)
내장내장내장내장데이터데이터데이터데이터형형형형변환변환변환변환복습복습복습복습 내장데이터형변환 –long count = 8; // 8L –double time = 11; // 11.0 –intside = 3.33; // 3 (경고) –int* p = 10; // 에러 –int* p = (int*)10;
암시적암시적암시적암시적데이터형데이터형데이터형데이터형변환변환변환변환 파운드스톤변환프로그램(115쪽) 단일변수를가지는생성자 –Stonewt(doublelbs); –StonewtmyCat; –myCat= 19.6; // 암시적데이터형변환 오히려헛갈리고버그를발생할수있음 explicit Stonewt(double lbs) // 암시적데이터형변환금지 –StonewtmyCat; –myCat= 19.6; // 암시적데이터형변환explicit에의해에러발생 –myCat= Stonewt(19.6); –myCat= (Stonewt)19.6; Stonewt(double) 생성자와다른데이터형(int) –StonewtJumbo(7000); // int를double로변환Stonewt(double) 사용 –Jumbo = 7300; // int를double로변환Stonewt(double) 사용
변환변환변환변환함수함수함수함수 역으로변환은가능한가? –Stonewtwolfe(285.7); –double host = wolfe; 가능하며, 생성자를사용하는게아니라변환함수를사용 강제변환 –double host = double (wolfe); –double host = (double) wolfe; 암시적변환은변환함수를통해가능 –operator typename(); –클래스의메쏘드 –리턴형이없음 –전달인자가없음 –operator int();, operator double(); 문맥에따라자동으로적용되고, 애매하면에러(696쪽) –cout<< poppins; (에러) –double p_wt= poppins; (적용) –long gone = poppins; (에러) –long gone = (double) poppins; (강제데이터형변환) –long gone = int(poppins); (강제데이터형변환)
암시적암시적암시적암시적변환변환변환변환자동자동자동자동수행의수행의수행의수행의문제점문제점문제점문제점 암시적변환이드러나지않는문제점 –intar[20]; –Stonewttemp(14,4); –intTemp = 1; –cout<< ar[temp] << endl; 해결책중하나 –Stonewt::operatorint() {return int(pounds+5);} –intStonewt:: Stone_to_Int() {return int(pounds+5);} 요약
–
698쪽~699쪽변환과변환과변환과변환과프렌드프렌드프렌드프렌드 덧셈추가–덧셈연산자오버로딩 –멤버함수또는프렌드함수중택일(699쪽) Stonewt객체= Stonewt객체+ Stonewt객체 멤버함수: jennySt.operator+(bennySt) 프렌드함수: operator+(jennySt, bennySt) –Stonewt(double) 생성자 Stonewt객체= Stonewt객체+ double 형 jennySt.operator+(kennyD) // 멤버함수전달인자인 operator+(jennySt, kennyD) // kennyD가변환됨 operator double 멤버함수가있다면애매함발생 –다음은프렌드함수만가능 Stonewt객체= double 형+ Stonewt객체 pennyD가먼저변환되어멤버함수를호출하지는않는다 따라서operator+(pennyD, jennySt)