λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Language/Python

[Python]파이썬 클래슀: 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ 핡심 μ΄ν•΄ν•˜κΈ°

by YJ Dev 2024. 5. 1.
728x90
λ°˜μ‘ν˜•
SMALL

객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°(OOP)은 ν˜„μ‹€ μ„Έκ³„μ˜ λͺ¨λΈμ„ ν”„λ‘œκ·Έλž¨μœΌλ‘œ ν‘œν˜„ν•˜λŠ” ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„μž…λ‹ˆλ‹€. python은 이λ₯Ό μœ„ν•΄ 클래슀(Class)와 객체(Object)λΌλŠ” κ°œλ…μ„ μ œκ³΅ν•©λ‹ˆλ‹€. 이번 ν¬μŠ€νŒ…μ—μ„œλŠ” python ν΄λž˜μŠ€μ— λŒ€ν•΄ μžμ„Ένžˆ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

파이썬 클래슀


1. 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°πŸ§¬

객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ€ 문제λ₯Ό μž‘κ²Œ λ‚˜λˆ„κ³  객체λ₯Ό λ§Œλ“€λ©°, 이λ₯Ό μ‘°ν•©ν•˜μ—¬ 문제λ₯Ό ν•΄κ²°ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€. μ΄λŸ¬ν•œ μ ‘κ·Ό 방식은 λ³΅μž‘ν•œ 문제λ₯Ό μ²˜λ¦¬ν•˜λŠ” 데 μœ μš©ν•˜λ©°, κΈ°λŠ₯을 κ°œμ„ ν•˜κ³  λ°œμ „μ‹œν‚¬ λ•Œλ„ ν•΄λ‹Ή 클래슀만 μˆ˜μ •ν•˜λ©΄ λ˜λ―€λ‘œ μœ μ§€λ³΄μˆ˜μ— νš¨μœ¨μ μž…λ‹ˆλ‹€.

핡심 κ°œλ…

  • 문제 λΆ„ν•΄: 객체 재ν–₯ ν”„λ‘œκ·Έλž˜λ°μ—μ„œλŠ” 큰 문제λ₯Ό μž‘μ€ 문제둜 λ‚˜λˆ„μ–΄ ν•΄κ²°ν•©λ‹ˆλ‹€. 각 λ¬Έμ œλŠ” 객체둜 ν‘œν˜„λ˜λ©°, μ΄λŸ¬ν•œ κ°μ²΄λŠ” νŠΉμ • κΈ°λŠ₯을 μˆ˜ν–‰ν•˜κ³  정보λ₯Ό μ €μž₯ν•©λ‹ˆλ‹€.
  • 객체 생성: κ°μ²΄λŠ” 클래슀의 μΈμŠ€ν„΄μŠ€μž…λ‹ˆλ‹€. ν΄λž˜μŠ€λŠ” 객체λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•œ ν‹€λ‘œ, 속성(데이터)κ³Ό λ©”μ„œλ“œ(κΈ°λŠ₯)λ₯Ό ν¬ν•¨ν•©λ‹ˆλ‹€. κ°μ²΄λŠ” ν΄λž˜μŠ€μ— μ •μ˜λœ 속성과 λ©”μ„œλ“œλ₯Ό μ΄μš©ν•˜μ—¬ νŠΉμ •ν•œ λ™μž‘μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.
  • 객체 μ‘°ν•©: 객체듀은 μ„œλ‘œ μ—°κ²°λ˜μ–΄ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λ©°, 이λ₯Ό 톡해 전체 μ‹œμŠ€ν…œμ΄ μž‘λ™ν•©λ‹ˆλ‹€. λ‹€μ–‘ν•œ 객체듀을 μ‘°ν•©ν•˜μ—¬ λ³΅μž‘ν•œ 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μž₯점

  • μœ μ§€λ³΄μˆ˜ 용이: 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ€ μ½”λ“œλ₯Ό λͺ¨λ“ˆν™” ν•˜κ³  μž¬μ‚¬μš©μ„±μ„ λ†’μ—¬ μœ μ§€λ³΄μˆ˜λ₯Ό μš©μ΄ν•˜κ²Œ λ§Œλ“­λ‹ˆλ‹€. νŠΉμ • 클래슀의 μˆ˜μ •μ΄ ν•΄λ‹Ή 클래슀λ₯Ό μ‚¬μš©ν•˜λŠ” λ‹€λ₯Έ 뢀뢄에 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • ν™•μž₯μ„±: 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ€ κΈ°λŠ₯을 μΆ”κ°€ν•˜κ±°λ‚˜ λ³€κ²½ν•  λ•Œ μœ μ—°μ„±μ„ μ œκ³΅ν•©λ‹ˆλ‹€. μƒˆλ‘œμš΄ 클래슀λ₯Ό μž‘μ„±ν•˜κ±°λ‚˜ κΈ°μ‘΄ 클래슀λ₯Ό μƒμ†ν•˜μ—¬ κΈ°λŠ₯을 ν™•μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ½”λ“œ 가독성: 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ€ μ½”λ“œλ₯Ό λΆ„λ¦¬ν•˜μ—¬ 각 객체가 νŠΉμ • κΈ°λŠ₯을 μˆ˜ν–‰ν•˜λ―€λ‘œ μ½”λ“œμ˜ 가독성이 λ†’μ•„μ§‘λ‹ˆλ‹€. μ΄λŠ” μ½”λ“œλ₯Ό μ΄ν•΄ν•˜κ³  μœ μ§€λ³΄μˆ˜ν•˜λŠ” 데 도움이 λ©λ‹ˆλ‹€.

