CPP Module 03

dogfootbirdfoot·2022년 6월 1일
0

42Cursus

목록 보기
17/27
post-thumbnail

CPP Module 03

해당 과제를 진행하는데 있어 필요한 사전 지식들을 정리하였습니다.

1. 상속 (Inheritance)

1-1. 상속의 기능

객체 지향 프로그래밍(OOP)에서, 상속(inheritance)은 객체들 간의 관계를 구축하는 방법으로 다른 클래스에서 속성과 특성을 파생시키는 기능을 의미힌다. 여기서 상속을 하는 클래스를 상위 클래스, 기반 클래스, 기초 클래스, 또는 부모 클래스라고 하고, 상속을 받는 클래스를 하위 클래스, 파생 클래스, 유도 클래스, 또는 자식 클래스라고 한다. 상속이 이루어지면 유도 클래스는 기초 클래스의 모든 멤버를 물려받는다.

1-2. 상속 시 클래스 초기화

기초 클래스와 유도 클래스 모두 해당 클래스의 멤버는 해당 클래스의 생성자를 통해서 초기화해야 한다. 따라서 유도 클래스의 객체 생성 과정에서는 기초 클래스의 생성자와 유도 클래스의 생성자 둘 다 호출되어야 한다.

스택에 생성된 객체의 소멸순서는 생성순서와 반대이다. 따라서 유도 클래스의 객체가 소멸될 때에는, 유도 클래스의 소멸자가 실행되고 난 다음에 기초 클래스의 소멸자가 실행된다. 그리고 생성자에서 동적 할당한 메모리 공간이 있다면 소멸자에서 해제해주어야 한다.

1-3. C++에서 클래스를 상속하는 방법

class 클래스명 : 접근제한자 클래스명

1-4. 접근 제한자

상속을 할 때는 접근 제한자를 지정해줘야 하는데 여기에는 클래스의 멤버를 선언할 때와 마찬가지로 private, protected, public가 있다. private으로 상속하면 외부에서 해당 클래스에 접근이 불가능하다. protected로 상속하면 외부에서 접근이 불가능하나 파생 클래스에서는 접근이 가능하고, public으로 상속하면 어떤 클래스에서나 접근이 가능하다.

허용 접근 범위 : private < protected < public

1-5. 다중상속

다중상속이란, 둘 이상의 클래스를 동시에 상속하는 것이다. 다중상속의 방법은 기존의 상속 방법에서 쉼표를 이용해 상속의 되는 클래스를 구분해서 명시하면 된다.

다중상속에는 몇 가지 문제점(모호성)이 발생할 수 있는데 첫 번째는 두 기초 클래스에 동일한 이름의 멤버가 존재하는 경우이고, 두 번째는 다이아몬드 상속의 형태인 경우 동일한 클래스를 간접적으로 두 번 상속한다는 점이다.

첫 번째 문제의 경우, 범위 지정 연산자(::)를 통해 어느 클래스에 정의된 멤버인지를 명시해주면 문제를 해결할 수 있다.

두 번째 문제의 경우는 가상 상속을 통해 문제를 해결할 수 있다.

가상 상속을 이용하면 유도 클래스의 객체가 생성될 때 기초 클래스의 멤버는 오직 한 번만 생성된다. 즉, 기초 클래스의 멤버가 중복하여 생성되는 것을 방지해주는 것이다.

가상 상속은 virtual 키워드의 선언을 통해 이뤄진다.

class 클래스명 : virtual 접근제한자 클래스명

다이아몬드 상속 형태에서, 동일한 클래스를 가상으로 상속하는 두 클래스를 다중상속하게 되면 중복 상속되는 문제를 해결할 수 있다.

 

2. ex00 (Aaaaand... OPEN!)

이번 과제에서는 클래스의 상속에 관한 내용을 다루게된다. ex00에서는 Module 03에서 계속해서 사용할 기초 클래스인 ClapTrap을 구현하면 된다. Orthodox Canonical Form 형식에 맞춰 클래스를 정의하고 과제의 요구사항대로 멤버변수는 private, 멤버함수는 public으로 선언한다.

 

3. ex01 (Serena, my love!)

ex00에서 구현한 ClapTrap 클래스를 상속한 ScavTrap 클래스를 구현하면 된다. ex00에서는 ClapTrap의 멤버변수를 private으로 선언했었지만 ex01에서부터는 상속이 이루어지기 때문에 유도 클래스에서 기초 클래스의 멤버변수에 접근할 수 있도록 위해 ClapTrap의 멤버변수를 모두 protected로 수정한다. ClapTrap과 마찬가지로 Orthodox Canonical Form 형식에 맞춰 ClapTrappublic으로 상속받는 ScavTrap 클래스를 정의하고 생성자에서 ClapTrap의 생성자도 호출해준다. 마지막으로 ScavTrap 클래스만의 특수 기능인 guardGate() 함수를 정의해주면 된다.

 

4. ex02 (Repetitive work)

ClapTrap을 상속받는 또 다른 클래스인 FragTrap을 구현하면 된다. ex01과 같은 방식으로 상속하면 된다. 다만 ScavTrapguardGate()대신 FragTrap클래스만의 특수 기능인 highFivesGuys() 함수를 정의해야 한다.

 

5. ex03 (Now it’s weird!)

ex03ClapTrap 클래스를 상속받은 ScavTrap 클래스와 FragTrap 클래스를 다중상속하여 DiamondTrap 클래스를 만드는 것이 목표이다. 다음과 같은 다이아몬드 상속 형태를 만들어야한다.

이와 같이 ClapTrap 클래스가 중복되지 않고 하나만 생성되기 위해서는 ScavTrapFragTrapClapTrap을 가상으로(virtual) 상속하고 DiamondTrapScavTrapFragTrap를 다중상속하면 된다.

class ScavTrap : virtual public ClapTrap
{
	...
};

class FragTrap : virtual public ClapTrap
{
	...
};

class DiamondTrap : public ScavTrap, public FragTrap
{
	...
};

마지막으로 DiamondClap 클래스만의 특수 기능인 whoAmI() 함수를 정의해주면 된다.

참고로 컴파일러 플래그로 중 -Wshadow는 지역변수나 매개변수가 덮어씌워지면 컴파일 시 경고를 해주는 플래그이다. -Wno-shadow-Wshadow의 경고가 안나오게 해주는 플래그이다.

 

참고
https://velog.io/@appti/CPP-Module-03-ex00
https://velog.io/@seungju0000/cpp-module-03
https://bigpel66.oopy.io/library/42/inner-circle/14

profile
블록체인 개발 어때요

0개의 댓글