본문 바로가기
{Programing}/C.C++

c/c++ 상속(1)

by 탱타로케이 2020. 1. 21.

상속

 

사전적 의미 : 친족의 사망시 재산상의 권리를 다른 친족이 받는 것.

 

프로그래밍적 의미 : 부모 객체의 모든 속성을 이어받아 코드의 재사용성을 높이는 것. 개인적으로 느끼기엔 유전의 의미가 더 큼. 부모객체의 유전자를 물려받는 느낌.

 

상속의 관계는 

 

상속을 받는 쪽과 상속을 하는 쪽으로 나뉜다.

 

상속을 하는 쪽의 클래스를 부모, 상위, 기초, 슈퍼 클래스라고 하며

 

받는 쪽의 클래스르 자식, 하위, 유도, 서브 클래스라고 한다.

 

여기에서는 슈퍼, 서브 클래스를 사용한다.

 

클래스 사이의 관계는 상속 뿐아니라 

 

association = 연관

composition = 복합 연관

aggregation = 집합 연관

 

dependency = 의존

realization = 실체화

generalization = 일반화

 

정도가 존재한다.

 

연관 관계는 

기본적으로 소유의 개념이다.

두 클래스가 같이 생성되어 같이 소멸되는 경우를 복합 연관이라고하며

자동차와 각 부품의 관계 라고 볼 수 있다.

 

두 클래스가 따로 생성되어 사용되다 따로 소멸되는 경우를 집합 연관이라고 한다.

RPG 게임에서의 파티와 같다. 

friend 클래스 관계도 비슷한 것으로 생각된다.

캡슐화를 깨는 잘못된 사용을 지양하면서 사용해야할 키워드인 friend. 

 

의존 관계는

일방적으로 하나의 클래스가 다른 클래스에 영향을 주는 관계로

A클래스가 B클래스를 일방적으로 사용하는 경우를 이야기 한다.

연관과의 구분점은 인스턴스의 레퍼런스가 유지되는가 하는 것이다.

A 클래스 멤버 함수에서 B클래스를 인자값으로 가져다 사용하는 경우와 같다고 생각하면 된다.

 

실체화의 경우 인터페이스를 실제로 구현한 클래스라고 볼수 있다.

순수 가상 클래스를 여러 서브 클래스로 구현하는 경우를 들 수 있다.

 

일반화의 경우

 

여러 구현된 클래스의 공통된 속성 및 함수들을 모아서 슈퍼클래스로 분리시키는 것을 뜻한다.

즉, 상속의 기본적인 형식이다.

 

 

상속의 경우에는  접근제한자를 이용해 3가지 경우의 상속이 있다.

아래로 갈수록 더 느슨한 제한이다.

상속에서 기본적으로 private 제한자는 서브 클래스에서 접근 할수 없도록 상속된다.

private 상속 : 슈퍼클래스의 private 제한자를 제외한 나머지를 private로 상속받는다.

protected 상속 : private 제한자를 제외한 나머지를 protected로 상속받는다.

public 상속 : 제한자 그대로 상속받음.

 

즉, 슈퍼클래스의 private 제한자 속성들은 슈퍼클래스의 멤버함수를 이용하지 않으면 접근이 불가능하다.

 

class point {
private:
	int x_, y_;
public:
	point() { cout << "point create" << endl; }
	void setpoint(int x, int y) { x_ = x; y_ = y; cout << "x : " << x_ << "  y : " << y_ << endl; }
	int getx() { return x_; }
	int gety() { return y_; }
};

class squere : public point{
private:
	int width_;
	int height_;


public:
	squere() { cout << "squere create" << endl;  setpoint(10, 5); width_ = 2; height_=10; }
	int area() {
		int x_width = this->getx() + width_;
		int y_height = this->gety() + height_;
		cout << "x : " << x_width << "  y : " << y_height << endl;
		return x_width * y_height;
	}
};

 

예제 코드와 같이 슈퍼클래스의 public 멤버함수를 통해 멤버 변수에 접근하는 방법을 사용해야한다.

생성자를 통한 초기화를 하고싶다면 이니셜라이저를 이용한 초기화를 할 수 있다.

 

'{Programing} > C.C++' 카테고리의 다른 글

c/c++ virtual, interface, abstract class  (0) 2020.01.21
c/c++ 상속(2)  (0) 2020.01.21
c/c++ 파일 입출력  (0) 2020.01.17
c/c++ 문자열  (0) 2020.01.14
c/c++ 템플릿  (0) 2020.01.13

댓글