즉 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ€ λ³΅μž‘ν•œ 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 데 효과적인 λ°©λ²•μž…λ‹ˆλ‹€. 객체λ₯Ό μ€‘μ‹¬μœΌλ‘œ μ½”λ“œλ₯Ό κ΅¬μ„±ν•¨μœΌλ‘œμ¨ μœ μ§€λ³΄μˆ˜μ„±μ„ 높이고 ν™•μž₯성을 κ°–μΆ”λ©°, μ½”λ“œμ˜ 가독성을 λ†’μ—¬ 개발과 μœ μ§€λ³΄μˆ˜λ₯Ό 보닀 효율적으둜 μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.


2. ν΄λž˜μŠ€μ™€ 객체🍞

ν΄λž˜μŠ€λŠ” 객체λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•œ 틀이며, κ°μ²΄λŠ” ν•΄λ‹Ή 클래슀의 μΈμŠ€ν„΄μŠ€μž…λ‹ˆλ‹€. ν΄λž˜μŠ€μ™€ κ°μ²΄λŠ” μ„œλ‘œ κΈ΄λ°€ν•˜κ²Œ μ—°κ²°λ˜μ–΄ 있으며, ν΄λž˜μŠ€λŠ” 객체λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•œ μ²­μ‚¬μ§„μœΌλ‘œ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. ν΄λž˜μŠ€λŠ” 속성과 λ©”μ„œλ“œλ‘œ κ΅¬μ„±λ˜μ–΄ 있으며, 객체의 μƒνƒœμ™€ 행동을 μ •μ˜ν•©λ‹ˆλ‹€.

  • 클래슀(class): ν΄λž˜μŠ€λŠ” λ˜‘κ°™μ€ 무엇인가λ₯Ό κ³„μ†ν•΄μ„œ λ§Œλ“€μ–΄ λ‚Ό 수 μžˆλŠ” μ„€κ³„λ„λ‘œ 생각할 수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, κ³Όμžν‹€μ΄λ‚˜ λΆ•μ–΄λΉ΅ ν‹€κ³Ό κ°™μŠ΅λ‹ˆλ‹€. 이 섀계도λ₯Ό 톡해 객체λ₯Ό 생성할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 객체(object): κ°μ²΄λŠ” 클래슀의 μΈμŠ€ν„΄μŠ€λ‘œ, ν΄λž˜μŠ€μ—μ„œ λ§Œλ“€μ–΄μ§„ ꡬ체적인 κ°œμ²΄μž…λ‹ˆλ‹€. λΆ•μ–΄λΉ΅ ν‹€μ—μ„œ λ§Œλ“€μ–΄μ§„ μ‹€μ œ λΆ•μ–΄λΉ΅κ³Ό 같은 κ²ƒμœΌλ‘œ, 각각의 κ°μ²΄λŠ” 고유의 νŠΉμ„±μ„ 가지고 μžˆμŠ΅λ‹ˆλ‹€. νŒŒμ΄μ¬μ—μ„œλŠ” 문자, μ •μˆ˜, μ‹€μˆ˜, ν•¨μˆ˜ λ“± λͺ¨λ‘ κ°μ²΄μž…λ‹ˆλ‹€.
  • μΈμŠ€ν„΄μŠ€(instance): μΈμŠ€ν„΄μŠ€λŠ” νŠΉμ • 객체가 μ–΄λ–€ 클래슀의 객체인지λ₯Ό 관계 μœ„μ£Όλ‘œ μ„€λͺ…ν•  λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€. ν΄λž˜μŠ€μ™€ μ—°κ΄€ν•˜μ—¬ 객체λ₯Ό 지칭할 λ•Œ μΈμŠ€ν„΄μŠ€λΌκ³  ν•©λ‹ˆλ‹€. 즉, ν΄λž˜μŠ€λ‘œλΆ€ν„° μƒμ„±λœ 객체λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.
  • λ©”μ„œλ“œ(method): λ©”μ„œλ“œλŠ” 클래슀 μ•ˆμ—μ„œ κ΅¬ν˜„λœ ν•¨μˆ˜λ‘œ, νŠΉμ •ν•œ κΈ°λŠ₯을 μˆ˜ν–‰ν•©λ‹ˆλ‹€. μ΄λŠ” 개체의 λ™μž‘μ„ μ •μ˜ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.

μ•„λž˜ ν˜•μ‹μ„ 기반으둜 ν•˜λ©΄ ν΄λž˜μŠ€μ™€ 객체λ₯Ό μ‰½κ²Œ μ •μ˜ν•˜κ³  μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.


