JiYoung Dev πŸ–₯

[파이썬] 순수 객체 지ν–₯ μ–Έμ–΄ / κ°€λ³€ 객체 vs λΆˆλ³€ 객체 / μœ μš©ν•œ ν•¨μˆ˜ / λͺ¨λ“ˆ λ³Έλ¬Έ

python

[파이썬] 순수 객체 지ν–₯ μ–Έμ–΄ / κ°€λ³€ 객체 vs λΆˆλ³€ 객체 / μœ μš©ν•œ ν•¨μˆ˜ / λͺ¨λ“ˆ

Shinjio 2023. 2. 21. 22:01

2023.02.21 μ½”λ“œμž‡ ν•™μŠ΅λ‚΄μš© 정리

 

πŸ”Ž νŒŒμ΄μ¬μ€ 순수 객체 지ν–₯ μ–Έμ–΄?

νŒŒμ΄μ¬μ€ 순수 객체 지ν–₯ 언어이닀. 

즉, 파이썬의 λͺ¨λ“  것은 κ°μ²΄λΌλŠ” 의미

 

μš°λ¦¬κ°€ 일반적으둜 μ‚¬μš©ν•˜λŠ” 숫자, ν•¨μˆ˜, 리슀트, λ¬Έμžμ—΄ 등은 λͺ¨λ‘ μ–΄λ–€ 클래슀의 μΈμŠ€ν„΄μŠ€λΌκ³  ν•  수 있음

 

β–Όβ–Όβ–Ό type ν•¨μˆ˜λ₯Ό μ΄μš©ν•œ user1의 클래슀 좜λ ₯ β–Όβ–Όβ–Ό

__main__ λŠ” μ§€κΈˆ μ‹€ν–‰λ˜κ³  μžˆλŠ” νŒŒμΌμ„ λ‚˜νƒ€λƒ„.

즉, μ§€κΈˆ μ‹€ν–‰ν•˜κ³  μžˆλŠ” 파일의 User 클래슀λ₯Ό λœ»ν•¨

 

β–Όβ–Όβ–Ό type ν•¨μˆ˜λ₯Ό μ΄μš©ν•œ λ‹€μ–‘ν•œ μžλ£Œν˜•μ˜ 클래슀 좜λ ₯ β–Όβ–Όβ–Ό

 

μ •μˆ˜, λ¬Έμžμ—΄, 리슀트, 사전, νŠœν”Œ, ν•¨μˆ˜ λ“± λͺ¨λ‘ μ–΄λ–€ 클래슀의 μΈμŠ€ν„΄μŠ€λ“€

μ΄λŸ¬ν•œ ν΄λž˜μŠ€λ“€μ€ 파이썬 κ°œλ°œμžλ“€μ΄ 자주 μ‚¬μš©ν•˜λŠ” ν•¨μˆ˜λ“€μ„ 클래슀둜 미리 λ§Œλ“€μ–΄ λ‘” 것

 

 

λ§Œμ•½, νŒŒμ΄μ¬μ—μ„œ μ½”λ“œ μž‘μ„± μ‹œ λ³€μˆ˜μ— 1을 λŒ€μž…ν•˜λŠ” 것은 int 클래슀둜 λ§Œλ“  1을 λ‚˜νƒ€λ‚΄λŠ” μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•œ 것이고,

λ¬Έμžμ—΄ ""을 μž…λ ₯ν•˜λŠ” 것은 str 클래슀둜 λ§Œλ“  빈 λ¬Έμžμ—΄μ„ λ‚˜νƒ€λ‚΄λŠ” μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•œ 것

ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜λŠ” 것도 λ‹€μ‹œ functionμ΄λΌλŠ” 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“œλŠ” 것

appendλ₯Ό 톡해 λ¦¬μŠ€νŠΈμ— 값을 μΆ”κ°€ν•˜λŠ” 것은 list ν΄λž˜μŠ€μ— 미리 μ •μ˜λœ appendλΌλŠ” λ©”μ†Œλ“œλ₯Ό κΊΌλ‚΄ μ“°λŠ” 것이라고 ν•  수 있음

 

