[Python] 파이썬 클래스(class) 사용법 & 예제 총정리
- Language/Python
- 2023. 10. 18.
객체지향 언어들의 특징은 클래스를 사용할 수 있다는 것입니다. 클래스는 객체 지향 프로그래밍(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) & 예제 총정리
'Language > Python' 카테고리의 다른 글
[Python] 파이썬 파일 입출력(파일 생성, 읽기, 쓰기, 이어쓰기) 총정리 (3) | 2023.11.12 |
---|---|
[Python] 파이썬 클래스 상속(extends) & 예제 총정리 (2) | 2023.10.22 |
[Python] 파이썬 람다(lamda) 사용법 & 예제 총정리 (2) | 2023.10.07 |
[Python] 파이썬 함수(function) 사용법 & 예제 총정리 (2) | 2023.10.04 |