3.클래슀 μ •μ˜ν•˜κΈ°πŸ‘©‍🍳

ν΄λž˜μŠ€λŠ” 객체λ₯Ό λ§Œλ“€κΈ° μœ„ν•œ μ„€κ³„λ„μž…λ‹ˆλ‹€. 이 μ„€κ³„λ„μ—λŠ” 속성과 λ©”μ„œλ“œλ‘œ κ΅¬μ„±λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.
ν΄λž˜μŠ€κ°€ μ •μ˜λ˜λŠ” 과정은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

클래슀 μ •μ˜ ν˜•μ‹:

  • ν΄λž˜μŠ€λŠ” class ν‚€μ›Œλ“œλ‘œ μ‹œμž‘ν•˜μ—¬ class ν΄λž˜μŠ€μ΄λ¦„: κ³Ό κ°™μ΄ μ •μ˜λ©λ‹ˆλ‹€.
  • νŒŒμ΄μ¬μ—μ„œλŠ” ν΄λž˜μŠ€ μ΄λ¦„을 μΌλ°˜μ μœΌλ‘œ μ²« κΈ€ μžλ₯Ό λŒ€λ¬Έμžλ‘œ ν•˜λŠ” μΉ΄λ©œμΌ€μ΄μŠ€λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

λ©”μ„œλ“œ μ •μ˜:

  • 클래슀 λ‚΄λΆ€μ—λŠ” λ©”μ„œλ“œ(ν•¨μˆ˜)κ°€ μ •μ˜λ©λ‹ˆλ‹€.
  • λ©”μ„œλ“œλŠ” def λ©”μ„œλ“œμ΄λ¦„(self, λ§€κ°œλ³€μˆ˜): μ™€ κ°™μ΄ μ •μ˜λ©λ‹ˆλ‹€.
  • λ©”μ„œλ“œμ˜ μ²« λ²ˆμ§Έ λ§€κ°œλ³€μˆ˜λŠ” self둜 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ κ°μ²΄(μΈμŠ€ν„΄μŠ€)κ°€ μžλ™μœΌλ‘œ μ „λ‹¬λ©λ‹ˆλ‹€.
  • λ©”μ„œλ“œ λ‚΄λΆ€μ—μ„œλŠ” μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ₯Ό μ •μ˜ν•˜κ±°λ‚˜ λ‹€μ–‘ν•œ μž‘업을 μˆ˜ν–‰ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.

μΈμŠ€ν„΄μŠ€ 생성 ν˜•μ‹:

  • 클래슀λ₯Ό μ΄μš©ν•˜μ—¬ μ‹€μ œ κ°μ²΄(μΈμŠ€ν„΄μŠ€)λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
  • μΈμŠ€ν„΄μŠ€ μƒμ„±μ€ μΈμŠ€ν„΄μŠ€μ΄λ¦„ = ν΄λž˜μŠ€μ΄λ¦„()κ³Ό κ°™μ΄ μˆ˜ν–‰λ©λ‹ˆλ‹€.
  • μ΄λ•Œ ν΄λž˜μŠ€ μ΄λ¦„을 ν˜ΈμΆœν•˜λŠ” κ²ƒμ€ ν•΄λ‹Ή ν΄λž˜μŠ€μ˜ μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜λŠ” κ²ƒκ³Ό μœ μ‚¬ν•©λ‹ˆλ‹€.
  • 클래슀λ₯Ό λΆ•μ–΄λΉ΅ ν‹€μ΄λΌκ³  κ°€μ •ν–ˆμ„ λ•Œ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λŠ” κ²ƒμ€ λΆ•μ–΄λΉ΅μ„ κ΅½λŠ” ν–‰μœ„와 μœ μ‚¬ν•©λ‹ˆλ‹€.

μΈμŠ€ν„΄μŠ€ ν˜ΈμΆœ ν˜•μ‹:

  • μΈμŠ€ν„΄μŠ€λ₯Ό ν†΅ν•΄ ν΄λž˜μŠ€μ˜ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
  • λ©”μ„œλ“œ ν˜ΈμΆœμ€ μΈμŠ€ν„΄μŠ€.λ©”μ„œλ“œμ΄λ¦„()κ³Ό κ°™μ΄ μˆ˜ν–‰λ©λ‹ˆλ‹€.
  • μ΄λ•Œ λ©”μ„œλ“œ ν˜ΈμΆœ μ‹œμ—λŠ” μΈμŠ€ν„΄μŠ€ μžμ²΄κ°€ λ©”μ„œλ“œμ˜ μ²« λ²ˆμ§Έ λ§€κ°œλ³€μˆ˜μΈ self둜 μžλ™μœΌλ‘œ μ „λ‹¬λ©λ‹ˆλ‹€.
  • λ©”μ„œλ“œ ν˜ΈμΆœμ€ κ°μ²΄κ°€ κ°€μ§€λŠ” κΈ°λŠ₯을 μ‹€ν–‰ν•˜λŠ” κ²ƒκ³Ό μœ μ‚¬ν•©λ‹ˆλ‹€.
