๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Python/๊ฐœ๋… ์ •๋ฆฌ

[Python] ๊ฐ์ฒด์™€ ํด๋ž˜์Šค

by eugene663 2021. 9. 22.

๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Object-Oriented Programming, OOP)

OOP๋Š” ๊ฐ์ฒด ๊ฐœ๋…์„ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ด๋ฉฐ, ์†์„ฑ์€ ๋ณ€์ˆ˜, ํ–‰๋™์€ ํ•จ์ˆ˜๋กœ ํ‘œํ˜„๋œ๋‹ค.

ํŒŒ์ด์ฌ ์—ญ์‹œ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋žจ ์–ธ์–ด์ด๋‹ค.

 

OOP๋Š” ์„ค๊ณ„๋„์— ํ•ด๋‹นํ•˜๋Š” ํด๋ž˜์Šค(class)์™€ ์‹ค์ œ ๊ตฌํ˜„์ฒด์ธ ์ธ์Šคํ„ด์Šค(instance, ๊ฐ์ฒด)๋กœ ๋‚˜๋‰œ๋‹ค.

(ex. ํด๋ž˜์Šค -> ๋ถ•์–ด๋นตํ‹€, ์ธ์Šคํ„ด์Šค -> ๋ถ•์–ด๋นต)

 

๊ฐ์ฒด๋Š” ์†์„ฑ๊ณผ ํ–‰๋™์„ ๊ฐ€์ง„๋‹ค. ๋ฐ์ดํ„ฐ์™€ ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” ์ปค์Šคํ…€ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. ๊ตฌ์ฒด์ ์ธ ๊ฒƒ์˜ ์œ ์ผํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ๊ฐ์ฒด๊ฐ€ ๊ฐœ๋ณ„ ์‚ฌ๋ฌผ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค๋ฉด ํ•ด๋‹น ๋งค์„œ๋“œ๋Š” ๋‹ค๋ฅธ ์‚ฌ๋ฌผ๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •์˜ํ•œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๊ฐ์ฒด๋Š” ํ”Œ๋ผ์Šคํ‹ฑ ๋ฐ•์Šค, ํด๋ž˜์Šค๋Š” ๋ฐ•์Šค๋ฅผ ๋งŒ๋“œ๋Š” ํˆด์ด๋ผ๊ณ  ๋น„์œ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

1. ํด๋ž˜์Šค ์„ ์–ธ: class

class ํด๋ž˜์Šค์ด๋ฆ„(object):

โœ” class: class ์˜ˆ์•ฝ์–ด

โœ” object: ์ƒ์†๋ฐ›๋Š” ๊ฐ์ฒด๋ช… (ํŒŒ์ด์ฌ3์—์„œ๋Š” ์•ˆ์ ์–ด๋„ ์ž๋™ ์ƒ์†)

โœ” ํด๋ž˜์Šค๋ช…: ๋„์–ด์“ฐ๊ธฐ๋ถ€๋ถ„์— ๋Œ€๋ฌธ์ž๋ฅผ ์“ฐ๋Š” CamelCase๋ฐฉ์‹ ์‚ฌ์šฉ

์•„๋ฌด๋„ ๋งŒ๋“  ์  ์—†๋Š” ์ƒˆ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๊ฐ์ฒด์— ํฌํ•จ๋œ ๋‚ด์šฉ์„ ๋‚˜ํƒ€๋‚ด๋Š” ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•œ๋‹ค.

 

2. ์†์„ฑ (attributes)

์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ๊ฐ์ฒด ์†์„ฑ์„ ์˜๋ฏธํ•œ๋‹ค. ํด๋ž˜์Šค๋‚˜ ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ๋ณ€์ˆ˜๋ฅผ ์†์„ฑ์ด๋ผ๊ณ  ํ•œ๋‹ค. ๊ฐ์ฒด, ํด๋ž˜์Šค๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๋™์•ˆ์ด๋‚˜ ๊ทธ ์ดํ›„์— ํ• ๋‹น ๊ฐ€๋Šฅํ•˜๋‹ค. ํด๋ž˜์Šค์ด๋ฆ„ ๋’ค์— ์ ์„ ์ฐ๊ณ  ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค.

 