즉, νŒŒμ΄μ¬μ— μžˆλŠ” λͺ¨λ“  것듀은 νŠΉμ • 클래슀의 μΈμŠ€ν„΄μŠ€λ‘œ 생성

λ”°λΌμ„œ νŒŒμ΄μ¬μ—μ„œ μ½”λ“œλ₯Ό μž‘μ„±ν•˜κ²Œ 되면 μš°λ¦¬λ„ λͺ¨λ₯΄λŠ” 사이에 객체λ₯Ό μƒμ„±ν•˜κ³  객체 지ν–₯ ν”„λ‘œκ·Έλž¨μ„ ν•˜κ³  μžˆλŠ” 것

νŒŒμ΄μ¬μ„ 순수 객체 지ν–₯ 언어라고 ν•˜λŠ” 이유

 

절차 지ν–₯ ν”„λ‘œκ·Έλž¨μ΄λž€?
객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ΄ λ“±μž₯ν•˜κΈ° 이전에 '절차 지ν–₯ ν”„λ‘œκ·Έλž˜λ°'이 μžˆμ—ˆμŒ. 절차 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ€ 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°κ³Ό 달리 '객체'λΌλŠ” κ°œλ…μ΄ μ—†μŒ. λŒ€μ‹  ν”„λ‘œκ·Έλž¨μ— ν•„μš”ν•œ λ™μž‘μ„ ν•¨μˆ˜λΌλŠ” λ‹¨μœ„λ‘œ λ¬Άμ–΄μ„œ μ‚¬μš©. 그리고 ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•  λ•Œ λͺ…령듀을 μˆœμ„œλŒ€λ‘œ μ‹€ν–‰

반면, 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ€ ν•„μš”ν•œ λ™μž‘ 뿐만 μ•„λ‹ˆλΌ μ•„μ˜ˆ μ—°κ΄€λœ λ°μ΄ν„°λ‘œ 객체둜 λ¬Άμ–΄μ„œ ν•˜λ‚˜μ˜ 클래슀둜 λ‚˜νƒ€λ‚΄λ©°, ν”„λ‘œκ·Έλž¨μ„ 객체듀이 μˆœμ„œλŒ€λ‘œ μ†Œν†΅ν•˜λŠ” κ³Όμ •μœΌλ‘œ κ°„μ£Ό

즉, 절차 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ—μ„œλŠ” ν”„λ‘œκ·Έλž¨ μ•ˆμ—μ„œ μ„œλ‘œ κ΄€λ ¨λœ λ™μž‘λ“€λ§Œ λ¬Άμ–΄μ„œ κ΄€λ¦¬ν•˜λŠ”λ°(ν•¨μˆ˜)

객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ—μ„œλŠ” κ΄€λ ¨λœ λ™μž‘λ“€κ³Ό κ΄€λ ¨λœ 데이터도 ν•¨κ»˜ λ¬Άμ–΄μ„œ 관리(클래슀)

 

πŸ”Ž 객체의 νƒ€μž… 

파이썬 κ°μ²΄λŠ” κ°€λ³€ νƒ€μž…κ³Ό λΆˆλ³€ νƒ€μž…μœΌλ‘œ λ‚˜λˆŒ 수 있음

κ°€λ³€ νƒ€μž… κ°μ²΄λŠ” ν•œλ²ˆ μƒμ„±ν•œ μΈμŠ€ν„΄μŠ€μ˜ 속성을 λ³€κ²½ν•  수 μžˆμœΌλ‚˜ ( = 객체에 ν• λ‹Ήλœ 값을 μˆ˜μ •ν•  수 있음)

λΆˆλ³€ νƒ€μž… κ°μ²΄λŠ” ν•œλ²ˆ μƒμ„±ν•œ μΈμŠ€ν„΄μŠ€μ˜ 속성을 λ³€κ²½ν•  수 μ—†μŒ ( = 객체에 ν• λ‹Ήλœ 값을 μˆ˜μ •ν•  수 μ—†μŒ)

 

κ°€λ³€ νƒ€μž… 객체의 예 : 리슀트 클래슀

