42seoul/projects

[CPP Module] 04

moaoh 2023. 9. 13. 05:09

๊ธฐ๋ณธ ๊ทœ์น™

Orthodox Canonical Form

  • ์ƒ์„ฑ์ž
  • ๋ณต์‚ฌ ์ƒ์„ฑ์ž
  • ๋ณต์‚ฌ ํ• ๋‹น ์ƒ์„ฑ์ž
  • ์†Œ๋ฉธ์ž

์ด 4๊ฐ€์ง€๋ฅผ ํฌํ•จ

  • include guards
  • ์ฝ”๋“œ ๋ถ„ํ• ์„ ์œ„ํ•ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ถ”๊ฐ€ํŒŒ์ผ ์‚ฌ์šฉ๊ฐ€๋Šฅ
  • C++ ์—ญ์‹œ new๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒ๋  ์ˆ˜ ์žˆ๊ธฐ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•œ ๋ˆ„์ˆ˜๋ฐฉ์ง€๋ฅผ ํ•ด์ค˜์•ผํ•œ๋‹ค

 

ex00 : Polymorphism

์ƒ์†์ด๋ผ๋Š” ๊ฐœ๋…์„ ์‘์šฉํ•ด์„œ ์จ๋ณด๋Š” ๊ณผ์ œ

new

c์–ธ์–ด์˜ malloc์ด๋‚˜ free์™€ ๋˜‘๊ฐ™์ด c++์—๋„ ๋™์ ํ• ๋‹น์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๊ณ  ํ•ด์ง€ํ•˜๋Š” ๊ฒƒ์ด ์กด์žฌํ•œ๋‹ค.

new์˜ ๊ฒฝ์šฐ์—๋Š” ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , delete์˜ ๊ฒฝ์šฐ์—๋Š” ์†Œ๋ฉธ์ž๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

class* a = new class; // ์ƒ์„ฑ์ž ํ˜ธ์ถœ
.
.
.
delete a; // ์†Œ๋ฉธ์ž ํ˜ธ์ถœ

์œ„์™€ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๊ฑฐ๋‚˜ ํ•ด์ œ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.

๋™์ ํ• ๋‹น์„ ์™œ ํ•ด์•ผํ•˜๋Š”๊ฐ€?

int a[5];

์œ„์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์ด๋ž‘ malloc, free or new, delete์™€ ๋˜‘๊ฐ™์ด ๋™์ž‘์€ ํ•˜์ง€๋งŒ ์œ„์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ณ„์† ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฏธ๋ฆฌ ํ• ๋‹น์„ ์‹œ์ผœ๋ฒ„๋ฆฌ๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ๋๋‚ ๋•Œ๊นŒ์ง€ ๊ณ„์† ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋จน๊ณ ์žˆ์œผ๋‹ˆ ๊ทธ๋งŒํผ ๋ฉ”๋ชจ๋ฆฌ์˜ ํšจ์œจ์€ ๋–จ์–ด์ง€๊ฒŒ๋œ๋‹ค.

๊ทธ๋ž˜์„œ ๋™์ ํ• ๋‹น์ด๋ผ๋Š” ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉํ• ๋•Œ๋งŒ malloc์ด๋‚˜ new๋“ฑ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์žก์•˜๋‹ค๊ฐ€ ํ•„์š”์—†์œผ๋ฉด free๋‚˜ delete๋กœ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ํ•ด์ œํ•˜๋Š” ๊ฒƒ์ด ๋” ํšจ์œจ์ ์ด๋‹ค.

์—… ์บ์ŠคํŒ…(up casting), ๋‹ค์šด ์บ์ŠคํŒ…(down casting)

์—… ์บ์ŠคํŒ… (up casting)

class Animal {
	// ...
};

class Cat : public Animal {
	// ...
};

int main(void) {

	const Animal* temp = new Cat();
    
    return 0;
}
Animal
  |
 Cat

