클래스 심화

JoyJuhee·2022년 11월 1일
0

Python

목록 보기
15/22
post-thumbnail

절차 지향 vs 객체 지향

1) 절차 지향 : 기능들을 어떤 순서로 처리할 것인가에 초점을 맞춘다.

2) 객체 지향 : 객체가 중심이 되고, 객체를 정의하고 객체간 상호작용에 초점을 맞춘다.

👉 프로그램의 규모가 작으면 절차 지향, 크면 객체 지향을 주로 사용한다.

클래스 속성

1) 인스턴스 속성 : 객체마다 다르게 가지는 속성

class Unit:
   
    def __init__(self, name, hp, shield, damage): 
        self.name = name # self는 객체 자기 자신을 의미
        self.hp = hp
        self.shield = shield
        self.damage = damage # 얘네들이 인스턴스 속성
       

✅ 클래스 안에서 속성을 사용할 때 : self.속성명
✅ 클래스 밖에서 속성을 사용할 때 : 객체명.속성명

2) 클래스 속성 : 모든 객체가 공유하는 속성

class Unit:
   
    count = 0 
    def __init__(self, name, hp, shield, damage): 
        self.name = name # self는 객체 자기 자신을 의미
        self.hp = hp
        self.shield = shield
        self.damage = damage # 얘네들이 인스턴스 속성
        Unit.count += 1 # 클래스 속성은 클래스명.속성명

3) 비공개 속성 : 클래스 안에서만 접근 가능한 속성

class Unit:
   
    def __init__(self, name, hp, shield, damage): 
        self.name = name # self는 객체 자기 자신을 의미
        self.__hp = hp # 비공개 속성으로 클래스 밖에서 변경이 불가능
        self.shield = shield
        self.damage = damage 

👉 클래스 밖에서 접근하려고 한다면? 네임 맹글링 사용

# 네임 맹글링 (name mangling)
probe._Unit__hp = 9999

메서드 종류

1) 인스턴스 메서드 : 인스턴스 속성에 접근할 수 있는 메서드

  • 항상 첫번째 파라미터로 self를 갖는다.

2) 클래스 메서드 : 클래스 속성에 접근하기 위해서 사용

  • 클래스를 의미하는 cls를 파라미터로 받는다.
  • @classmethod

3) 정적 메서드 : 인스턴스를 만들 필요가 없는 메서드

  • self를 받지 않는다.
  • 메서드가 인스턴스 유무와 관계없이 독립적으로 사용될 때
  • @staticmethod
class Math:
	def add(x,y):
    	return x + y
    
    def sub(x,y):
    	return x - y

4) 매직 메서드 : 클래스안에 정의할 수 있는 스페셜 메서드

  • 특별한 상황에 호출된다.
__init__
__str__ 과 같은 메서드를 말한다.
dir(인스턴스명)print하면 매직 메서드에 대한 정보를 얻을 수 있다.

상속

: 클래스들의 공통된 속성과 메서드를 뽑아내서 부모 클래스를 만든다.
-> 이를 자식 클래스에서 상속받아서 사용한다.

1) 장점

  • 코드의 중복을 제거할 수 있다.
  • 유지보수가 편해진다.
class Item:
    """
    속성 : 이름
    메서드 : 줍기, 버리기
    
    """
    def __init__(self, name):
        self.name = name
    
    def pick(self):
        print(f"[{self.name}]을(를) 주웠습니다.")
    
    def discard(self):
        print(f"[{self.name}]을(를) 버렸습니다.")


class Weapon(Item):
    """
    속성 : 공격력
    메서드 : 공격하기
    """
    def __init__(self, name, damage):
        super().__init__(name) # 부모 클래스 호출
        self.damage = damage
    
    def attack(self):
        print(f"[{self.name}을(를) 이용해 {self.damage}로 공격합니다.]")

class HealingItem(Item):
    """
    속성 : 회복량
    메서드: 사용하기
    """
    def __init__(self, name, recovery_amount):
        super().__init__(name)
        self.recovery_amount = recovery_amount
    
    def use(self):
        print(f"[{self.name}을(를) 사용합니다. {self.recovery_amount} 회복]")

m16 = Weapon("m16", 110)
bungdae = HealingItem("붕대", 20)

m16.attack()
bungdae.use()

2) 추상 클래스

  • 추상 메서드 : 상속받는 자식 클래스에서 구현을 강제하도록 만드는 것(자식 클래스에서 반드시 구현)
from abc import *

class Item(metaclass=ABCMeta): # 추상클래스로 만들어줌
    """
    속성 : 이름
    메서드 : 줍기, 버리기
    
    """
    def __init__(self, name):
        self.name = name
    
    def pick(self):
        print(f"[{self.name}]을(를) 주웠습니다.")
    
    def discard(self):
        print(f"[{self.name}]을(를) 버렸습니다.")
    
    @abstractmethod
    def use(self):
        pass


class Weapon(Item):
    """
    속성 : 공격력
    메서드 : 공격하기
    """
    def __init__(self, name, damage):
        super().__init__(name) # 부모 클래스 호출
        self.damage = damage
    
    def use(self): #attack이 아닌 use를 사용해야 한다. 
        print(f"[{self.name}을(를) 이용해 {self.damage}로 공격합니다.]")

class HealingItem(Item):
    """
    속성 : 회복량
    메서드: 사용하기
    """
    def __init__(self, name, recovery_amount):
        super().__init__(name)
        self.recovery_amount = recovery_amount
    
    def use(self):
        print(f"[{self.name}을(를) 사용합니다. {self.recovery_amount} 회복]")

m16 = Weapon("m16", 110)
bungdae = HealingItem("붕대", 20)

m16.use()
bungdae.use()

출처 : 패스트캠퍼스 Python & Django로 시작하는 웹 프로그래밍

0개의 댓글