λΆˆλ³€ νƒ€μž… 객체의 예 : νŠœν”Œ 클래슀

 

β–Όβ–Όβ–Ό 리슀트 클래슀(κ°€λ³€ νƒ€μž…) vs νŠœν”Œ 클래슀(λΆˆλ³€ νƒ€μž…) 비ꡐ β–Όβ–Όβ–Ό

 

뢈편 νƒ€μž…μ€ 속성은 λ°”κΏ€ 수 μ—†μ§€λ§Œ 객체 μžμ²΄λŠ” λ°”κΏ€ 수 있음

λ³€μˆ˜μ— μ•„μ•  μƒˆλ‘œμš΄ μΈμŠ€ν„΄μŠ€λ₯Ό 지정해 λ³€κ²½ν•  수 있음

 

 

πŸ“– κ°€λ³€ νƒ€μž…κ³Ό λΆˆλ³€ νƒ€μž… 클래슀 μ’…λ₯˜

κ°€λ³€ νƒ€μž… λΆˆλ³€ νƒ€μž…
list bool
dict int
  float
  str
  tuple

 

κ·Έλ ‡λ‹€λ©΄ 직접 μž‘μ„±ν•œ ν΄λž˜μŠ€λŠ” μ–΄λ–€ νƒ€μž…μΌκΉŒ? 

κ°€λ³€ νƒ€μž… → λ”°λΌμ„œ 직접 μž‘μ„±ν•œ ν΄λž˜μŠ€μ—μ„œλŠ” 기쑴의 μΈμŠ€ν„΄μŠ€λ₯Ό λ³€κ²½ν•˜κ³  μ‹ΆμœΌλ©΄ μ›λž˜ μΈμŠ€ν„΄μŠ€μ˜ 속성을 λ°”κΎΈλ©΄ 됨

 

πŸ”Ž μœ μš©ν•œ ν•¨μˆ˜λ“€

πŸ“– max, min ν•¨μˆ˜

max ν•¨μˆ˜λŠ” νŒŒλΌλ―Έν„° 쀑 κ°€μž₯ 큰 값을, min ν•¨μˆ˜λŠ” νŒŒλΌλ―Έν„° 쀑 κ°€μž₯ μž‘μ€ 값을 리턴

두 ν•¨μˆ˜ λͺ¨λ‘ μ›ν•˜λŠ” 개수만큼의 νŒŒλΌλ―Έν„°λ“€μ„ λ„˜κ²¨μ€„ 수 있음 

 

 

πŸ“– sum ν•¨μˆ˜

sum ν•¨μˆ˜λŠ” 리슀트, νŠœν”Œ, λ”•μ…”λ„ˆλ¦¬μ— μžˆλŠ” μˆ«μžν˜• μš”μ†Œλ“€μ˜ 합을 리턴

sum ν•¨μˆ˜μ— λ”•μ…”λ„ˆλ¦¬λ₯Ό νŒŒλΌλ―Έν„°λ‘œ λ„˜κΈ°λ©΄ keyλ“€μ˜ 합을 리턴

 

 

πŸ“– ternary expression

뢈린(Boolean) 값에 따라 λ‹€λ₯Έ 값을 λ¦¬ν„΄ν•˜λŠ” ꡬ문

if, else둜 λ³΅μž‘ν•˜κ²Œ ν‘œν˜„ν•΄μ•Ό ν•˜λŠ” ꡬ문을 κ°„λ‹¨ν•˜κ²Œ λ‚˜νƒ€λ‚Ό 수 있음

 

ternary expression 문법
참일 λ•Œ μ‹€ν–‰λ¬Έ if 쑰건식 else κ±°μ§“μΌλ•Œ κ°’

# java의 μ‚Όν•­μ—°μ‚°μžμ™€λŠ” 쑰금 λ‹€λ₯Έ ꡬ쑰 
쑰건문 ? 참일 λ•Œ μ‹€ν–‰λ¬Έ : 거짓일 λ•Œ μ‹€ν–‰λ¬Έ     ← java 3ν•­ μ—°μ‚°μž ꡬ쑰

 

 

