๊ฐ์ฒด์— ๋Œ€ํ•˜์—ฌ

OOP ์— ๋Œ€ํ•œ ์ž˜๋ชป๋œ ์ดํ•ด

OOP ๋Š” ๊ธฐ์กด C์™€ ๊ฐ™์€ ์ ˆ์ฐจ์ง€ํ–ฅ์ ์ธ ์–ธ์–ด์— ๋น„ํ•ด ์บก์Аํ™”, ๋‹คํ˜•์„ฑ, ๋ญ ๊ธฐํƒ€ ๋“ฑ๋“ฑ ๋˜๊ฒŒ ํš๊ธฐ ์ ์ธ
ํŒจ๋Ÿฌ๋‹ค์ž„์„ ์ œ๊ณตํ•จ์œผ๋กœ ๊ผญ ๊ฐ์ฒด์ง€ํ–ฅ์ ์œผ๋กœ ์„ค๊ณ„ํ•ด์•ผํ•จ. ์ด๊ฑฐ ์ž˜๋ชป๋œ ์ƒ๊ฐ์ž„.

์ถ”์ƒํ™” (abstraction)

ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๊ฐ€์žฅ์ค‘์š”ํ•œ ๊ฒƒ , ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  ๊ฒƒ, ์ฆ‰ ์ถ”์ƒํ™”์ž„

๊ฐ„๋‹จํ•œ ๊ฒƒ์€ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ž‘์„ฑํ•จ

๋ณต์žกํ•œ๊ฒƒ์€ ์ถ”์ƒํ™”ํ•ด์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ž‘์„ฑํ•จ.(์ˆ˜ํ•™์—์„œ ๊ธฐํ˜ธ๊ฐ€ ์ค‘์š”ํ•œ๊ฑด ๋ณต์žกํ•œ ๊ฐœ๋…์„ ์ตœ๋Œ€ํ•œ ๋‹จ์ˆœํ•˜๊ฒŒ (์ถ”์ƒํ™”) ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•จ)

ex. player ์™€ enemy ๊ฐ€ ์กด์žฌ

player posX, posY, hp(์ฒด๋ ฅ๋ฐ”), player_property_a (๊ทธ์™ธ player ์†์„ฑ์ค‘์˜ ํ•˜๋‚˜)
enemy posX, posY, hp(์ฒด๋ ฅ๋ฐ”), enemy_property_a (๊ทธ์™ธ enemy ์†์„ฑ์ค‘์˜ ํ•˜๋‚˜)

Player์™€ enumey ๋ฅผ ๊ทธ๋ ค์•ผํ•จ์œผ๋กœ ๋‹ค์Œ ๋‘๊ฐœ์˜ ํ•จ์ˆ˜์™€ ๋ชฉ๋ก์ด ๋ฐ์ดํ„ฐ ๋ฆฌ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•จ
Player player Enemy enemys[1024]
draw_player(Player player) draw_enemy (Emeny enemy)

์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์ง

์ถ”์ƒํ™”

C , pascal , assembly ํ˜น์€ ์†Œ์œ„ ์ ˆ์ฐจ์ง€ํ–ฅ ์–ธ์–ด ๋ฒ„์ „

struct GameObject { int object_type ; 0 = Player, 1 = Enemy int posX int posY int hp(์ฒด๋ ฅ๋ฐ”); }