# 클래슀 μ •μ˜ ν˜•μ‹
class ν΄λž˜μŠ€μ΄λ¦„:  # νŒŒμ΄μ¬μ—μ„œλŠ” ν΄λž˜μŠ€μ΄λ¦„μ„ 주둜 λŒ€λ¬Έμžλ‘œ μ‹œμž‘
     def λ©”μ„œλ“œμ΄λ¦„(self, λ§€κ°œλ³€μˆ˜):
         # self -> λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ 객체가 μžλ™μœΌλ‘œ μ „λ‹¬λ˜λŠ” λ§€κ°œλ³€μˆ˜
        self.속성 = κ°’  # μΈμŠ€ν„΄μŠ€ λ³€μˆ˜

# μΈμŠ€ν„΄μŠ€ 생성 ν˜•μ‹
μΈμŠ€ν„΄μŠ€μ΄λ¦„ = ν΄λž˜μŠ€μ΄λ¦„()  # μΈμŠ€ν„΄μŠ€(객체) 생성 -> λΆ•μ–΄λΉ΅ κ΅½λŠ” ν–‰μœ„

# λ©”μ„œλ“œ 호좜 ν˜•μ‹
μΈμŠ€ν„΄μŠ€μ΄λ¦„.λ©”μ„œλ“œμ΄λ¦„()  # λ©”μ„œλ“œ (ν•¨μˆ˜) 호좜
# 클래슀 μ •μ˜ ν˜•μ‹
class Car:  # 클래슀 이름은 주둜 λŒ€λ¬Έμžλ‘œ μ‹œμž‘
    def set_model(self, model):
        """
        μžλ™μ°¨ λͺ¨λΈμ„ μ„€μ •ν•˜λŠ” λ©”μ„œλ“œ
        :param model: μ„€μ •ν•  μžλ™μ°¨ λͺ¨λΈ
        """
        self.model = model  # μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ μ„€μ •

# μΈμŠ€ν„΄μŠ€ 생성 ν˜•μ‹
my_car = Car()  # μžλ™μ°¨ 객체 생성 -> λΆ•μ–΄λΉ΅ κ΅½λŠ” ν–‰μœ„

# λ©”μ„œλ“œ 호좜 ν˜•μ‹
my_car.set_model("Samsung")  # μžλ™μ°¨ λͺ¨λΈ μ„€μ • λ©”μ„œλ“œ 호좜


클래슀 λ‚΄λΆ€μ—λŠ” 클래슀 멀버와 μΈμŠ€ν„΄μŠ€ 멀버λ₯Ό μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • 클래슀 멀버: 클래슀 λ‚΄λΆ€μ—μ„œ μ •μ˜λœ λ³€μˆ˜λ‘œ, λͺ¨λ“  μΈμŠ€ν„΄μŠ€μ—μ„œ κ³΅μœ λ©λ‹ˆλ‹€.
  • μΈμŠ€ν„΄μŠ€ 멀버: 각 μΈμŠ€ν„΄μŠ€λ§ˆλ‹€ κ³ μœ ν•œ 값을 κ°€μ§€λŠ” λ³€μˆ˜λ‘œ, 주둜 μƒμ„±μžλ₯Ό 톡해 μ΄ˆκΈ°ν™”λ©λ‹ˆλ‹€.
class MyClass:
    class_variable = 0  # 클래슀 멀버

    def __init__(self, instance_variable):
        self.instance_variable = instance_variable  # μΈμŠ€ν„΄μŠ€ 멀버

# 클래슀 멀버에 μ ‘κ·Ό
print("클래슀 멀버에 μ ‘κ·Ό:")
print("MyClass.class_variable:", MyClass.class_variable)

# μΈμŠ€ν„΄μŠ€ 생성 및 μΈμŠ€ν„΄μŠ€ 멀버에 μ ‘κ·Ό
print("\nμΈμŠ€ν„΄μŠ€ 생성 및 μΈμŠ€ν„΄μŠ€ 멀버에 μ ‘κ·Ό:")
obj1 = MyClass(1)
obj2 = MyClass(2)
print("obj1.instance_variable:", obj1.instance_variable)
print("obj2.instance_variable:", obj2.instance_variable)

# 클래슀 멀버 λ³€κ²½
print("\n클래슀 멀버 λ³€κ²½:")
MyClass.class_variable = 10
print("MyClass.class_variable:", MyClass.class_variable)
print("obj1.class_variable:", obj1.class_variable)  # μΈμŠ€ν„΄μŠ€μ—μ„œλ„ 클래슀 멀버에 μ ‘κ·Ό κ°€λŠ₯
print("obj2.class_variable:", obj2.class_variable)