์œ„์—์žˆ๋Š” class๊ฐ€ ์œ„์™€ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ์ƒ์†์ด ์ด๋ฃจ์–ด์ง€๊ณ  ์žˆ์„๋•Œ cat์ด๋ผ๋Š” ํด๋ž˜์Šค๊ฐ€ animal์ด๋ผ๋Š” ํด๋ž˜์Šค๋กœ ์—… ์บ์ŠคํŒ…์ด ์ด๋ฃจ์–ด์ง„ ์ƒํ™ฉ์œผ๋กœ temp๋ผ๋Š” class๋Š” ๋ถ€๋ชจํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„์—๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋œ๋‹ค.

๋‹ค์šด ์บ์ŠคํŒ… (down casting)

// error
Animal *a = new Animal();
Cat c = (Cat) a;

// answer
Animal* a = new Cat();
Cat c = (Cat) a;

๋‹ค์šด ์บ์ŠคํŒ…์€ ๋ง ๊ทธ๋Œ€๋กœ ๋ถ€๋ชจํด๋ž˜์Šค → ์ž์‹ํด๋ž˜์Šค ํ˜•ํƒœ๋กœ ํ˜•๋ณ€ํ™˜์„ ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

์ „์ž ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ๋ถ€๋ชจํด๋ž˜์Šค๋ฅผ ์ž์‹ํด๋ž˜์Šค๊ฐ€ ์ƒ์†๋ฐ›์•„์ ธ ์žˆ๋Š” ์ƒํ™ฉ์—์„œ๋Š” ์ž์‹ํด๋ž˜์Šค๊ฐ€ ๋ถ€๋ชจํด๋ž˜์Šค๋ณด๋‹ค ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ •๋ณด๊ฐ€ ๋งŽ์€ ์ƒํ™ฉ์ด ๋ณดํ†ต์ด๋ฃจ์–ด์ง„๋‹ค.

๊ทธ๋•Œ ๋ถ€๋ชจํด๋ž˜์Šค๋ฅผ ์ž์‹ํด๋ž˜์Šค๋กœ ๋‹ค์šด์บ์ŠคํŒ…์„ ํ•ด๋ฒ„๋ฆฌ๋ฉด ๋ถ€๋ชจํด๋ž˜์Šค์˜ ์ •๋ณด๋งŒ์œผ๋กœ๋Š” ์ž์‹ํด๋ž˜์Šค๊ฐ€ ๊ตฌ์„ฑ๋  ์ˆ˜ ์—†๊ธฐ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒ์ด ๋˜๋Š” ํ˜•์‹์ด๋‹ค.

๊ทธ๋ž˜์„œ ๋‹ค์šด์บ์ŠคํŒ…์„ ํ•˜๊ณ ์‹ถ์œผ๋ฉด ํ›„์ž์™€ ๊ฐ™์ด ์—…์บ์ŠคํŒ…์ด ์„ ํ–‰๋œ ์ดํ›„๊ฐ€ ์‚ฌ์šฉ์„ ํ•ด์•ผํ•œ๋‹ค.

 

[Java] ์—…์บ์ŠคํŒ…๊ณผ ๋‹ค์šด์บ์ŠคํŒ…

์–ด๋– ํ•œ ์ž๋ฃŒํ˜•/ํด๋ž˜์Šค์˜ ๋ณ€์ˆ˜/๊ฐ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค๋Š” ๊ฒƒ์€, ์ขŒ๋ณ€์˜ ์ž๋ฃŒํ˜•์ด ์š”๊ตฌํ•˜๋Š” ์ •๋ณด๋ฅผ ๋ชจ๋‘ ์šฐ๋ณ€์ด ๊ฐ–์ถ”์—ˆ์„ ๋•Œ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด๋‹ค.์บ์ŠคํŒ…์€ ํ˜•๋ณ€ํ™˜์„ ์˜๋ฏธํ•˜๋Š”๋ฐ ์ด ํ˜•๋ณ€ํ™˜ ๋˜ํ•œ, ์œ„์— ๋งž์ถฐ์„œ ์ƒ

velog.io


ex01 : I don’t want to set the world on fire

ํด๋ž˜์Šค์•ˆ์—์„œ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ง€๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด๋ณด๋Š” ๊ฒƒ

๊นŠ์€ ๋ณต์‚ฌ๋ผ๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜๊ณ  ์‚ฌ์šฉํ•ด๋ณด๊ธฐ

leaks ํ™•์ธ

system("leaks a.out");

์œ„์™€ ๊ฐ™์€ ํ˜•์‹์˜ ์ฝ”๋“œ๋ฅผ ์ข…๋ฃŒ ์ง์ „์— ๋„ฃ์–ด๋‘๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€ ์•ˆํ•˜๋Š”์ง€ ๋“ฑ์„ system์—์„œ ์‹คํ–‰ํ•˜์—ฌ ํ•ด๋‹น๋ถ€๋ถ„์„ ํ™•์ธํ•ด์ค€๋‹ค.

double free ํ™•์ธ๋ฐฉ๋ฒ• (๋ฉ”๋ชจ๋ฆฌ ๋ฒ„๊ทธ ๋””๋ ‰ํ„ฐ)

-g3 -fsanitize=address

์œ„์™€ ๊ฐ™์€ ํ”Œ๋ž˜๊ทธ ์˜ต์…˜์„ ๋„ฃ์–ด์„œ ์ปดํŒŒ์ผ์„ ์ง„ํ–‰ํ•ด๋ณด๋ฉด double free๋“ฑ ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฌธ์ œ๊ฐ€ ๋ญ๋•Œ๋ฌธ์— ๋ฐœ์ƒ์ด ๋˜์–ด ๋„์ค‘์— ์ข…๋ฅ˜๊ฐ€ ๋˜์—ˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜

( ์œ„์™€ ๊ฐ™์€ ์‚ฌ์ง„์ฒ˜๋Ÿผ ์–ด๋””์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์˜€๊ณ  ์™œ ๋ฐœ์ƒํ•˜์˜€๋Š”์ง€ ์˜ค๋ฅ˜๋ฅผ ์•Œ๋ ค์ค€๋‹ค. )

๊นŠ์€ ๋ณต์‚ฌ์™€ ์•์€ ๋ณต์‚ฌ

๋ฌธ์ œ์—์„œ๋Š” ๊ฐ์ฒด๊ฐ€ ๋ณต์‚ฌ๊ฐ€ shallow copy๊ฐ€ ์•„๋‹Œ deep copy๋ฅผ ํ•˜๋„๋ก ์š”๊ตฌ๋ฅผ ํ•˜๊ณ  ์žˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ๊นŠ์€ ๋ณต์‚ฌ์™€ ์•์€ ๋ณต์‚ฌ๋Š” ๋ฌด์—‡์ด๊ณ  ์ฐจ์ด์ ์€ ๋ฌด์—‡์ธ๊ฐ€?

์•์€ ๋ณต์‚ฌ ( shallow copy )

์‹ค์ œ ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹Œ ๋ฉ”๋ชจ๋ฆฌ์˜ ์ฃผ์†Œ๋งŒ์„ ๋ณต์‚ฌ

class	*test = new class();
class	*copy = new class();

*test = *copy;

delete test;
delete copy;

// [1] 80684 segmentation fault

์•์€ ๋ณต์‚ฌ๋ฅผ ์ง„ํ–‰ํ•œ ๊ฒฝ์šฐ์— ์œ„์— ์ฝ”๋“œ๋ฅผ ์ง„ํ–‰ํ•  ๊ฒฝ์šฐ test์™€ copy๋ชจ๋‘ 1๊ฐœ์˜ ๊ฐ’์„ ๊ฐ€๋ฅดํ‚ค๊ณ  ์žˆ๊ธฐ๋•Œ๋ฌธ์—

๊ฐ’์€ ๊ฐ’์„ delete๋ฅผ 2๋ฒˆ ์ง„ํ–‰์‹œ์ผœ segmentation fault error๊ฐ€ ๋ฐœ์ƒ์ด๋œ๋‹ค.

