본문으로 바로가기

C++ String / 상속 / 바인딩

category [ IT ]/C++, 자료구조 2015. 6. 24. 22:06

- String class 


문자열을 처리하기 위한 class
문자열 처리를 위한 다양한 멤버함수들 존재
Header File : string

std::string 변수명;

함수검색 : msdn


- 상속

부모 Class의 특성을 물려받아 자식 Class에서 사용 가능
Class의 재사용이 용이함
공통되는 부분을 하나의 Class로 따로 만들어 사용함으로 코드 중복을 줄임
완성된 Class에 기능의 추가나 수정이 용이

학생 Class -> 사람 Class
이름     이름 성별
성별
점수

교수 Class
이름         -> 교수 Class      학생 Class
성별     과목                점수
점수


- Is-A 상속

A는 B다 라는 
예 : 학생은 사람이다 사과는 과일이다.
역은 성립되지 않음

사람 Class - 학생 Class
부모 Class   자식 Class

상속 방법
class 자식class명 : 접근 지시자(private,public,protected) 부모class명
{
class내용
}
물려주는 Class는 물려받는 Class보다 위에 존재해야 함
물려주는 Class를 Base Class, Super Class, 부모 Class등으로 부르고 물려받는 Class를 파생 Class,Sub Class, 자식 Class 등으로 부름

#include <iostream>
using namespace std;

class Parents
{
public:
void ParFunc(){ cout<<"부모 Class"<< endl;}
};

class Child : public Parents
{
public:
void ChiFunc(){ cout<<"자식 Class"<< endl; }
};

void main()
{
Child ch;
ch.ParFunc();
ch.ChiFunc();
}

Class 접근제어
class 멤버들에 대한 접근 가능 여부 지정
private : class 내부 접근가능
public : class 외부에서 접근 가능
protected : class 내부와 상속관계의 class에서만 접근 가능

상속접근제어 
부모 class 멤버들에 대한 접근가능 여부 지정
private : 부모 Class의 모든 멤버를 private으로 변경해서 상속
public : 부모 Class의 접근 제어를 그대로 상속(main함수에서 접근 가능)
protected : 부모 Class의 public멤버를 protected로 변경해서 상속 (main 함수에서 접근 불가능)


 //-. 동물원 : Speak( ) , Walk( ) 기능 작성
//-> IS ? A  상속관계로 코드를 간결하게 작성

#include <iostream>
using namespace std;

class Animal
{
public:
void Walk()
{ cout << "네발로 걷는다" << endl;}
};
class Tiger : public Animal
{
public :
void Speak()
{ cout << "어흥~" <<endl;}
};

class Dog : public Animal
{
public :
void Speak()
{ cout << "멍멍~" <<endl;}
};

class Cat : public Animal
{
public :
void Speak()
{ cout << "야옹~" <<endl;}
};

class Cow : public Animal
{
public :
void Speak()
{ cout << "음메~" <<endl;}
};

void main()
{
Tiger tg;
Dog dg;
Cat ca;
Cow cw;
int select;
while(1)
{
cout << "1.호랑이" << endl;
cout << "2.강아지" << endl;
cout << "3.고양이" << endl;
cout << "4.소" << endl;
cout << "선택: "<<endl;
cin >> select;

switch(select)
{
case 1:
tg.Speak();
tg.Walk();
break;
case 2:
dg.Speak();
dg.Walk();
break;
case 3:
ca.Speak();
ca.Walk();
break;
case 4:
cw.Speak();
cw.Walk();
}
}
}


- Has -A 상속