# μΈμŠ€ν„΄μŠ€ 멀버 λ³€κ²½
print("\nμΈμŠ€ν„΄μŠ€ 멀버 λ³€κ²½:")
obj1.instance_variable = 100
print("obj1.instance_variable:", obj1.instance_variable)
print("obj2.instance_variable:", obj2.instance_variable)
class Car:  # 클래슀 μ •μ˜
    count = 0  # 클래슀 λ³€μˆ˜ μ •μ˜

    def __init__(self, name, speed):  # μƒμ„±μž
        self.name = name  # μΈμŠ€ν„΄μŠ€ λ³€μˆ˜
        self.speed = speed  # μΈμŠ€ν„΄μŠ€ λ³€μˆ˜
        Car.count += 1  # 클래슀 λ³€μˆ˜λ₯Ό 1 μ¦κ°€μ‹œν‚΄

    def info(self):  # μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ μ •μ˜
        """
        μžλ™μ°¨μ˜ 정보와 ν˜„μž¬ μƒμ‚°λœ μžλ™μ°¨ 수λ₯Ό 좜λ ₯ν•˜λŠ” λ©”μ„œλ“œ
        """
        print(f'{self.name}의 ν˜„μž¬ 속도 : {self.speed}km')
        print(f'μƒμ‚°λœ μžλ™μ°¨ 수 : {Car.count}λŒ€')
        print('--------------------------------')

car1 = Car('λΆ•λΆ•μΉ΄', 0)  # μΈμŠ€ν„΄μŠ€(객체) 생성(μƒμ„±μžλ„ 호좜)
car1.info()  # μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ 호좜


μƒμ„±μž(constructor)
λŠ” 객체가 생성될 λ•Œ μžλ™μœΌλ‘œ ν˜ΈμΆœλ˜μ–΄ μ΄ˆκΈ°ν™” μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” λ©”μ„œλ“œμž…λ‹ˆλ‹€. κ°μ²΄μ—μ„œ μ΄ˆκΉƒκ°’μ„ μ„€μ •ν•΄μ•Ό ν•  ν•„μš”κ°€ μžˆμ„ λ•Œ 주둜 μ‚¬μš©λ©λ‹ˆλ‹€. νŒŒμ΄μ¬μ—μ„œλŠ” μƒμ„±μžλ‘œ __init__ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λ©°, μ΄λŠ” μŠ€μΌ€μ…œ λ©”μ„œλ“œ(맀직 λ©”μ„œλ“œ)둜 μ•žλ’€λ‘œ 두 개의 밑쀄이 λΆ™μŠ΅λ‹ˆλ‹€. μƒμ„±μžλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ€ μ˜ˆμ œμ™€ μ‚¬μš©ν•œ 예제λ₯Ό 비ꡐ해 μƒμ„±μžμ— λŒ€ν•΄ μžμ„Ένžˆ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€. λ¨Όμ € μƒμ„±μžλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ€ 예제λ₯Ό 확인해 λ³΄κ² μŠ΅λ‹ˆλ‹€.

class Candy:
    def set_info(self, shape, color):  # μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ μ •μ˜
        self.shape = shape  # μΈμŠ€ν„΄μŠ€ λ³€μˆ˜
        self.color = color

    def print_info(self):  # μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ μ •μ˜
        print(self.shape)
        print(self.color)

satang = Candy()  # μΈμŠ€ν„΄μŠ€(객체) 생성
satang.set_info('circle', 'brown')  # μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ 호좜
satang.print_info()  # μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ 호좜
class Candy2:
    def __init__(self, shape, color):  # μƒμ„±μž
        self.shape = shape
        self.color = color

    def print_info(self):
        print(self.shape)
        print(self.color)

satang2 = Candy2('circle', 'red')  # 객체 생성과 λ™μ‹œμ— μƒμ„±μžλ₯Ό 호좜
satang2.print_info()  # μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ 호좜

satang3 = Candy2('oval', 'pink')
satang3.print_info()


μƒμ„±μžλ₯Ό μ‚¬μš©ν•˜λ©΄ 객체가 생성될 λ•Œ μ΄ˆκΈ°κ°’μ„ μ„€μ •ν•  수 μžˆμ–΄μ„œ μ½”λ“œμ˜ 가독성을 높이고, 객체 생성 과정을 λ‹¨μˆœν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.


4.클래슀 λ©”μ„œλ“œμ™€ μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œπŸ°