๊ทธ๋ž˜์„œ test์˜ ๊ฐ’์„ ๋ฐ”๊พธ๊ฑฐ๋‚˜ copy์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ณ€๊ฒฝ๋œ ๊ฐ’์ด ๋ชจ๋‘์—๊ฒŒ ์ ์šฉ์ด ๋œ๋‹ค.

๊นŠ์€ ๋ณต์‚ฌ ( deep copy )

๊ฐ’ ์ž์ฒด๋ฅผ ๋ณต์‚ฌ

class	*test = new class();
class	*copy = new class();

*test = *copy;

delete test;
delete copy;

// not error

๋‚ด๋ถ€์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑํ•˜๋ƒ์— ๋”ฐ๋ผ ๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ์ง„ํ–‰ํ•œ ๊ฒฝ์šฐ์—๋Š” ์•์€ ๋ณต์‚ฌ์™€๋Š” ๋‹ค๋ฅด๊ฒŒ test์™€ copy๊ฐ€ ๊ฐ์ž ์„œ๋กœ ๋‹ค๋ฅธ ์ฃผ์†Œ๊ฐ’์˜ ๊ฐ’์„ ๋“ค๊ณ  ์žˆ๊ธฐ๋•Œ๋ฌธ์— delete๋ฅผ 2๋ฒˆ ์ง„ํ–‰ํ•ด๋„ error์—†์ด ์ฝ”๋“œ๊ฐ€ ์ง„ํ–‰์ด ์ด๋ฃจ์–ด์ง„๋‹ค.

๋‚ด๋ถ€์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑํ•˜๋ƒ์— ๋”ฐ๋ผ ์•์€ ๋ณต์‚ฌ์™€ ๋‹ค๋ฅด๊ฒŒ test์™€ copy๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ์ฃผ์†Œ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ๋•Œ๋ฌธ์— ๊ฐ’์„ ๋ฐ”๊พธ์–ด๋„ ๊ฐ์ž๋งŒ ๊ฐ’์ด ๋ณ€๊ฒฝ์ด ๋œ๋‹ค.


ex02 : Abstract class

abstract class ์ถ”์ƒ ํด๋ž˜์Šค์— ๋Œ€ํ•ด์„œ ๋‹ค๋ฃจ๋Š” ํŒŒํŠธ

pure virtual function (์ˆœ์ˆ˜ ๊ฐ€์ƒ ํ•จ์ˆ˜)

ํŒŒ์ƒ ํด๋ž˜์Šค์— ์˜ํ•ด ์žฌ์ •์˜๋˜์–ด์•ผ ํ•˜๋Š” ํ•จ์ˆ˜

virtual void test() = 0;

ํ•จ์ˆ˜๋ฅผ ์„ ์–ธ๋งŒ ํ•˜๊ณ  ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ํ•ด๋‹นํ•จ์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ ์žˆ๋Š” ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์€ ์ž์‹ ํด๋ž˜์Šค์—์„œ ์žฌ์„ ์–ธ ํ›„์— ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜ (ํ•ด๋‹น ํ•จ์ˆ˜๋Š” ์„ ์–ธ๋งŒ ๋˜์–ด์žˆ๊ณ  ์•ˆ์— ๋‚ด์šฉ์ด ์—†๋‹ค๋Š” ์˜๋ฏธ์—์„œ ์„ ์–ธ๋ถ€ ๋์— “= 0;”ํ˜•์‹์œผ๋กœ ํ‘œ์‹œ๋ฅผ ํ•ด์ค€๋‹ค.)

virtual void test();

์œ„์™€ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ์ƒ์†๋ฐ›์€ ์ž์‹ ํด๋ž˜์Šค์—์„œ ํ•จ์ˆ˜์˜ ๋‚ด์šฉ์„ ์žฌ ์„ ์–ธํ•ด์ค˜์•ผํ•œ๋‹ค.

abstract class (์ถ”์ƒ ํด๋ž˜์Šค)

ํ•˜๋‚˜ ์ด์ƒ์˜ ์ˆœ์ˆ˜ ๊ฐ€์ƒ ํ•จ์ˆ˜๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ํด๋ž˜์Šค๋ฅผ ์ถ”์ƒ ํด๋ž˜์Šค๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