struct Player { GameObject game_object_property; player_property_a property_a; // (๊ทธ์™ธ player ์†์„ฑ์ค‘์˜ ํ•˜๋‚˜) }

struct Enemy { GameObject game_object_property; enemy_property_a property_a; // (๊ทธ์™ธ enemy ์†์„ฑ์ค‘์˜ ํ•˜๋‚˜) }

//game_object.object_type์— ๋”ฐ๋ผ ์ ์ ˆํ•˜๊ฒŒ Player๋ฅผ ๊ทธ๋ฆฌ๊ฑฐ๋‚˜ Enemy๋ฅผ ๊ทธ๋ ค์คŒ
//๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” draw๋งŒ ํ˜ธ์ถœํ•˜๋ฉด๋จ

draw(GameObject game_object) ;

Player์™€ Enemy์˜ ๊ณตํ†ต์˜ ์†์„ฑ์„ GameObject๋กœ ํ‘œํ˜„ํ•˜์˜€์Œ์œผ๋กœ ๋‚˜์ค‘์— ๋ณ€๊ฒฝ์ด ์ƒ๊ธฐ๋ฉด GameObject ๊ตฌ์กฐ์ฒด๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋จ type ์žฌํ™œ์šฉ์ž„. type ์ด๋ž€๊ฒƒ์€ ์ด๋ ‡๊ฒŒ ๋‘๋ฒˆ์ด์ƒ ๊ณตํ†ต์œผ๋กœ ์ •์˜๋˜๋Š” ๊ฒƒ๋“ค์„ ๋‹ค๋ฅธ๊ณณ์—์„œ ๋˜ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ข‹์€ ๋„๊ตฌ์ž„

C++ ํ˜น์€ C#, python ํ˜น์€ ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด ๋ฒ„์ „

class GameObject { int posX int posY int hp(์ฒด๋ ฅ๋ฐ”);
void draw() ; }
class Player : GameObject { player_property_a property_a; // (๊ทธ์™ธ player ์†์„ฑ์ค‘์˜ ํ•˜๋‚˜) void draw() ; }
class Enemy : GameObject { enemy_property_a property_a; // (๊ทธ์™ธ enemy ์†์„ฑ์ค‘์˜ ํ•˜๋‚˜) void draw() ; }

์œ„์˜ ์ ˆ์ฐจ์ง€ํ–ฅ ์–ธ์–ด ๋ฒ„์ „๊ณผ ๋””์ž์ธ์—์„œ ๋™์ผํ•จ, ํ•˜์ง€๋งŒ ํ›จ์”ฌ ํŽธ๋ฆฌํ•จ ๋””์ž์ธ ๋ฐฉ์‹์€ ๋™์ผํ•ด๋„ ๊ทธ ๋””์ž์ธ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ณผ์ •์ด ํŽธํ•˜๋‹ค๋Š” ๊ฒƒ๋„ ๋ฌด์ฒ™ ์ค‘์š”ํ•จ.

์ ˆ์ฐจ์ง€ํ–ฅ์  ์–ธ์–ด ํ˜น์€ ์ ˆ์ฐจ์ง€ํ–ฅ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ

์ ˆ์ฐจ์ง€ํ–ฅ์  ์ด๋ผ๋Š” ์šฉ์–ด๋Š” ๋ฒˆ์—ญ์˜ ์˜ค๋ฅ˜์ž„.

procedural programming , ์ฆ‰ ์ถ”์ƒํ™”๋ฅผ procedure (ํ•จ์ˆ˜) ๋ผ๋Š” ๊ฒƒ์œผ๋กœ ํ•˜๋Š” ๊ฒƒ์ž„. ์ด๊ฒƒ์ด ์ŠคํŒŒ๊ฒŒํ‹ฐ ์ฝ”๋“œ์™€ ๋™์ผํ•˜๋‹ค๋Š” ์˜๋ฏธ๋กœ ๋ฐ›์•„ ๋“ค์ด๋Š” ์ฑ…์ด ๋งŽ์€๋ฐ OOP ์–ธ์–ด์™€ ์‚ฌ์‹ค ๋ณ„๋‹ค๋ฅผ๊ฒŒ ์—†์Œ. ์กฐ๊ธˆ๋” ๋ถˆํŽธํ•˜๋‹ค๋Š” ๊ฒƒ๋ฟ์ž„.

๊ทธ๋ž˜์„œ ๊ฐ์ฒด๋ž€?

OOP ์–ธ์–ด์—์„œ ๊ฐ์ฒด

class ๋ผ๋Š” ๊ฒƒ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ์™€ ํ•จ์ˆ˜๋ฅผ ๋ฌถ์–ด ๋…ผ ๊ฒƒ์„ ์–˜๊ธฐํ•จ. ์‚ฌ์‹ค ๋งค์šฐ ๋‹จ์ˆœํ•œ ๊ฐœ๋…. ๋‹จ์ง€ ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์ด ์€๋‹‰์„ฑ์ด๋‚˜ ๋‹คํ˜•์„ฑ๋“ฑ์„ ์‰ฝ๊ฒŒ ํ‘œํ˜„ํ• ์ˆ˜ ์žˆ์–ด ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ.

reference
https://wiki.haskell.org/Why_Haskell_matters
The great benefit of Object-Oriented Programming is rarely that you group your data with the functions that act upon it together into an object - it's that it allows for great data encapsulation (separating the interface from implementation) and polymorphism (letting a whole set of data types behave the same way).

OOP์˜ ๊ฐ€์žฅ ๊ฐ€์žฅ ํฐ ์žฅ์ ์œผ๋กœ๋Š” ์ผ๋ถ€์˜ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ์™€ ํ•จ์ˆ˜๋ฅผ ๊ฐ™์ด ๋ฌถ์€ํ›„ ํ•จ๊ป˜ ๋™์ž‘ํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๊ฒƒ์€ ๋งค์šฐ ์ข‹์€ ์€๋‹‰์„ฑ๊ณผ ๋‹คํ˜•์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค.

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ด๋ž€?

- ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ - ๋ฐ์ดํ„ฐ์™€ ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์—ฐ์‚ฐ ํ˜น์€ ํ•จ์ˆ˜๊ฐ€ ์กด์žฌํ•จ. - ๋”ฐ๋ผ์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ž€ "๋ฐ์ดํ„ฐ๋ฅผ ์ •์˜ํ•˜๊ณ  ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•ด์„œ ์›ํ•˜๋Š” ๋™์ž‘์„ ๊ตฌํ˜„ํ•˜๋ฉด๋จ"

๊ทธ๋ž˜์„œ ๋‹ค์‹œ ๊ฐ์ฒด๋ž€?

- ์ •์˜ํ•˜๊ธฐ ๋‚˜๋ฆ„์ด๊ณ  ์ด๊ฒƒ์€ ๋„๋ฉ”์ธ์— ๋”ฐ๋ผ ๋‹ค๋ฆ„.

์•„๋ž˜์งˆ๋ฌธ. ํ˜น์‹œ ๊ทธ๋Ÿผ ๊ฒŒ์ž„๋‚ด UI์— ์†ํ•ด ์žˆ๋Š” HP๋ฐ”, MP๋ฐ” ๊ฐ™์€ ๊ฒƒ๋„ ๊ฐ์ฒด์— ํ•ด๋‹น๋˜๋‚˜์š”?

- ์œ„์— ์–˜๊ธฐํ•œ๊ฒƒ ์ฒ˜๋Ÿผ ๋ฌด์–ธ๊ฐ€๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ •์˜ํ•˜๊ณ  ํ•„์š”ํ•˜๋ฉด ์ถ”์ƒํ™”๋ฅผ ํ•จ.ย 
- ์•„๋ž˜ case1 ๋กœ ํ• ์ง€ case 2 ๋กœ ํ• ์ง€๋Š” ๋‹ค์Œ ๋ฌธ์ œ์™€ ๋™์ผํ•จ.

case 1.ย 

ย  ย class UIDataย { int hp_bar; int mp_bar;ย }

case 2.ย 

ย  class HP_Barย { int value;}
ย  class MP_Barย { int value;}

case 1.

1.5 ํ‰๊ทœ๋ชจ์˜ ์„œ์ ์—์„œ ์ฑ…์„ ๋ถ„๋ฅ˜ํ• ๋•Œ ์–ด๋–ป๊ฒŒ ๋ถ„๋ฅ˜ํ• ๊ฑด๊ฐ€?

case 2.

๊ด‘ํ™”๋ฌธ ๊ต๋ณด๋ฌธ๊ณ ์—์„œ ์ฑ…์„ ๋ถ„๋ฅ˜ํ• ๋•Œ ์–ด๋–ป๊ฒŒ ๋ถ„๋ฅ˜ํ• ๊ฑด๊ฐ€?


์ด๋ฌธ์ œ์˜ ํ•ต์‹ฌ์€ ์ฑ…์˜ ๊ฐฏ์ˆ˜์ž„. 1.5 ํ‰ ๊ทœ๋ชจ์—์„œ ์†Œ์„ค์ฑ… ๋ถ„๋ฅ˜์‹œ sf, ๊ณผํ•™, ์—ฐ์• , ํŒํƒ€์ง€.. ์ด๋ ‡๊ฒŒ ๋‚˜๋ˆŒ๊ฑฐ์ž„? ์†Œ์„ค์ฑ…๋‘˜ ๊ณต๊ฐ„์€ ์•ฝ 50 ๊ถŒ์ •๋ณด ๋ฐ–์— ์—†๋Š”๋ฐ ๊ฑฐ๊ธฐ์„œ ์ด๋ ‡๊ฒŒ ๋‚˜๋ˆ„๋Š”๊ฒŒ ์˜๋ฏธ๊ฐ€ ์žˆ์Œ? ๊ทธ๋ƒฅ "์†Œ์„ค์ฝ”๋„ˆ" ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด๋จ ๋ฐ˜๋ฉด ๊ต๋ณด๋ฌธ๊ณ ์˜ ๊ฒฝ์šฐ๋Š” ์†Œ์„ค์ฑ…๋งŒ ๋ช‡์ฒœ๊ถŒ์ž„. ๋”ฐ๋ผ์„œ ์ถฉ๋ถ„ํžˆ ์„ธ๋ถ€์ ์œผ๋กœ ๋ถ„๋ฅ˜ํ•ด์•ผํ•จ


๊ฒฐ๋ก . ์†Œ์œ„๋งํ•˜๋Š” ๊ฐ์ฒด๋กœ ์ •์˜ํ• ์ง€ ๋ง์ง€๋Š” ํ”„๋กœ๊ทธ๋žจ ์ „์ฒด ๊ทœ๋ชจ์™€ ๋ณต์žก์„ฑ, ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋ ‡๊ฒŒ ๋ถ„๋ฅ˜ํ•œ ๊ฒฐ๊ณผ์— ๋Œ€ํ•ด ๊ฐœ๋ฐœ ๋ฐ ๋ถ„์„์‹œ ๊ทธ ์šฉ์ดํ•จ์„ ์˜ˆ์ธกํ•ด ๋ณด๊ณ  ํŒ๋‹จํ•ด์•ผํ•จ. ํ•˜์ง€๋งŒ ์ด๋Ÿฐ๋ฌธ์ œ๋Š” ๋””์ž์ธ์ ์ธ ๋ฌธ์ œ์ž„์œผ๋กœ ๊ทธ๋ƒฅ ๋А๋‚Œ์œผ๋กœ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š”๋ฐ, ๊ทธ๋Ÿฌ๋ฉด ์ดˆ๋ณด์ž„. ๋งŒ์•ฝ ๋””์ž์ธ์„ ํ–ˆ๋‹ค๋ฉด ๊ทธ์— ๋Œ€ํ•ด์„œ ๋ถ„๋ช…ํžˆ ์„ค๋ช…ํ• ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ.