클래스의 핵심 기능1

킴스코딩클럽·2022년 12월 1일
1

CS기초 시리즈

목록 보기
57/71

관계성

A와 B 오브젝트가 있을 때
1. A는 B의 부분이다(결합성) "is parto of"

Engine is part of car
A는 B의 구성 요소 중 하나
A는 한번에 하나의 객체에만 존재함
A는 B에 의해 관리됨
A는 B를 모르는 관계

class Engine
{
	int hp;
    int rpm;
    int cylinders;
};
class Car
{
	Engine v8;
    Dashboard display;
};
자동차를 만들면 엔진도 같이만들어짐
Car* pcar =new Car;
delete pCar;
지우면 같이 지워짐
엔진은 자동차의 존재를 모름
자동차를 만들기 위해서는 engine이 필요함(강한 결합)
  1. A는 B를 가지고 있다(집단화) "has a"

Car has a Tire
B는 A의 구성 요소 중 일부(타이어도)
B는 여러개의 오브젝트에 소속될 수 있음(다른차에도가능)
B는 A에 의해 관리되지 않음(타이어 관리는 자동차 상태와 별개)
B는 A를 모름(타이어는 자동차 상태를 몰라도됨)
멤버가 포인터

class Tire
{
	float radius;
};
class Car
{
	Tire* tire;
	//멤버가 포인터로 연결됨 =>자동차 클래스가 없어져도 타이어 클래스는 살아있음 => 독립적인 관계
};
  1. A는 B를 쓴다(연관화) "use a"

I use a Car
B는 A와 관련이 있을 수도 없을 수도 있음
B는 여러 가지가 이용 가능
B는 A에 이해 관리 되지 않을 수도 될 수도 있음
B는 A의 존재에 대해 모를 수도 있고 알 수도 있어 관계 없음
보편화된 제한 사항이 없는 관계성

class Driver
{
	Car* mCar;
};
class Car
{
};
  1. A는 B이다*(일반화 또는 특수화) "is a"

Ambulance is a car
Patrolcar is a car
Fireengine is a car
tesla is a car


상속(inheritance),파생(derivation)

  • 일반화 (화살표 순서)
  • 상위 개념을 부모 클래스(parent class) or base class or super class
  • 물려받는 개념을 자식 클래스(child class) or derived class or sub class
class 자식 이름 : [virtual][접근제한자] 부모 이름...(부모가 여러개 가능)
{

};

[접근 제한자]
private:
	내부에서만 사용 가능
    자식 클래스도 안됨

public:
	내외부 모두 사용 가능
    자식 클래스도 가능
    
protected:
	privatepublic사이의 상속
	외부에서 사용 불가능
    내부에서 사용 가능
    자식에서 사용 가능

class Developer
{
public:
	std::string name;
    int age;
};

class Programmer : public Developer
{
public:
	void Coding()
    {
    	std::cout<<"typing c"<<std::endl;
    }
};    

class Chief : pulic Programmer
{
	프로그램 팀장이면 프로그래머 고유의 능력치를 가짐
    그래서 developer가 아닌 programmer능력을 가짐
    void Architecture()
    {
    	std::cout<<"~~~<<std::endl;
    }
};

class Designer : public Developer
{
public:
	void Presentation();
    designer는 developer의 능력을가지고 designer만의 presentation능력을 더 가짐
};

class Artist:public Developer
{
	public:
    void Drawing();
};

class TechnicalArtist : public Artist,Programmer
{
	다중 상속(multiple inheritance) : 부모가 여럿
	DIAMOND INHERITANCE : 피해야할 상속 개념
    ARTIST와 PROGRAMMER가 DEVELOPER를 중복 상속받아 정보가 두개가됨
    다중 상속 부모 에러
    다이아몬드 상속은 피해야되는 개념
};

int main()
{
	Programmer prg1;
    prg1.name = "김코딩";
    prg1.age = 10;
    prg1.Coding();

	Designer dsi1;
    dsi1.name= "김드자이너";
    dsi1.age = 10;
    dsi1.coding();
    
    Chief chf1;
    //물려받은 모든 성질을 다 사용할 수 있음
    chf1.name = "김코딩";
    chf1.age = 10;
    chf1.Coding();
    chf1.Architecture();
}

상속 접근제한자
parent 멤버 public상속 protected상속 private상속
public public protected private
protected protected protectec private
private private private private

c++후속 언어들은 public 상속만 가능함
class Child : Parent
c++ 에서는 public을 붙이지 않으면 private으로 됨

비주얼 스튜디오에서 상속 클래스 만들기

소스 파일 추가하기 - 클래스
자식 클래스 만들려면 기본 클래스 사용하기
기본 클래스가 base class(parent class)

오버라이딩

implementation(구현)

declaration과 definition이 포함됨

오버로딩(overloading)

이름은 같고 매개변수가 다른 함수들

오버라이딩(overriding)

부모의 함수를 자식이 재정의
이름 매개변수 모두 동일해야 함
상속받은 객체에 따라 다른 기능을 하도록 변경할 수 있어 편리하게 사용할 수 있음


class P
{
멤버함수의 오버로딩
void function(int i);
void function(float f,int i);
};

class C : public P
{
오버라이딩
부모에 똑같은 이름을 가진 함수를 이름을 바꿈 
public:
	void function(int i);
};

C child;
child.function(10.0f,1);	//에러
//자식 클래스에 function이 있으면 자신의 것을 먼저 씀
//아니면 부모것으로 명시하거나
//자식의 함수를 또 오버로딩 하는 방법이 있지만
//자주 사용하지 않음
child.P::function(10.0f,1);

profile
공부 기록용

0개의 댓글