class Test 
{
private:
public:
	virtual void sound() = 0; // ์ˆœ์ˆ˜๊ฐ€์ƒํ•จ์ˆ˜
};
class Test 
{
private:
public:
	virtual void sound() = 0;
};

class Copy : public Test
{
public:
	virtual void sound() {
		std::cout << "Hello";
	}
};

int main(void)
{
	Copy copy;
	copy.sound(); // output : "Hello"
	return (0);
};

์œ„์™€ ๊ฐ™์ด Test ํด๋ž˜์Šค๋ฅผ Copy ํด๋ž˜์Šค๊ฐ€ ์ƒ์†๋ฐ›์€ ๊ฒฝ์šฐ์—๋Š” Testํด๋ž˜์Šค์•ˆ์— ์žˆ๋Š” ์ˆœ์ˆ˜๊ฐ€์ƒํ•จ์ˆ˜์ธ sound()๋ฅผ

์„ ์–ธ ํ•ด์ค˜์•ผํ•œ๋‹ค.

์„ ์–ธ์„ ํ•ด์ฃผ์ง€์•Š์€ ๊ฒฝ์šฐ

unimplemented pure virtual method 'sound' in 'TestTwo’

๊ฐ€์ƒํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋‘๊ณ  ์ƒ์†๋ฐ›์€ ์ž์‹ ํด๋ž˜์Šค์—์„œ ๋”ฐ๋กœ ์„ ์–ธ์„ ํ•ด์ฃผ์ง€์•Š๊ฒŒ๋˜๋ฉด ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค๊ณ ํ•˜๋ฉฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒ๋œ๋‹ค.

์ถ”์ƒํด๋ž˜์Šค ์‚ฌ์šฉ์šฉ๋„

์ถ”์ƒํด๋ž˜์Šค์˜ ๊ฒฝ์šฐ์—๋Š” ์ด๋ฆ„์—์„œ ๋ณด์ด๋‹ค์‹œํ”ผ ๊ตฌํ˜„์ด ์™„๋ฒฝํ•˜์ง€ ์•Š์•„ ๋…๋‹จ์ ์œผ๋กœ ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ณ  ํ•˜์œ„ํด๋ž˜์Šค์˜ ์„ค๊ณ„ ๋˜๋Š” ๊ฐ€์ด๋“œ๋ผ์ธ์„ ์ฃผ๋Š” ์—ญํ• ๋งŒ ํ•˜๋Š” ํด๋ž˜์Šค๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

class Test 
{
private:
public:
	virtual void sound() = 0;
};

int		main(void)
{
	Test test; // error

	return (0);
}

์œ„์™€ ๊ฐ™์ด ์„ ์–ธ์„ ํ•ด์„œ ์‚ฌ์šฉ์„ ํ• ๋ ค๊ณ ํ•˜๋ฉด ์ถ”์ƒํด๋ž˜์Šค๋ผ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๋ฌธ๊ตฌ๊ฐ€ ๋‚˜์˜จ๋‹ค.

virtual, override ์ฐจ์ด์ 

class Test 
{
private:
public:
	virtual void sound() = 0;
};

// ===== override =====

class TestOne : public Test
{
public:
	void sound() override { // override
		std::cout << "TestOne";
	}
};

// ===== virtual ======

class TestTwo : public Test
{
public:
	virtual void sound() { // virtual
		std::cout << "TestTwo";
	}
};

int		main(void)
{
	TestOne one;
	TestTwo two;

	one.sound(); // output : "TestOne"
	two.sound(); // output : "TestTwo"

	return (0);
}

์œ„์™€ ๊ฐ™์ด TestOne๊ณผ TestTwo์—์„œ๋Š” ๊ฐ๊ฐ Test๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•„ override ํ•ด์ฃผ์—ˆ๋Š”๋ฐ

one์€ override์‚ฌ์šฉํ•˜์˜€๊ณ , two๋Š” virtual ์‚ฌ์šฉํ•˜์˜€๋‹ค.