πŸ“– list comprehension

μƒˆλ‘œμš΄ 리슀트λ₯Ό λ§Œλ“œλŠ” κ°„νŽΈν•œ 방법

 

list comprehension 문법
[μ›ν•˜λŠ” 값을 λ¦¬ν„΄ν•˜λŠ” 식 for 반볡문]

 

 

πŸ“– zfill λ©”μ†Œλ“œ

λ¬Έμžμ—΄μ„ μ΅œμ†Œ λͺ‡ 자리 이상을 가진 λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•΄ μ£ΌλŠ” λ©”μ†Œλ“œλ‘œ λͺ¨μžλž€ 뢀뢄은 μ™Όμͺ½μ— 0을 μ±„μ›Œμ€Œ

λ§Œμ•½ μ„€μ •λœ μžλ¦Ώμˆ˜λ³΄λ‹€ 이미 더 κΈ΄ λ¬Έμžμ—΄μ΄λΌλ©΄ κ·Έ λ¬Έμžμ—΄μ„ κ·ΈλŒ€λ‘œ 좜λ ₯

λ¬Έμžμ—΄μ„ 예쁘고 톡일감 있게 좜λ ₯ν•˜κ³ μž ν•  λ•Œ 자주 μ‚¬μš©

 

zfill λ©”μ†Œλ“œ 문법
λ¬Έμžμ—΄.zfill(자릿수)

 

 

πŸ”Ž λͺ¨λ“ˆ(module)

λͺ¨λ“ˆμ΄λž€ λ³€μˆ˜, ν•¨μˆ˜, 클래슀 등을 λͺ¨μ•„놓은 파일둜 μ΄λŸ¬ν•œ λͺ¨λ“ˆμ€ λ‹€λ₯Έ κ³³μ—μ„œ κ°€μ Έλ‹€ μ“Έ 수 있음

 

β–Όβ–Όβ–Ό calculator.py λͺ¨λ“ˆ 생성 β–Όβ–Όβ–Ό

 

β–Όβ–Όβ–Ό test.pyλΌλŠ” μƒˆλ‘œμš΄ νŒŒμΌμ—μ„œ calculator.py λͺ¨λ“ˆ μ‚¬μš©ν•˜κΈ° β–Όβ–Όβ–Ό

λͺ¨λ“ˆ μ‚¬μš©ν•˜λŠ” 방법
from λͺ¨λ“ˆμ˜ 이름 import 뢈러올 λ³€μˆ˜/ν•¨μˆ˜/클래슀 이름

 

 

λͺ¨λ“ˆμ„ μ‚¬μš©ν•˜λ©΄ μƒˆλ‘œμš΄ νŒŒμΌμ—μ„œ ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜μ§€ μ•Šμ•„λ„ λͺ¨λ“ˆμ—μ„œ μ •μ˜λœ ν•¨μˆ˜λ‚˜ λ³€μˆ˜, 클래슀λ₯Ό λΆˆλŸ¬μ™€ μ‚¬μš©ν•  수 있음

 

πŸ“– randint ν•¨μˆ˜μ™€ uniform ν•¨μˆ˜

νŒŒμ΄μ¬μ—λŠ” 기본으둜 λ‚΄μž₯된 λͺ¨λ“ˆμ΄ 있음. 그쀑 ν•˜λ‚˜κ°€ random λͺ¨λ“ˆ

random λͺ¨λ“ˆμ— ν¬ν•¨λœ ν•¨μˆ˜λ‘œ randint와 uniform이 있음

randintλŠ” 두 μ •μˆ˜ μ‚¬μ΄μ—μ„œ λžœλ€ν•œ μ •μˆ˜λ₯Ό 리턴

uniform은 두 μ •μˆ˜ μ‚¬μ΄μ—μ„œ λžœλ€ν•œ μ†Œμˆ˜λ₯Ό 리턴

 

 

πŸ”Ž 객체 λ§Œλ“€κΈ° μ—°μŠ΅ 

πŸ“– κ²Œμž„ 캐릭터 λ§Œλ“€κΈ°