클래슀 λ©”μ„œλ“œ(Class Method)와 μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ(Instance Method)λŠ” νŒŒμ΄μ¬μ—μ„œ 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ„ ν•  λ•Œ μ€‘μš”ν•œ 역할을 ν•˜λŠ” 두 가지 μ’…λ₯˜μ˜ λ©”μ„œλ“œμž…λ‹ˆλ‹€.

  • 클래슀 λ©”μ„œλ“œ
    • 클래슀 λ©”μ„œλ“œλŠ” ν΄λž˜μŠ€μ— μ†ν•œ λ©”μ„œλ“œλ‘œ, 클래슀 λ˜λŠ” μΈμŠ€ν„΄μŠ€λ₯Ό 톡해 호좜될 수 μžˆμŠ΅λ‹ˆλ‹€.
    • @classmethod λ°μ½”λ ˆμ΄ν„°λ₯Ό 톡해 ν‘œμ‹œλ©λ‹ˆλ‹€.
    • 첫 번째 λ§€κ°œλ³€μˆ˜λ‘œ clsλ₯Ό μ‚¬μš©ν•˜λ©°, 클래슀 자체λ₯Ό κ°€λ¦¬ν‚΅λ‹ˆλ‹€.
    • 클래슀 λ©”μ„œλ“œλŠ” 클래슀 λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜κ±°λ‚˜ 클래슀 μˆ˜μ€€μ˜ μž‘μ—…μ„ μˆ˜ν–‰ν•  λ•Œ 주둜 ν™œμš©λ©λ‹ˆλ‹€.
  • μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ
    • μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλŠ” νŠΉμ • μΈμŠ€ν„΄μŠ€μ— μ†ν•œ λ©”μ„œλ“œλ‘œ, ν•΄λ‹Ή μΈμŠ€ν„΄μŠ€λ₯Ό 톡해 ν˜ΈμΆœλ©λ‹ˆλ‹€.
    • 일반적으둜 객체의 μƒνƒœλ₯Ό μ‘°μž‘ν•˜κ±°λ‚˜ 객체 μˆ˜μ€€μ˜ μž‘μ—…μ„ μˆ˜ν–‰ν•  λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.
    • λ©”μ„œλ“œμ˜ 첫 번째 λ§€κ°œλ³€μˆ˜λ‘œ selfλ₯Ό μ‚¬μš©ν•˜λ©°, ν•΄λ‹Ή λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ μΈμŠ€ν„΄μŠ€λ₯Ό κ°€λ¦¬ν‚΅λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, μžλ™μ°¨ ν΄λž˜μŠ€μ—μ„œ start() λ©”μ„œλ“œκ°€ μžˆμ„ 경우:

  • 클래슀 λ©”μ„œλ“œλ‘œ μ •μ˜λœ 경우, λͺ¨λ“  μžλ™μ°¨μ˜ μ‹œλ™μ„ κ±Έκ±°λ‚˜ 끌 λ•Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλ‘œ μ •μ˜λœ 경우, νŠΉμ • μžλ™μ°¨μ˜ μ‹œλ™μ„ κ±Έκ±°λ‚˜ 끌 λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.
class Car:
    # 클래슀 λ³€μˆ˜
    car_count = 0

    def __init__(self, brand, model):
        # μΈμŠ€ν„΄μŠ€ λ³€μˆ˜
        self.brand = brand
        self.model = model
        Car.car_count += 1

    @classmethod
    def start_all(cls):
        """
        λͺ¨λ“  μžλ™μ°¨μ˜ μ‹œλ™μ„ κ±Έ λ•Œ μ‚¬μš©λ˜λŠ” 클래슀 λ©”μ„œλ“œ
        """
        print("μ‹œλ™μ„ κ±Έμ—ˆμŠ΅λ‹ˆλ‹€.")
        # μ—¬κΈ°μ—μ„œ λͺ¨λ“  μžλ™μ°¨μ˜ μ‹œλ™μ„ 건닀고 κ°€μ •ν•˜κ³  λ™μž‘μ„ μž‘μ„±ν•œλ‹€.

    def start(self):
        """
        νŠΉμ • μžλ™μ°¨μ˜ μ‹œλ™μ„ κ±Έ λ•Œ μ‚¬μš©λ˜λŠ” μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ
        """
        print(f"{self.brand} {self.model}의 μ‹œλ™μ„ κ±Έμ—ˆμŠ΅λ‹ˆλ‹€.")
        # μ—¬κΈ°μ—μ„œ νŠΉμ • μžλ™μ°¨μ˜ μ‹œλ™μ„ 건닀고 κ°€μ •ν•˜κ³  λ™μž‘μ„ μž‘μ„±ν•œλ‹€.

# 클래슀 λ©”μ„œλ“œ 호좜
Car.start_all()

# μΈμŠ€ν„΄μŠ€ 생성
car1 = Car("ν˜„λŒ€", "μ†Œλ‚˜νƒ€")
car2 = Car("κΈ°μ•„", "K5")

# μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ 호좜
car1.start()
car2.start()


클래슀 λ©”μ„œλ“œμ™€ μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλŠ” 각각의 μš©λ„μ— 맞게 적절히 μ‚¬μš©λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. 클래슀 λ©”μ„œλ“œλŠ” 클래슀 μ „λ°˜μ μΈ μž‘μ—…μ— μ‚¬μš©λ˜κ³ , μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλŠ” μΈμŠ€ν„΄μŠ€λ³„λ‘œ λ‹€λ₯Έ μž‘μ—…μ— μ‚¬μš©λ©λ‹ˆλ‹€.


5.상속πŸ‘ͺ