๋‘๊ฐ€์ง€ ๋ชจ๋‘ ๊ธฐ๋Šฅ์ ์œผ๋กœ๋Š” ๋˜‘๊ฐ™์ด ์ž‘๋™์„ ํ•˜๋Š”๋ฐ ์–ด๋–ค ๋ถ€๋ถ„์—์„œ ์ฐจ์ด์ ์ด ์ƒ๊ธฐ๋Š”์ง€ ๋น„๊ตํ•ด๋ณด์•˜๋‹ค.

override

C++11 ๋ฒ„์ „ ์ด์ƒ๋ถ€ํ„ฐ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ํ‚ค์›Œ๋“œ๋กœ ์ƒ์†์„ ๋ฐ›๋Š” ํด๋ž˜์Šค์—์„œ override๋ฅผ ๋ฐ›์„ ๊ฒƒ์„ ๋ช…์‹œํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

class Test 
{
private:
public:
	virtual void sound() = 0;
};

// ===== override =====

class TestOne : public Test
{
public:
	void sound() const override { // const๋กœ ์ˆ˜์ • : error
		std::cout << "TestOne";
	}
};

์œ„์™€๊ฐ™์ด ์ƒ์†๋ฐ›์€ ์ˆœ์ˆ˜๊ฐ€์ƒํ•จ์ˆ˜๋ฅผ ์ž„์˜์ ์œผ๋กœ ๋ณ€๊ฒฝ์„ ํ•˜๋ฉด error๋ฅผ ๋‚ด๋ณด๋‚ด์„œ ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฐฉ์ง€๋ฅผ ํ•ด์ฃผ๋Š” ์—ญํ• 

๊ทธ์น˜๋งŒ ํ•ด๋‹น๋ฐฉ๋ฒ•์€ ์ž์ฃผ ์‚ฌ์šฉ์„ ํ•˜๋Š”๊ฑฐ๊ฐ™์ง€๋Š” ์•Š๋‹ค.. ์™œ์ง€?

virtual

class Test 
{
private:
public:
	virtual void sound() = 0;
};

class TestTwo : public Test
{
public:
	virtual void sound() { // virtual
		std::cout << "TestTwo";
	}
};

์ƒ์†์„ ๋ฐ›๋Š” ํด๋ž˜์Šค์—์„œ๋Š” virtual๋ฅผ ์•ˆ์ ์–ด๋„ ํŠน๋ณ„ํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€๋Š” ์•Š์ง€๋งŒ

์ƒ์†์„ ํ•ด์ฃผ๋Š” ํด๋ž˜์Šค๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ƒ์†์„ ๋ฐ›๋Š” ํด๋ž˜์Šค์—์„œ๋„ ๋ช…์‹œ์ ์œผ๋กœ virtual๋ฅผ ์ ์–ด์ฃผ๋Š”๊ฒƒ์ด ์ข‹์€ ์ฝ”๋“œ๋ผ๊ณ ํ•œ๋‹ค.

Cat *cat = new Cat();
Dog *dog = new Dog();

Animal *cat = new Cat();
Animal *dog = new Dog();

Cat *cat = new Cat(); ์œ„์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์— ๊ฒฝ์šฐ๋Š”

virtual ~Animal();

์†Œ๋ฉธ์ž ๋˜ํ•œ virtual๋กœ ์„ ์–ธ์ด ๋˜์–ด์žˆ๋‹ค๋ฉด ์ž์‹ํด๋ž˜์Šค์˜ ์†Œ๋ฉธ์ž๋งŒ ๋™์ž‘์„ ํ•ด์•ผํ•˜๋Š”๊ฑด ์•„๋‹Œ์ง€?

๋ถ€๋ชจ์†Œ๋ฉธ์ž์™€ ์ž์‹์†Œ๋ฉธ์ž๊ฐ€ ๋ชจ๋‘ ๋™์ž‘์ด ๋œ๋‹ค๋ฉด ์™œ ๋˜๋Š”๊ฑด์ง€?


ex03 : Interface & recap

