[Python] 파이썬 클래스(class) 사용법 & 예제 총정리

객체지향 언어들의 특징은 클래스를 사용할 수 있다는 것입니다. 클래스는 객체 지향 프로그래밍(Object-Oriented Programming, OOP)의 핵심 개념으로, 코드를 구조화, 모듈화 하여 유지보수성을 향상하고 코드 재사용을 촉진하는 등 다양한 장점들을 제공합니다. 아마 클래스를 사용함에 따라 얻는 장점은 익히 알고 계시겠지만 모르는 분들을 위해서 간략한 예시를 들어보겠습니다. 

 

  • 쿠키 틀 -> 클래스(class)
  • 쿠키 틀을 사용하여 만들어진 쿠키 -> 객체(object)

쿠키를 무한정 생성해야한다고 가정해 보겠습니다. 그럼 일일이 쿠키들을 만들어줘야 할까요? 수제 쿠키보다는 공장에서 찍어내는 쿠키가 훨씬 효율적이지 않을까요? 클래스를 사용하면 공장식으로 쿠키들을 찍어낼 수 있습니다. 쿠키 틀은 클래스이고 그 쿠키 틀로 구워낸 쿠키를 객체(object)라고 생각하시면 됩니다. 하나의 클래스로 무한정 객체를 복사할 수 있기 때문에 훨씬 효율적인 프로그래밍이 가능합니다. 

 

또한 자동차 공장을 예시로 들어보면 자동차에 필요한 여러 가지 부품들을 객체화시키고 이것을 한데 조합하는 과정을 자동차 생산 공정으로 생각하신다면 각 부품별 유지보수도 쉽고 자동차의 생산성도 높아지겠죠. 이렇게 객체지향 언어는 생산성 측면에서 장점이 있습니다. 즉 객체 지향 언어인 파이썬에서 클래스를 잘 사용하는 것은 객체 지향 프로그래밍의 기본입니다. 이번 포스팅에서는 파이썬에서 클래스를 사용하는 방법에 대해 알아보도록 하겠습니다. 

 


 

 파이썬 클래스(class) 사용법 

클래스 정의하기

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def f_print(self):
        print("My name is {0}".format(self.name))
        print("My age is {0}".format(self.age))

클래스는 class 키워드로 시작해서 클래스 이름과 콜론(:)으로 정의하는데 이 라인을 클래스 헤더라고 합니다. 참고로 파이썬 코드 스타일 가이드에서 클래스는 대문자로 시작하도록 권장하니 이를 따르도록 합시다.

 

__init__ 는 클래스 인스턴스 생성 시 초기화하며 실행되는 부분으로 객체를 생성할 때 자동으로 호출되며, 객체의 초기 상태를 설정합니다. 마지막으로 클래스 내부에는 속성 (멤버 변수)과 메서드 (멤버 함수)를 정의할 수 있습니다. 

 

위의 예제에서는 Person이라는 클래스를 선언하고 name과 age라는 속성을 정의하였고, name과 age의 값을 출력할 수 있는 f_print 메서드도 추가해 주었습니다.

 

참고로 파이썬에서는 클래스의 속성과 메서드에 대한 접근 제어자가 없어 항상 접근이 가능합니다. 하지만 관례적으로 ( _ 언더바) 로 시작하는 속성을 비공개 속성으로 취급합니다.

 

 

객체 생성하기

p1 = Person("홍길동", 30)
p2 = Person("이순신", 20)

클래스를 사용하기 위해 객체를 생성해야 합니다. 객체를 생성할 때 클래스명()을 호출하면 됩니다. 위에서 정의해둔 Person 클래스에 이름(name) 속성에는 "홍길동"이라는 값과 나이(age)에 30이라는 값을 부여하여 객체 p1을 생성하고 이순신, 20을 매개변수로 p2 객체를 생성하였습니다. 

 

 

속성에 접근하기

p2.name = "장영실"
p2.age = 40

print(p1.name)
print(p2.name)

결과 ↓

홍길동
장영실

 

클래스 Person은 name과 age를 속성으로 가지고 있습니다. 객체의 속성에 접근하려면 ( . 연산자)를 사용하며 객체명.속성명 이런 식으로 사용해 주시면 됩니다. 위의 예제에서는 p2의 속성값을 변경해 보고, p1과 p2 객체에 name 속성값을 출력해 보도록 하겠습니다.

 

 

메서드 호출하기

p1.f_print()
p2.f_print()

결과 ↓

My name is 홍길동
My age is 30
My name is 이순신
My age is 30

 

객체의 메서드를 호출도 ( . 연산자)를 사용하며 객체명.메서드명() 이렇게 사용해 주시면 됩니다. 위의 예제에서 p1과 p2의 print() 메서드를 실행시켜 보도록 하겠습니다.

 

 

클래스의 속성 삭제하기

class Person:
    def __init__(self, name):
        self.name = name
        print("객체가 생성 되었습니다.")
    
    def __del__(self):
        print("객체가 삭제 되었습니다.")

p1 = Person("홍길동")
del p1.name
del p1

결과 ↓

객체가 생성 되었습니다.
객체가 삭제 되었습니다.

 

__init__이 객체를 생성할 때 실행되는 영역이라면 __del__은 반대로 객체가 소멸될 때 실행되는 영역입니다. 그리고 객체와 객체의 속성은 del이라는 키워드로 삭제하실 수 있습니다. 위의 예제를 보시면 Person 클래스의 객체 p1을 생성하여 __init__이 실행되었고 객체 p1을 삭제하여 __del__의 영역이 실행된 것을 보실 수 있습니다.

 

 

클래스 속성과 인스턴스 속성 

class ExClass:
    class_variable = 0 # 클래스 변수

    def __init__(self, value):
        self.instance_variable = value # 인스턴스 변수

ex1 = ExClass(10) # 인스턴스 변수 초기화 : 10
ex2 = ExClass(10) # 인스턴스 변수 초기화 : 10

ExClass.class_variable = 20 # 클래스 변수 변경 (모든 객체가 변경된 값을 공유)
print(ex1.class_variable)  # 20
print(ex2.class_variable)  # 20

ex1.instance_variable = 30 # 인스턴스 변수 변경 (객체 하나만 값이 변경 됨)
print(ex1.instance_variable)  # 30
print(ex2.instance_variable)  # 10

결과 ↓

20
20
30
10

 

클래스 변수와 인스턴스 변수라는 범위가 다른 두 가지 다른 종류의 변수가 존재합니다. 클래스 변수의 경우 클래스 내부에 정의되며 변경할 때 해당 클래스로 생성한 객체들이 모두 영향을 받지만 인스턴스 변수의 경우에는 객체를 생성할 때 생성되며 변경을 해도 해당 객체 하나만 영향을 받습니다. 

 

 

※ 클래스 상속이 궁금하시다면 아래의 글을 참고해 주세요.

[Python] 파이썬 클래스 상속(extends) & 예제 총정리

 

[Python] 파이썬 클래스 상속(extends) & 예제 총정리

클래스의 주요 특징 중 하나는 바로 '상속'이 된다는 점입니다. 부모 클래스를 자식이 상속받으면 별도의 정의 없이 부모 클래스의 속성과 메서드를 자식 클래스에서 재사용할 수 있습니다. 이

coding-factory.tistory.com

 

댓글

Designed by JB FACTORY