β–Όβ–Όβ–Ό λ‚΄κ°€ μž‘μ„±ν•œ μ½”λ“œ β–Όβ–Όβ–Ό

ν•˜λ©΄μ„œ 였λ₯˜ λ‚¬λ˜ λΆ€λΆ„
1. λ©”μ†Œλ“œ 뒀에 () λΉ νŠΈλ¦¬μ§€ μ•ŠκΈ°
2. return μ‚¬μš© 주의. ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•˜κ³ μž ν•œλ‹€λ©΄ return은 μž‘μ„±ν•˜μ§€ 말 것

λͺ¨λ²” λ‹΅μ•ˆκ³Ό 비ꡐ
1. is_alive(self) λ©”μ†Œλ“œ μ •μ˜ μ‹œ if 문을 μ‚¬μš©ν•˜μ§€ μ•Šκ³  return self.hp > 0 μ‚¬μš©
    → μ΄λ ‡κ²Œ μž‘μ„±ν•˜λ©΄ 더 κ°„νŽΈν•¨. if 문이 μ•„λ‹ˆλ”λΌλ„ self.hp κ°€ 0보닀 크면 μžλ™μœΌλ‘œ Trueκ°€ 리턴될 κ±°κ³ ,

        거짓이라면 Falseκ°€ 리턴됨
2. get_attacked λ©”μ†Œλ“œ μ •μ˜ μ‹œ ternary expression μ‚¬μš©
    → ternary expressionμ‚¬μš© μ‹œ else 이후에 값이 듀어감
    → 즉, self.hp = 0 이 μ•„λ‹Œ 0 만 μž…λ ₯ν•˜λ©΄ 됨

 

 

 

β–Όβ–Όβ–Ό λͺ¨λ²” λ‹΅μ•ˆ β–Όβ–Όβ–Ό

 

πŸ“– λΈ”λ‘œκ·Έ μœ μ € λ§Œλ“€κΈ°

 

add_post λ©”μ†Œλ“œ μž‘μ„±ν•˜κΈ°
date와 contentλ₯Ό νŒŒλΌλ―Έν„°λ‘œ κ°–λŠ” ν΄λž˜μŠ€λŠ” Post
λ”°λΌμ„œ Post ν΄λž˜μŠ€μ— date와 contentλ₯Ό νŒŒλΌλ―Έν„°λ‘œ κ°–λŠ” μƒˆλ‘œμš΄ μΈμŠ€ν„΄μŠ€λ₯Ό 생성 (new_post)
그러고 λ‚˜μ„œ self.posts에 new_post의 값을 μΆ”κ°€ 

show_all_posts λ©”μ†Œλ“œ μž‘μ„±ν•˜κΈ°
리슀트 ν˜•νƒœμ˜ 값듀을 λͺ©λ‘μœΌλ‘œ 좜λ ₯ν•˜κΈ° μœ„ν•΄μ„œλŠ” for 반볡문 μ‚¬μš©
Post ν΄λž˜μŠ€μ— μƒˆλ‘­κ²Œ μƒμ„±ν•œ new_post μΈμŠ€ν„΄μŠ€λŠ” 좜λ ₯ μ‹œ Post ν΄λž˜μŠ€μ—μ„œ str λ˜λ”λ‘œ μ„€μ •ν•œ μ–‘μ‹μœΌλ‘œ 좜λ ₯됨

 

 

 

πŸ“– μ‹œκ³„ ν”„λ‘œκ·Έλž¨

class Counter
μ‹œ, λΆ„, μ΄ˆκ°€ κ³΅ν†΅μ μœΌλ‘œ 가지고 μžˆλŠ” νŠΉμ§•λ“€ 즉, 각 κ°’μ˜ μ΅œλŒ“κ°’, μ‹œκ°„μ˜ 증가, μ‹œκ°„ μ„€μ •, ν‘œμ‹œ 양식 μ •μ˜

class Clock
Counterμ—μ„œ μ •μ˜ν•œ λ©”μ†Œλ“œμ™€ μƒμ„±ν•œ μΈμŠ€ν„΄μŠ€λ₯Ό ν™œμš©ν•˜μ—¬ μ‹œ, λΆ„, 초둜 λ‚˜λˆ„μ–΄ ν‘œμ‹œ

 

