Python

[Python] Class 총정리

곽가누 2023. 3. 6. 05:28

다른 부분에 비해 많이 이해하기 힘들었던 파트라 정리해두기로 했습니다.

게임 캐릭터를 만든다고 생각하면 쉽습니다. 활을 쏘건, 검을 휘두르건 각 캐릭터는 공통적으로 하는 행동이 있을 텐데요. 예시를 오버워치로 들어보겠습니다. 오버워치의 영웅들은 단축키를 누르면 그에 맞는 대사를 합니다. “안녕하세요.”,”치유가 필요합니다.” 등등. 우리는 각자의 영웅에게 맞는 함수를 정해줄 필요 없이, class를 사용하여 모든 영웅에게 일괄적으로 적용시킬 수 있습니다.

class Hero:
    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender
        
    def speak(self, words):
        print(f"{self.name}이(가) '{words}'라고 말했습니다.")
        
    def ultimate(self):
        print(f"{self.name}이(가) 궁극기를 사용했습니다.")

위 클래스에서 __init__ 메소드는 객체를 생성할 때 실행되는 메소드입니다. 옆의 괄호에는 해당하는 값(name, age, gender)을 모두 채워넣어야 오류가 나지 않습니다. 그러나 self 부분은 아래 코드처럼 예외입니다. self 매개변수는 객체 자신을 나타냅니다.

person1 = Hero("Merci", 38, "여성")
person2 = Hero("Genzi", 35, "남성")

이 코드는 Hero 클래스를 이용하여 객체를 생성한 것입니다.

person1.speak("안녕하세요")
#D.VA이(가) '안녕하세요'라고 말했습니다.

person2.ultimate()
#Genzi이(가) 궁극기를 사용했습니다. 

다음과 같은 방법으로 객체의 행동을 나타낼 수 있습니다.

 

  • 매개변수 self VS 전역변수
더보기

저만 헷갈렸던 부분인 것 같지만, 혹시 몰라 적어봅니다.

클래스 변수와 매개변수 **self**는 파이썬 클래스에서 서로 다른 역할을 수행합니다.

class Circle:
    pi = 3.14
    
    def __init__(self, radius):
        self.radius = radius
        
    def circumference(self):
        return 2 * Circle.pi * self.radius

클래스 변수는 모든 객체에게 영향을 미칩니다. 모든 객체가 클래스 변수를 공유하므로, 한 객체에서 값을 변경하면 다른 객체에서도 변경된 값을 볼 수 있습니다.

class Rectangle:
    def __init__(self, width, height):
        self.width = width
        self.height = height
        
    def area(self):
        return self.width * self.height

그러나, 매개변수 self는 객체 내부의 속성과 메소드에 접근하는 데 사용됩니다. 위 예제에서 width와 height는 객체의 속성으로, self를 통해 접근합니다. 사각형 마다 값이 달라지는 것입니다.

 

  • f -string
더보기

f-string(f 문자열 리터럴)은 파이썬 3.6부터 추가된 기능으로, 문자열 안에서 변수 값을 편리하게 포맷팅할 수 있는 기능입니다.


상속

앞에선, 모든 영웅이 공통적으로 하는 행동에 대해서만 지정을 했습니다. 하지만 class 에서, 영웅마다 다른 스킬을 지정하는 방법은 없을까요?

답은 바로 ‘상속’을 이용하는 것입니다.

class Hero:
    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender
        
    def speak(self, words):
        print(f"{self.name}이(가) '{words}'라고 말했습니다.")
        
    def ultimate(self):
        print(f"{self.name}이(가) 궁극기를 사용했습니다.")
    
    def skill(self):
        pass 

class Merci(Hero):
    def skill(self):
        return "메르시가 부활 능력을 사용했습니다."

class Genzi(Hero):
    def skill(self):
        return "겐지가 튕겨내기 능력을 사용했습니다."