상속은 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ μ€‘μš”ν•œ κ°œλ…μœΌλ‘œ, 상속을 μ‚¬μš©ν•˜λ©΄ κΈ°μ‘΄ 클래슀의 λͺ¨λ“  속성과 λ©”μ„œλ“œλ₯Ό μƒˆλ‘œμš΄ ν΄λž˜μŠ€μ—μ„œ μž¬μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” μ½”λ“œμ˜ 쀑볡을 쀄이고, μ½”λ“œλ₯Ό 더 κ°„κ²°ν•˜κ³  μœ μ—°ν•˜κ²Œ λ§Œλ“€μ–΄μ€λ‹ˆλ‹€. λ˜ν•œ, 상속을 톡해 클래슀 κ°„μ˜ 관계λ₯Ό λͺ…ν™•νžˆ ν•˜μ—¬ μ½”λ“œμ˜ 이해와 μœ μ§€λ³΄μˆ˜λ₯Ό μ‰½κ²Œ λ§Œλ“€μ–΄μ€λ‹ˆλ‹€.
νŒŒμ΄μ¬μ—μ„œλŠ” 클래슀 μ •μ˜ μ‹œ κ΄„ν˜Έ μ•ˆμ— 상속받을 클래슀의 이름을 λ„£μ–΄μ„œ 상속을 κ΅¬ν˜„ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ class SubClass(SuperClass): 와 같이 μž‘μ„±ν•˜μ—¬ SubClassκ°€ SuperClassλ₯Ό 상속받도둝 ν•©λ‹ˆλ‹€.

class SuperClass:
    # λΆ€λͺ¨ 클래슀의 속성과 λ©”μ„œλ“œ μ •μ˜
    pass

class SubClass(SuperClass):
    # SubClass의 κ³ μœ ν•œ 속성과 λ©”μ„œλ“œ μ •μ˜
    pass


상속을 μ΄μš©ν•œ 예제λ₯Ό 톡해 μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

class Person:  # 슈퍼 클래슀(λΆ€λͺ¨ 클래슀)
    def __init__(self, name):  # μƒμ„±μž
        """
        Person 클래슀의 μƒμ„±μžμž…λ‹ˆλ‹€.
        :param name: 이름
        """
        self.name = name

    def eat(self, food):  # μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ μ •μ˜
        """
        μŒμ‹μ„ λ¨ΉλŠ” λ©”μ„œλ“œμž…λ‹ˆλ‹€.
        :param food: 먹을 μŒμ‹
        """
        print(f'{self.name}κ°€ {food}λ₯Ό λ¨ΉμŠ΅λ‹ˆλ‹€.')

class Student(Person):  # μ„œλΈŒ 클래슀(μžμ‹ 클래슀)
    def __init__(self, name, school):  # μƒμ„±μž
        """
        Student 클래슀의 μƒμ„±μžμž…λ‹ˆλ‹€.
        :param name: 이름
        :param school: 학ꡐ
        """
        super().__init__(name)  # 슈퍼(λΆ€λͺ¨) 클래슀의 μƒμ„±μžλ₯Ό 호좜
        self.school = school

    def study(self):  # μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ μ •μ˜
        """
        κ³΅λΆ€ν•˜λŠ” λ©”μ„œλ“œμž…λ‹ˆλ‹€.
        """
        print(f'{self.name}λŠ” {self.school}μ—μ„œ 곡뢀λ₯Ό ν•©λ‹ˆλ‹€.')

potter = Student('해리포터', 'ν˜Έκ·Έμ™€νŠΈ')
potter.eat('저리')  # 상속받은 λ©”μ„œλ“œ 호좜
potter.study()  # μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ 호좜
class Coffee:  # 슈퍼 클래슀(λΆ€λͺ¨ 클래슀)
    def __init__(self, bean):  # μƒμ„±μž
        """
        Coffee 클래슀의 μƒμ„±μžμž…λ‹ˆλ‹€.
        :param bean: 원두
        """
        self.bean = bean

    def coffee_info(self):  # μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ μ •μ˜
        """
        컀피 정보λ₯Ό 좜λ ₯ν•˜λŠ” λ©”μ„œλ“œμž…λ‹ˆλ‹€.
        """
        print('원두: {}'.format(self.bean))

class Espresso(Coffee):  # μ„œλΈŒ 클래슀(μžμ‹ 클래슀)
    def __init__(self, bean, water):  # μƒμ„±μž
        """
        Espresso 클래슀의 μƒμ„±μžμž…λ‹ˆλ‹€.
        :param bean: 원두
        :param water: 물의 μ–‘
        """
        super().__init__(bean)  # λΆ€λͺ¨μ˜ μƒμ„±μžλ₯Ό 호좜
        self.water = water

    def espresso_info(self):  # μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ μ •μ˜
        """
        μ—μŠ€ν”„λ ˆμ†Œ 정보λ₯Ό 좜λ ₯ν•˜λŠ” λ©”μ„œλ“œμž…λ‹ˆλ‹€.
        """
        super().coffee_info()  # λΆ€λͺ¨ 클래슀의 λ©”μ„œλ“œλ₯Ό 호좜
        print('λ¬Ό: {}ml'.format(self.water))