A는 B를 포함한다 라는 뜻
포함관계의 상속
포함되는 Class의 객체를 멤버변수로 선언
책상(교실, 나무(숲

#include <iostream>
#include <string>
using namespace std;

class Phone
{
public:
void Func(){ cout<<"폰 Class"<<endl; }
};
class Person
{
 Phone ph; //
public:
void Func()
{ ph.Func();
cout<<"사람 Class"<< endl; }
};
void main()
{ Person ps;
ps.Func();
}


- 함수 오버라이딩 (No 오버로딩)

함수의 재 정의
상속받은 자식 클래스에서 부모 클래스의 함수를 재 정의 하는 것
오버라이딩 시 함수의 원형은 부모클래스와 일치해야함
이미 만들어져 있는 Class에서 특정 멤버 함수만 수정할 경우 사용

#include <iostream>
#include <string>
using namespace std;

class Parents
{
public:
void Func(){ cout<<"부모 함수"<<endl; }
};
class Child : public Parents
{ public:
void Func(){ cout<<"자식 함수"<<endl; }
};
void main()
{ Child ch;
ch.Func();

}

위에 동물원 코드에서 네발로 걷는거 말고 두발로 걷는 동물을 추가할경우

자식 Class에서 walk함수를 새로 만들어서 사용하면 다른 동물들은 부모 class의 네발을 가져오지만 두발로 걷는 오리등을 추가하고 그 안에 walk를 다시 세팅하면 자식 Class의 walk가 실행되게된다.


- 포인터와 Class

포인터 변수에 Class의 주소를 저장해서 사용
멤버 변수와 멤버 함수에 접근시 ->를 이용해 접근

Class명 * 포인터 변수명 = Class 주소;
포인터 변수명 - >멤버변수 or 멤버 함수;

#include <iostream>
#include <string>
using namespace std;

class Member
{ public:
void Func(){ cout<<"Member Class"<<endl;}
};
void main()
{ Member * mbpt = new Member;
mbpt->Func();
}


- 포인터와 Class 상속

부모 Class 포인터 변수에는 자식객체의 주소 저장 가능 (주소 저장만 가능하고 접근은 할 수 없다)
부모 Class 포인터 변수 - ( 상속받은 부모 Class 객체 / 자식 Class 객체 )

#include <iostream>
#include <string>
using namespace std;

class Parents
{ public:
void Func1(){ cout<<"부모 함수"<<endl;}
};
class child : public Parents
{ public:
void Func2(){ cout<<"자식 함수" <<endl;}
};

void main()
{ Parents * pt = new Parents;
pt->Func1();
//pt->Func2(); 접근 불가능
}


#include <iostream>
#include <string>
using namespace std;

class Parents
{ public:
void Func1(){ cout<<"부모 함수"<<endl;}
};
class Child : public Parents
{ public:
void Func2(){ cout<<"자식 함수" <<endl;}
};

void main()
{ Child * pt = new Child;
pt->Func1();
pt->Func2(); //접근 가능
}

#include <iostream>
#include <string>
using namespace std;

class Parents
{ public:
void Func1(){ cout<<"부모 함수"<<endl;}
};
class Child : public Parents
{ public:
void Func2(){ cout<<"자식 함수" <<endl;}
};

void main()
{ Parents * pt = new Child;
pt->Func1();
//pt->Func2(); 접근 불가능
}


- Binding이란

함수 호출과 실제 함수를 연결하는 방법

정적 바인딩
- 정적 바인딩은 컴파일 타임에 호출될 함수를 결정
- 객체나 포인터의 타입을 보고 호출할 함수를 결정

동적 바인딩
- Run Time(실행 중)에 호출될 함수를 결정
호출 함수 결정은 객체의 가상함수 Table을 사용
virtual 키워드를 사용하여 함수를 정의

C++은 기본적으로 정적바인딩을 수행


'[ IT ] > C++, 자료구조' 카테고리의 다른 글

C++ namespace / using / bool  (0) 2015.06.24
C++ 가상함수 / 추상 Class / Template  (0) 2015.06.24
C++ Gotoxy 함수  (0) 2015.06.24
C++ 파일 분할  (1) 2015.06.24
C++ 전자레인지 만들기  (0) 2015.06.24