3. ์ดˆ๊ธฐํ™” ๋ฉ”์„œ๋“œ: __init__()

๊ฐ์ฒด, ํด๋ž˜์Šค์˜ ํ•จ์ˆ˜๋ฅผ ๋ฉ”์„œ๋“œ๋ผ๊ณ  ํ•œ๋‹ค. 

๊ฐ์ฒด ์ดˆ๊ธฐํ™” ์˜ˆ์•ฝํ•จ์ˆ˜ __init__()์„ ์‚ฌ์šฉํ•˜์—ฌ๊ฐœ๋ณ„ ๊ฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค. ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๊ฐ€ ๋งŒ๋“ค์–ด์งˆ ๋•Œ ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋˜๊ณ  ๊ทธ ๊ฐ์ฒด๊ฐ€ ๊ฐ–๊ฒŒ ๋  ์—ฌ๋Ÿฌ ์„ฑ์งˆ์„ ์ •ํ•ด์ค€๋‹ค.

__init__()์„ ์ •์˜ํ•  ๋•Œ ์ฒซ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” self๊ฐ€ ์™€์•ผ ํ•œ๋‹ค. self๋Š” ๊ฐœ๋ณ„ ๊ฐ์ฒด์— ์ž๊ธฐ์ž์‹ ์„ ์ฐธ์กฐํ•˜๊ฒŒ ํ•œ๋‹ค. 

๋ชจ๋“  ํด๋ž˜์Šค์—์„œ __init__()์„ ์ •์˜ํ•ด์•ผ ํ•˜๋Š” ๊ฑด ์•„๋‹ˆ๋‹ค. __init__()๋Š” ํ˜ธ์ถœ ์ „์— ์ด๋ฏธ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค. ๊ฐ™์€ ํด๋ž˜์Šค์—์„œ ์ƒ์„ฑ๋œ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๋‹ค๋ฅธ ๋ฌด์–ธ๊ฐ€๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. 

(self: ์ƒ์„ฑ๋œ instance ์ž์‹ )

 

โœ” ํŒŒ์ด์ฌ์—์„œ __์˜ ์˜๋ฏธ:

ํŠน์ˆ˜ํ•œ ์˜ˆ์•ฝ ํ•จ์ˆ˜๋‚˜ ๋ณ€์ˆ˜, ํ•จ์ˆ˜๋ช… ๋ณ€๊ฒฝ(๋งจ๊ธ€๋ง)์œผ๋กœ ์‚ฌ์šฉ

ex) __main__, __str__, __eq__

4. ์ƒ์†

๋ถ€๋ชจ ํด๋ž˜์Šค๋กœ ๋ถ€ํ„ฐ ์†์„ฑ๊ณผ method๋ฅผ ๋ฌผ๋ ค๋ฐ›์€ ์ž์‹ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

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

 

1) ๋ถ€๋ชจ ํด๋ž˜์Šค ์ƒ์†๋ฐ›๊ธฐ

๊ธฐ์กด ํด๋ž˜์Šค: ๋ถ€๋ชจ, ์Šˆํผ, ๋ฒ ์ด์Šค ํด๋ž˜์Šค

์ƒˆ ํด๋ž˜์Šค: ์ž์‹, ์„œ๋ธŒ, ํŒŒ์ƒ๋œ ํด๋ž˜์Šค

 

์ž์‹ ํด๋ž˜์Šค์˜ ๊ด„ํ˜ธ ์•ˆ์— ๋ถ€๋ชจ ํด๋ž˜์Šค์ด ์ด๋ฆ„์„ ์ง€์ •ํ•œ๋‹ค. issubclass()  ํ•จ์ˆ˜๋กœ ๋‹ค๋ฅธ ํด๋ž˜์Šค์—์„œ ํŒŒ์ƒ๋œ ํด๋ž˜์Šค์ธ์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

#๋ถ€๋ชจ ํด๋ž˜์Šค
class Car():
def exclaim(self):
    print("I'm a Car!")
 
#์ž์‹ ํด๋ž˜์Šค 
class Yujo(Car):
	pass

2) ๋งค์„œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋“œ(๋Œ€์ฒด)

3) ๋งค์„œ๋“œ ์ถ”๊ฐ€