coffee = Espresso('μ½œλ‘¬λΉ„μ•„', 30)  # μΈμŠ€ν„΄μŠ€(객체) 생성
coffee.espresso_info()  # μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ 호좜

coffee2 = Espresso('μ˜ˆκ°€μ²΄ν”„', 50)
coffee2.espresso_info()


상속은 κΈ°μ‘΄ 클래슀의 속성과 λ©”μ„œλ“œλ₯Ό μƒˆλ‘œμš΄ ν΄λž˜μŠ€μ—μ„œ μž¬μ‚¬μš©ν•  수 μžˆλŠ” κ°•λ ₯ν•œ λ„κ΅¬μž…λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 닀쀑 상속을 μ‚¬μš©ν•  λ•Œμ—λŠ” μ£Όμ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€. 닀쀑 상속은 ν•œ ν΄λž˜μŠ€κ°€ μ—¬λŸ¬ 개의 λΆ€λͺ¨ ν΄λž˜μŠ€λ‘œλΆ€ν„° 상속을 λ°›λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€. νŒŒμ΄μ¬μ€ 닀쀑 상속을 μ§€μ›ν•˜μ§€λ§Œ, μ΄μ—λŠ” λͺ‡ 가지 μ£Όμ˜ν•  점이 μžˆμŠ΅λ‹ˆλ‹€.
닀쀑 상속을 μ‚¬μš©ν•˜λ©΄ μ½”λ“œμ˜ λ³΅μž‘μ„±μ΄ 증가할 수 있고, 클래슀 κ°„μ˜ μ˜μ‘΄μ„±μ΄ λ†’μ•„μ Έμ„œ μ½”λ“œλ₯Ό μ΄ν•΄ν•˜κΈ° μ–΄λ €μ›Œμ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ, 닀이아λͺ¬λ“œ 상속과 같은 νŠΉμ • μƒν™©μ—μ„œλŠ” λ©”μ„œλ“œ 좩돌이 λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ 이유둜 닀쀑 상속을 μ‚¬μš©ν•  λ•Œμ—λŠ” μ‹ μ€‘ν•˜κ²Œ κ³ λ €ν•΄μ•Ό ν•©λ‹ˆλ‹€. κ°€λŠ₯ν•œ 경우 단일 상속을 μ‚¬μš©ν•˜κ³ , ν•„μš”ν•œ κ²½μš°μ—λ§Œ 닀쀑 상속을 μ‚¬μš©ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

πŸ™Œ μ—¬κΈ°μ„œ 잠깐

닀이아λͺ¬λ“œ μƒμ†μ΄λž€?
닀이아λͺ¬λ“œ 상속은 닀쀑 상속 κ΅¬μ‘°μ—μ„œ νŠΉμ • ν΄λž˜μŠ€κ°€ 두 개 μ΄μƒμ˜ μƒμœ„ ν΄λž˜μŠ€λ‘œλΆ€ν„° 상속을 받을 λ•Œ λ°œμƒν•˜λŠ” 문제λ₯Ό λ§ν•©λ‹ˆλ‹€. μ΄λŠ” λ‹€μŒκ³Ό 같은 상속 κ΅¬μ‘°μ—μ„œ λ°œμƒν•©λ‹ˆλ‹€.

    A
   / \
  B   C
   \ /
    D

μ—¬κΈ°μ„œ 클래슀 Dκ°€ 클래슀 B와 클래슀 Cλ‘œλΆ€ν„° 상속을 λ°›κ³ , 클래슀 B와 클래슀 CλŠ” λͺ¨λ‘ 클래슀 Aλ‘œλΆ€ν„° 상속을 λ°›λŠ” 경우λ₯Ό κ³ λ €ν•΄ λ΄…μ‹œλ‹€. 이런 κ΅¬μ‘°μ—μ„œ 클래슀 DλŠ” 클래슀 A의 속성과 λ©”μ„œλ“œλ₯Ό μ€‘λ³΅μœΌλ‘œ μƒμ†λ°›κ²Œ λ©λ‹ˆλ‹€. 이둜 인해 λ©”μ„œλ“œ 좩돌이 λ°œμƒν•  수 있고, 클래슀 κ°„μ˜ μ˜μ‘΄μ„±μ΄ λ†’μ•„μ Έμ„œ μ½”λ“œλ₯Ό μ΄ν•΄ν•˜κΈ° μ–΄λ €μ›Œμ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.

닀이아λͺ¬λ“œ 상속은 κ·Έ λͺ¨μ–‘이 닀이아λͺ¬λ“œμ™€ μœ μ‚¬ν•˜μ—¬ μ΄λ ‡κ²Œ 뢈리며, μ΄λŸ¬ν•œ 상속 ꡬ쑰λ₯Ό λ§Œλ‚˜λ©΄ λ©”μ„œλ“œ 좩돌 λ“±μ˜ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μ μ ˆν•œ λ°©λ²•μœΌλ‘œ 닀쀑 상속을 μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.


6.핡심 λ‚΄μš©πŸ‘€

파이썬 클래슀
728x90
λ°˜μ‘ν˜•
LIST