본문 바로가기

코딩/파이썬 기초

파이썬 튜토리얼 041. 클래스 정의 및 클래스 attributes

클래스 정의 및 클래스 attributes

위키백과는 "클래스 (컴퓨터 프로그래밍)"에 대하여 아래와 같이 정의한다.

 

클래스(class)는 객체 지향 프로그래밍(OOP)에서
특정 객체를 생성하기 위해 변수와 메소드를 정의하는 일종의 틀이다.
객체를 정의하기 위한 상태(멤버변수)와 메서드(함수)로 구성된다.

객체는 클래스로 규정된 인스턴스로서, 변수 대신 실제값을 가진다.

클래스는 OOP를 정의하는 개념 중 하나인데, 클래스에 대한 중요한 몇가지의 개념들은 다음과 같다.
클래스는 전부 혹은 일부를 그 클래스 특성으로부터 상속받는 서브클래스를 가질 수 있으며,
클래스는 각 서브클래스에 대해 수퍼클래스가 된다.
서브클래스는 자신만의 메소드와 변수를 정의할 수도 있다.
이러한 클래스와 그 서브클래스 간의 구조를 "클래스 계층(hierarchy)"이라 한다.

 

파이썬의 클래스도 위키백과에 설명되어 있는 내용과 크게 다르지 않다.

 

위키백과에서 설명하는 "특정 객체를 생성하기 위해 변수와 메서드를 정의하는 일종의 틀"인 클래스는 파이썬에서 아래와 같은 방식으로 정의된다.

 

class ClassName:
    statement 1
    statement 2
    ...

 

파이썬에선 class 키워드로 클래스 정의를 시작하며, 보통 클래스 이름은 ClassName과 같이 단어의 첫문자가 대문자인 캐멀 케이스(또는 Upper Camel Case 또는 Pascal Case)로 정의한다.

 

위키백과에서 설명하는 "특정 객체를 생성하기 위해 변수와 메서드를 정의하는 일종의 틀"에서 변수와 메서드는 파이썬에서 attributes(어트리뷰트)라고 통칭해 불리며, 변수는 데이터 어트리뷰트(data attribute)라 한다.

 

아래의 <코드 1>은 하나의 클래스를 정의하고 해당 클래스에 대한 인스턴스, 즉 객체를 생성하는 예를 보여준다.

 

<코드 1>

class MySum:
    def sum(self, x, y):
        print(f'{x} * 10 + {y} = {x * 10 + y}')

mysum = MySum()
mysum.sum(2, 3)

 

 

임의 클래스에 대한 인스턴스(=객체)의 데이터 어트리뷰트(=변수)는 다양한 방법으로 생성될 수 있다.

 

아래의 <코드 2>는 MyClass 클래스의 인스턴스 myclass를 생상할 때 myclass 인스턴스의 데이터 어트리뷰트 count를 생성하는 코드의 예이다.

 

<코드 2>

class MyClass:
    def __init__(self):
        self.count = 10

    def sum(self):
        total = 0
        for i in range(1, self.count + 1):
            total += i
        print('result =', total)

myclass = MyClass()
myclass.sum()

 

 

아래의 <코드 3>은 클래스의 인스턴스(객체)가 생성되고 난 후에도 인스턴스의 변수 생성이 가능함을 보여준다.

 

<코드 3>

class MyClass:
    pass

myclass = MyClass()
myclass.name = 'This is MyClass.'
print(myclass.name)

 

 

아래의 <코드 4>는 클래스의 인스턴스를 생성할 때 전달인자를 사용해 원하는 값으로 인스턴스 변수의 값을 설정할 수 있음을 보여준다.

 

<코드 4>

class MyDog:
    def __init__(self, name):
        self.name = name

    def dog_name(self):
        print('My dog is {0}.'.format(self.name))

mydog1 = MyDog('Happy')
mydog1.dog_name()

mydog2 = MyDog('Brave')
mydog2.dog_name()

 

 

아래의 <코드 5>는 클래스 수준으로 임의 변수를 선언하면 해당 클래스에 대한 모든 인스턴스는 클래스 수준으로 정의한 변수 참조가 가능함을 보여준다.

 

<코드 5>

class MyCount:
    count = 0

    def currnt_count(self):
        print('count =', MyCount.count)

mc1 = MyCount()
mc1.currnt_count()

MyCount.count += 1
mc1.currnt_count()

MyCount.count += 1

mc2 = MyCount()
mc2.currnt_count()

mc1.count = 100
mc1.currnt_count()

 

 

아래의 <코드 6>은 함수 내에서 임의 클래스를 정의하고 해당 클래스에 대한 인스턴스 생성이 가능함을 보여준다.

 

def my_function():
    class MyClassInMyFunction:
        def hello(self):
            print('Hello class')

    lc = MyClassInMyFunction()
    lc.hello()

if __name__ == '__main__':
    my_function()