β–Όβ–Όβ–Ό Counter 클래슀 β–Όβ–Όβ–Ό

속성 μ •μ˜ 
β‘  μ΅œλŒ“κ°’μ„ κ°’μœΌλ‘œ κ°€μ§€λŠ” μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ™€, μ΄ˆκΈ°κ°’ λ³€μˆ˜(κ°’ = 0) μ„€μ • (__init__) 
     : μ΅œλŒ“κ°’μ„ κ°’μœΌλ‘œ κ°€μ§€λŠ” μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ → limit

       μ΄ˆκΈ°κ°’ λ³€μˆ˜ → value

행동 μ •μ˜
β‘  μ‹œκ°„ μ„€μ • (set) : μƒˆλ‘œμš΄ 값을 μ„€μ •ν•˜λ©΄ value값은 μƒˆλ‘œμš΄ κ°’μœΌλ‘œ λ³€κ²½
β‘‘ 1μ΄ˆμ”© 증가 (tick) : λ§Œμ•½ valueκ°€ limit보닀 크면 valueλŠ” 0이 되고 limit보닀 μž‘μœΌλ©΄ value에 1μ”© 증가
β‘’ 2 자릿수둜 ν‘œκΈ° (__str__) : .zfill(2) μ‚¬μš©

 

 

β–Όβ–Όβ–Ό Clock 클래슀 β–Όβ–Όβ–Ό

__init__
Clock 클래슀 μ•ˆμ—μ„œ μ •μ˜ν•œ λ³€μˆ˜ HOURS, MINUTES, SECONDSλ₯Ό Count 클래슀의 limit와 value λ³€μˆ˜λ₯Ό λΆˆλŸ¬μ™€ μƒˆλ‘œμš΄ μΈμŠ€ν„΄μŠ€ 생성 → Clock ν΄λž˜μŠ€μ—μ„œ μƒμ„±λœ μΈμŠ€ν„΄μŠ€λŠ” 24κ°€ μ΅œλŒ“κ°’μ΄κ³ , 0이 기본값인 hourλΌλŠ” λ³€μˆ˜λ₯Ό 가짐 → μ‹œ, λΆ„, 초 λͺ¨λ‘ 기본값이 0μ΄λ―€λ‘œ set λ©”μ†Œλ“œ ν™œμš©ν•˜μ—¬ μ‹œκ°„ μ„€μ •


set
set λ©”μ†Œλ“œλŠ” Counter ν΄λž˜μŠ€μ—μ„œ μ •μ˜ν•œ set λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜μ—¬ νŒŒλΌλ―Έν„° hourλ₯Ό μƒˆλ‘œμš΄ κ°’μœΌλ‘œ μ„€μ •(minute, second도 λ§ˆμ°¬κ°€μ§€)

tick

tick λ©”μ†Œλ“œλŠ” Counter ν΄λž˜μŠ€μ—μ„œ μ •μ˜ν•œ tick λ©”μ†Œλ“œλ₯Ό 호좜
Counter 클래슀의 tick λ©”μ†Œλ“œμ—μ„œ 이미 μ΅œλŒ“κ°’λ³΄λ‹€ 클 경우 값이 0으둜 λ°”λ€Œλ„λ‘ μž‘μ„±
→ Clock 클래슀의 tick λ©”μ†Œλ“œμ—μ„œ ν•΄μ•Ό ν•  일은 μ΄ˆκ°€ μ΅œλŒ“κ°’λ³΄λ‹€ 클 경우 1λΆ„ 증가, 뢄이 μ΅œλŒ“κ°’μ„ λ„˜μœΌλ©΄ 1μ‹œκ°„ μΆ”κ°€, μ‹œκ°„μ΄ μ΅œλŒ“κ°’μ„ λ„˜μœΌλ©΄ 0이 λ˜λ„λ‘ μ„€μ •ν•΄μ•Ό 함 → if μ‚¬μš©