ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] 파이썬의 클래스 알아보기 (Class)
    Python/파이썬 기초 2023. 4. 26. 09:39
    반응형

    파이썬의 클래스 알아보기


    초보 프로그래머가 파이썬(Python)을 사용할 때, 클래스만큼 이해하기 어려운게 없습니다. 기초를 배우는 입장에서는 함수(function)마저도 어디에 쓸지 감이 잡히지 않는데, 클래스는 약간의 프로그래밍 노하우가 있는 사람들 사이에서도 사용하지 않는 경우가 있기 때문이지요. 그리고, 많은 강의나 교재에서는 클래스에 대한 설명이 너무 모호합니다.

     

     

    클래스의 정의


    그래서, 파이썬이 사용하는 클래스에 대해서 정확한 정의부터 짚고 넘어가도록 하지요. 파이썬 공식 홈페이지에서는 클래스를 아래와 같이 정의합니다.

     

    클래스는 사용자 정의 개체를 만들기 위한 템플릿입니다.

     

     

    이것만 보면 설명이 부족할 수 있으니, 구성요소를 포함해서 설명하자면 이렇습니다. 클래스는 속성(변수)과 행위(기능, 함수)을 정의해 놓은 집합입니다. 만약, 비슷한 속성을 가지고 있는 함수를 많이 만들어야 할 때, 클래스를 사용해서 손쉽게 그 속성을 부여할 수 있다는 말이죠. 비약하자면, 복사-붙여넣기를 하기 귀찮을 때 사용하는겁니다.

     

     

    파이썬의 클래스는 꼭 사용하지 않더라도 프로그램을 만드는데 큰 문제는 없습니다. 다만, 클래스를 잘 사용하면 할수록 코드가 간결하고 읽기 편해지는건 물론, 유지관리가 간편해진다는 장점이 생기지요.

     

     

    클래스의 구조


    파이썬의 클래스는, 아래와 같은 구조를 가지고 있습니다. 유심히 살펴보면, 함수와 거의 같은 느낌으로 사용할 수 있다는걸 알 수 있습니다.

     

     

    # 용례 1
    class MyClass:
        i = 12345
    
        def f(self):
            return 'hello world'
    
    print(MyClass.f(1))
    print(MyClass.i)
    hello world
    12345

     

     

    참고로, 파이썬에서는 함수 또는 클래스를 만들 때 권장하는 이름 짓기 방법이 있으니 참고해 두시기 바랍니다.

     

    • 함수 이름은 영어 소문자를 쓰되, 단어 구분은 언더바로 합니다. 예를 들어, my_function 처럼 말이죠.
    • 클래스 이름은 단어 구분을 영어 대문자로 하고, 이외에는 소문자를 씁니다. 예를 들어, MyClass 처럼 말이죠.

     

    다시 클래스 설명으로 돌아와서, MyClass의 구조를 살펴봅시다. MyClass 를 사용할 경우, MyClass 안에 있는 i 라는 변수(속성, attribute)를 사용할 수 있습니다. 함수는 지역변수(local variable)를 만들어도, 외부에서 이 값을 마음대로 이용할 수 없지만 클래스는 자유롭게 사용할 수 있습니다.

     

     

    그리고, 클래스 안에는 임의의 기능을 가진 함수(메소드, method)를 만들어 넣을 수 있는데요, 이 때 내부의 함수들은 클래스에 만들어둔 변수를 이용할 수 있습니다.

     

     

    클래스의 사용 예시


    클래스를 사용한 다른 예시를 한번 살펴보겠습니다. 3차원 좌표계 정보를 이용하는 클래스입니다. 임의의 좌표에서 시작해 x축으로 10, y축으로 5, z축으로 -8 만큼 이동하고, 이동 거리를 계산하는 과정입니다.

     

     

    # Make3D 클래스를 이용한 3차원 좌표 계산
    
    class Make3D:
        def __init__(self, x, y, z):
            self.x = x
            self.y = y
            self.z = z
    
        # 3차원에서 두 점 사이의 거리를 구하는 함수
        def calculation(self):
            import math
    
            return math.sqrt(
                (self.x2 - self.x)**2 +
                (self.y2 - self.y)**2 + 
                (self.z2 - self.z)**2
            )

     

    coordinate = Make3D(1, 9, 3)  # (1, 9, 3) 좌표로 Make3D를 초기화
    coordinate.x, coordinate.y, coordinate.z  # 초기 좌표
    (1, 9, 3)

     

     

    이 때, Make3D 라는 이름을 쓰다가 갑자기 coordinate 라는 이름을 사용하기 시작합니다. 이건 클래스의 초기화(initialization) 과정 때문입니다. 클래스를 여러개 사용하기 위해서는 임의의 값이 적히지 않은 원본이 있어야 합니다. 이 때, 원본은 Make3D 로 남겨놓고, (1, 9, 3) 좌표로 초기화한 Make3Dcoordinate 라는 이름으로 사용한다는 뜻이지요.

     

     

    # 좌표를 (10, 5, -8) 만큼 이동해 x2, y2, z2 변수로 저장
    coordinate.x2 = coordinate.x + 10
    coordinate.y2 = coordinate.y + 5
    coordinate.z2 = coordinate.z - 8
    
    coordinate.x2, coordinate.y2, coordinate.z2 # 이동한 좌표
    (11, 14, -5)

     

     

    이제 두 좌표 사이의 거리를 구하면 얼마나 이동했는지를 알 수 있습니다. 이 때, 3차원에서 두 점 사이의 거리를 구하는 공식은 아래 내용을 참고하면 됩니다.

     

    • 3차원에서 두 점 사이의 거리: $\sqrt {(x^2-x)+(y^2-y)+(z^2-z)}$
    • 파이썬에서 제곱근(루트) 구하기: math.sqrt()
    • 파이썬에서 x의 제곱(2승) 연산: x**2

     

    이걸 코드로 구현하면, Make3D.calculation() 메소드와 같이 표현할 수 있습니다. 그리고, 이걸 이용해서 계산하면 아래와 같은 결과를 확인할 수 있습니다.

     

     

    coordinate.calculation()
    13.74772708486752

     

     

    이렇게 클래스를 이용한 3차원 좌표계를 만들어 봤는데요, 함수와는 달리 클래스 내부의 변수에 접근하거나, 새로운 변수를 생성할 수 있습니다.

     

     

    클래스의 self 의미 알아보기


    그런데, Make3D.calculation 메소드를 사용할 때 별도의 값을 입력하지 않아도 알아서 계산이 되는것을 확인할 수 있습니다. 이는 self 라는 표현으로, 호출한 객체 자신의 정보를 사용했기 때문입니다. 클래스는 특성상 다양한 이름으로 초기화를 할 수 있는데, self 라는 표현을 사용할 경우, 그 이름과 관계없이 자기 자신에게 저장된 값을 호출할 수 있지요.

     

     

    예를 들어, Make3D 라는 클래스를 x, y, z, a, b, c... 등의 이름으로 초기화했을 때 이 모든 이름을 Make3D 메소드에 저장할 수 없습니다. self 라는 표현은 자기 자신이라는 의미로 모든 초기화된 객체 각각을 지칭할 수 있습니다.

    반응형

    댓글

문의: jwkang3929@naver.com