ํ•ด๋‹น ๊ณผ์ œ์—์„œ๋Š” ์ง€๊ธˆ๊นŒ์ง€ ๋ฐฐ์› ๋˜ ๊ฐœ๋…๋“ค์„ ์‘์šฉํ•ด์„œ ์กฐ๊ธˆ ๋” ๋ณต์žกํ•˜๊ณ  ๋‹ค์–‘ํ•˜๊ฒŒ ์ƒ์†์„ ํ•ด๋ณด๋Š” ํŒŒํŠธ

์ƒˆ๋กœ์šด ๊ฐœ๋…์ด ํ•„์š”ํ–ˆ๋˜ ํŒŒํŠธ๋Š” ์•„๋‹ˆ์ง€๋งŒ

๊ธฐ์กด์— ๋ฐฐ์› ๋˜ ๊ฐœ๋…๋“ค์„ ์‘์šฉํ•˜๊ณ  ํ™•์‹คํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด๋ด๋ผ ๋ผ๋Š” ๋А๋‚Œ์— ๊ณผ์ œ์˜€๋˜๊ฑฐ๊ฐ™๋‹ค.

ํ•ด๋‹น ๊ณผ์ œ์—์„œ๋Š” 7๊ฐœ์˜ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•ด์•ผํ•œ๋‹ค.

  • ICharacter
  • Character
  • IMateriaSource
  • MateriaSource
  • AMateria
  • Ice
  • Cure

๊ฐ๊ฐ ์„ค๋ช…์„ ํ•ด๋ณด์ž๋ฉด

ICharacter, IMateriaSource ๋Š” interfaces ํ˜•์‹์œผ๋กœ ์‚ฌ์šฉ์ด ๋  ์–˜๋“ค์ด๊ณ 

Character์—๋Š” ICharacter ์ด๋ผ๋Š” interfaces๋ฅผ ์ƒ์† ๋ฐ›์•„์„œ ์‚ฌ์šฉํ•˜๋ฉฐ ๊ธฐ๋ณธ์ ์ธ user์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’๋“ค์ด ๋‹ด๊ธด๋‹ค.

user๋Š” MateriaSource๋ฅผ ํ†ตํ•ด ๋งŒ๋“ค์–ด์ง€๋Š” ice์™€ cure๋ฅผ AMateria๋ฅผ ํ†ตํ•ด์„œ user์—๊ฒŒ ์ „๋‹ฌ์ด ๊ฐ€๋Šฅํ•˜๊ณ  ํ•ด๋‹น ์›์†Œ๋“ค์„ ์ „๋‹ฌ๋ฐ›์€ user๋Š” ์›์†Œ๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ „๋ฐฉ์„ ์–ธ

// AMateria.hpp
class AMateria
{
public:
	virtual void use(ICharacter& target);
	...
};

// ICharacter.hpp
class ICharacter
{
public:
	virtual void equip(AMateria* m) = 0;
	...
};

ICharacter์™€ AMateria๋Š” ์„œ๋กœ๋ฅผ ๋‚ด๋ถ€ ๋งค๊ฐœํ•จ์ˆ˜์—์„œ ์„œ๋กœ์˜ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์–ด์„œ ์„œ๋กœ๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ๋˜์–ด ์ปดํŒŒ์ผ์ด ์ง„ํ–‰์ด ๋˜์ง€์•Š๋Š”๋‹ค.

// ICharacter.hpp

class AMateria;

class ICharacter
{
public:
	virtual void equip(AMateria* m) = 0;
	...
};

์ด ๋ถ€๋ถ„์„ ํ•ด๊ฒฐํ•ด์ฃผ๊ธฐ์œ„ํ•ด์„œ ์ „๋ฐฉ์„ ์–ธ์ด๋ผ๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด์„œ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๋ฏธ๋ฆฌ ์ž„์‹œ์„ ์–ธ์„ ํ•ด์ฃผ๋ฉด ์„œ๋กœ๋ฅผ ์ธ์‹ํ•ด์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒ๋˜์ง€์•Š๊ฒŒ ๋œ๋‹ค.