4) ๋ถ€๋ชจ ํด๋ž˜์Šค์—๊ฒŒ ๋„์›€๋ฐ›๊ธฐ: super()

์ž์‹ ํด๋ž˜์Šค์—์„œ ๋ถ€๋ชจ ํด๋ž˜์Šค๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ super()๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. super() ๋ฉ”์„œ๋“œ๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์ •์˜๋ฅผ ์–ป๋Š”๋‹ค.

super() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์ •์˜๊ฐ€ ๋‚˜์ค‘์— ๋ฐ”๋€” ๋•Œ ์ƒ์†๋ฐ›์€ ์ž์‹ ํด๋ž˜์Šค์˜ ์†์„ฑ๊ณผ ๋งค์„œ๋“œ์—๋„ ๋ฐ˜์˜๋œ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

5) ๋‹ค์ค‘ ์ƒ์†: ๊ฐ์ฒด๋Š” ์—ฌ๋Ÿฌ ๋ถ€๋ชจ ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. 

6) ๋ฏน์Šค์ธ

๋ฏน์Šค์ธ ํด๋ž˜์Šค๋Š” ๋‹ค๋ฅธ ์ƒ์œ„ ํด๋ž˜์Šค์™€ ๋งค์„œ๋“œ๋ฅผ ๊ณต์œ ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋งค์„œ๋“œ ํ•ด์„ ์ˆœ์„œ์˜ ๋ชจํ˜ธ์„ฑ์„ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋ฅธ ํด๋ž˜์Šค์—์„œ ์žฌ์‚ฌ์šฉํ•  ์†์„ฑ์ด๋‚˜ ๋ฉ”์†Œ๋“œ๋ฅผ ๋ฌถ์–ด ๋†“์€ ํด๋ž˜์Šค์ด๋‹ค.

 

4. ๋‹คํ˜•์„ฑ (Polymorphism)

๊ฐ™์€ ์ด๋ฆ„์˜ ๋ฉ”์†Œ๋“œ์˜ ๋‚ด๋ถ€ ๋กœ์ง์„ ๋‹ค๋ฅด๊ฒŒ ์ž‘์„ฑ

ํŒŒ์ด์ฌ์—์„œ๋Š” ์ฃผ๋กœ ๊ฐ™์€ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์ƒ์†์—์„œ ์ฃผ๋กœ ๋ฐœ์ƒ

์ค‘์š”ํ•œ OOP๊ฐœ๋…์ด์ง€๋งŒ ๊นŠ์ด ์•Œ ํ•„์š” ์—†๋‹ค.

 

โ€ปprivate ๋ณ€์ˆ˜ (์–ธ๋”๋ฐ” 2๊ฐœ) : self.__items = [] -> ํƒ€๊ฐ์ฒด๊ฐ€ ์ ‘๊ทผ ๋ชปํ•จ

5. ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ(decorator)

first-class object : ์ผ๊ธ‰ ํ•จ์ˆ˜, ๋ณ€์ˆ˜๋‚˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ํ• ๋‹น์ด ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด,

ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ์ด ๊ฐ€๋Šฅ + ๋ฆฌํ„ด๊ฐ’์œผ๋กœ ์‚ฌ์šฉ

ํŒŒ์ด์ฌ ํ•จ์ˆ˜๋Š” ์ผ๊ธ‰ ํ•จ์ˆ˜

inner-product: ํ•จ์ˆ˜ ๋‚ด์— ๋˜ ๋‹ค๋ฅธ ํ•จ์ˆ˜๊ฐ€ ์กด์žฌ (ํ”ํ•œ ๊ตฌ์กฐ)

closures: inner fuction์„ ๋ฆฌํ„ด ๊ฐ’์œผ๋กœ ๋ฐ˜ํ™˜

decorator function @ : ๋ณต์žกํ•œ ํด๋กœ์ ธ ํ•จ์ˆ˜๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค.

 

 

 

์ฐธ๊ณ  ๋ฐ ์ถœ์ฒ˜: ์ฒ˜์Œ ์‹œ์ž‘ํ•˜๋Š” ํŒŒ์ด์ฌ(๋นŒ ๋ฃจ๋ฐ”๋กœ๋‹‰, ํ•œ๋น›๋ฏธ๋””์–ด)