본문 바로가기
DEV/파이썬 이론

파이썬 코딩 :: 파이썬 클래스(class)

by 올커 2022. 9. 2.

파이썬 class


1. class

  - 클래스는 객체(Object)를 만들어내기 위한 연관된 변수와 메서드의 집합을 말한다.

아래 예시를 참고하면,

 Monster라는 클래스 (hp가 100이고 alive 상태가 True)를 아래와 같이 생성하고,

class Monster():
    hp = 100
    alive = True

 이 클래스 안에 아래와 같이 함수를 구성했다.

 첫번째 damage함수는 몬스터가 현재 갖고 있는 hp값을 나타내고,

 두번째 status_check함수는 몬스터가 현재 살아있는지를 확인한다.

class Monster():
    hp = 100
    alive = True

    def damage(self, attack):
        self.hp = self.hp - attack
        if self.hp < 0:
            self.alive = False

    def status_check(self):
        if self.alive == True:
            print("몬스터가 살아있습니다.")
        else:
            print("몬스터가 죽었습니다.")

함수가 잘 사용되는지 아래와 같이 체크해볼 수 있다.

m1 = Monster()
m1.damage(150)
m1.status_check()

m2 = Monster()
m2.damage(90)
m2.status_check()

>>> 몬스터가 죽었습니다.
>>> 몬스터가 살아있습니다.

2. 객체(Object), 인스턴스(Instance)

 여기서 m1, m2는 인스턴스(클래스로 만든 객체)라고 부른다.

 인스턴스에 대한 잘 설명된 개념은 구글링을 통해 찾아볼 수 있다.(*링크1, 링크2)

 관계를 설명할 때 자주 등장하는 단어들인데, 아래의 개념 정도로 이해했다.

 - 클래스는 객체를 만들기 위한 '설계도' 또는 '틀'

 - 객체는 구현할 대상

 - 인스턴스는 클래스로 구현된 객체가 메모리에 할당되어 실체화된 경우

3. 매개변수 self

 클래스에서는 관례적으로 첫 번째 매개변수의 이름을 self로 사용한다.

 이는 객체를 호출할 때 호출한 객체 자신이 전달되기 때문이며, self말고 다른 이름도 사용 가능하다.

4. 생성자(Constructor) : __init__

 클래스의 객체에 초기값을 설정할 필요가 있을 때 사용한다.

 아래 사칙연산 클래스를 참고하면, setdata로 먼저 초기값을 받고 나머지 함수들을 사용할 수 있게 구성되어있다.

class FourCal:
    def setdata(self, first, second):
        self.first = first
        self.second = second

    def add(self):
        result = self.first + self.second
        return result

    def mul(self):
        result = self.first * self.second
        return result

    def sub(self):
        result = self.first - self.second
        return result

    def div(self):
        result = self.first / self.second
        return result

 이 경우 초기값을 지정하기 위해 아래와 같이 매번 setdata함수를 호출해야 한다.

a = FourCal()
a.setdata(4, 2)
print(a.add())

>>> 6

 하지만 초기값을 지정하지 않고 아래와 같이 호출하면 AttributeError가 발생한다.

## 오류 1
a = FourCal()
a.add()

AttributeError: 'FourCal' object has no attribute 'first'

## 오류 2
a = FourCal(4, 2)
a.add()
TypeError: FourCal() takes no arguments

 이를 방지하기 위해 생성자('__init__') 함수를 지정한다.

class FourCal:
    def __init__(self, first, second):
        self.first = first
        self.second = second

    def setdata(self, first, second):
        self.first = first
        self.second = second

    def add(self):
        result = self.first + self.second
        return result
        ...
        
a = FourCal(4, 2)
print(a.add())

>>> 6

  위와 같이 실행되면 __init__의 매개변수는 아래와 같이 대입된다.

5. 클래스의 상속(Inheritance)

 클래스는 아래와 같이 상속할 클래스 이름을 괄호안에 넣음을 통해서

 상속하는 클래스의 모든 기능을 가져와 사용할 수 있다.

class 클래스 이름(상속할 클래스 이름)

 상속은 기존 클래스는 그대로 둔 채 클래스의 기능을 확장하고 싶을 때 주로 사용한다.

 클래스 상속을 활용하면서, 일부 부모 클래스의 메서드를 변경하고자 할 때에는 오버라이딩이 가능하다.

 메서드 오버라이딩은 부모 클래스에  있는 메서드를 동일한 이름으로 다시 만듦으로써,

 메서드 호출시 부모클래스가 아닌 자식클래스의 메서드를 호출하게 된다.

6. 클래스 변수

 각 객체의 객체변수는 서로 영향을 주지 않는 성격을 갖고 있다.

 그러나 클래스 단위에서 변수를 만들면, 이는 동일한 클래스로 만든 모든 객체에 공유되는 성격이 있다.

 아래의 예시를 보면 lunch라는 클래스의 main이라는 변수는 '국'이다.

class lunch:
	main = "국"

print(lunch.main)
>> 국

 이 클래스를 활용해 a, b라는 객체들을 만들었다.

 당연하게도 아래를 실행하면 동일하게 '국' 이 출력된다.

a = lunch()
b = lunch()
print(a.main)
print(b.main)

>>> 국
>>> 국

 클래스 변수를 변경한다면 아래와 같이 출력이 된다.

lunch.main = '찜'

a = lunch()
b = lunch()
print(a.main)
print(b.main)

>>> 찜
>>> 찜

 

반응형

댓글