Python
Python 클래스, 객체
Bithub
2024. 3. 27. 16:26
728x90
객체 지향 프로그래밍(Object-oriented Programming)
* 클래스의 필요성
클래스는 객체 지향 프로그래밍의 핵심이 되는 부분이다.
우선, 클래스를 사용하지 않게 되면 어떠한 단점이 있는지 살펴보자.
- 중복 코드의 제거 → 함수로 해결 가능
- 데이터 간의 관련성 명시 → 컬렉션(리스트, 딕셔너리 등)으로 해결 가능
위 2가지 단점 모두 함수와 컬렉션으로 극복할 수 있다.
하지만 함수와 데이터 컬렉션 사이의 관련성을 명시하기 위해서는 클래스가 반드시 필요하다.
클래스는 데이터와 함수를 하나로 묶을 수 있도록 한다.
* 클래스와 객체
클래스는 붕어빵틀, 객체는 붕어빵이라고 생각하면 이해가 쉽다.
Python 클래스 선언 방법
class MyBlog:
count = 0 # 클래스 속성. 객체의 수를 나타내는 변수.
def welcome():
print("Welcome to my blog.")
pass
클래스는 2가지로 구성되어 있다.
- 변수(속성)
- 함수(메서드)
특별히 클래스 안의 함수를 ' 메서드'라고부른다.
* name = 속성
* welcome() = 메서드
객체생성
bithub = MyBlog()
객체 생성은 클래스 이름 () 형태로 진행된다.
여기서 사용된 소괄호는 함수 호출 연산자인데, 실제로 __init__(self) 함수가 호출된다.
메서드의 종류
메서드에는 크게 3가지 종류가 있다.
class MyBlog:
# 인스턴스 메서드
def instance_method(self):
pass
# 클래스 메서드
@classmethod
def class_method(cls):
pass
# 스태틱 메서드
@staticmethod
def static_method():
pass
- 인스턴스 메서드
- 객체가 사용하는 함수
- 첫번째 인자는 반드시 self로 설정.
- self는 해당 메서드를 호출한 객체를 의미.
- 클래스에서 호출 시 error
- 클래스 메서드
- 클래스가 사용하는 함수
- @classmethod 키워드를 통해 클래스 메서드임을 명시할 수 있다.
- 첫번째 인자는 반드시 cls로 설정.
- cls는 해당 메서드를 호출한 클래스를 의미.
- 따라서, 클래스 메서드 내부에서는 객체 정보에 접근 불가능.
- 객체에서도 호출 가능하지만 코드 가독성을 위해 클래스에서만 호출하기를 권장
- 객체에서 호출하더라도 cls 인자로 객체가 아니라 클래스가 들어간다!
- 스태틱 메서드
- 클래스와 객체 모두 사용하는 함수
- @staticmethod 키워드를 통해 스태틱 메서드임을 명시할 수 있다.
- 사용목적
- 이름 충돌 방지
- 관련 있는 함수들을 하나로 묶어 처리
- 유틸리티 클래스를 만들 때 주로 사용.
bithub = MyBlog()
# 인스턴스 메서드
bithub.instance_method() # MyBlog.instance_method(bithub)
# 클래스 메서드
MyBlog.class_method() # MyBlog.class_method(MyBlog)
# 스태틱 메서드
MyBlog.static_method() # MyBlog.static_method()
스페셜 메서드 또는 dunder 메서드
위 3가지 메서드 외에 스페셜 메서드(special method) 또는 dunder 메서드(double underline method)라는 것이 있다.
스페셜 메서드란, 특정 상황에서 자동으로 호출되는 특별한 메서드이다.
물론, 사용자의 직접 호출도 가능하지만 가급적 권장되지는 않는다.
class MyBlog:
count = 0 # 객체의 수
# 스페셜 메서드
def __init__(self, blogname, url, category):
print("__init__() called")
MyBlog.count += 1
self.blogname = blogname
self.url = url
self.category = category
예를 들어, __init__(self)은 객체 생성 시 자동으로 호출되는 함수다.
한줄요약 코드
class MyBlog:
count = 0 # 클래스 속성(객체의 수)
# 스페셜 메서드
def __init__(self, blogname, url, category):
print("__init__() called")
MyBlog.count += 1
self.blogname = blogname # 객체 속성(블로그 이름)
self.url = url # 객체 속성(블로그 URL)
self.category = category # 객체 속성(블로그 카테고리)
def im(self):
print("Welcome to my blog from Instance Method.")
print("객체 수 : ", MyBlog.count) # 인스턴스 메서드 안에서 클래스 속성과 클래스 메서드 사용가능.
@staticmethod
def sm():
print("Welcome to my blog from Static Method.")
@classmethod
def cm(cls):
print("Welcome to my blog from Class Method.")
bithub = MyBlog("bithub", "bithub.tistory.com", "IT")
thinnlong = MyBlog("thin and long", "blog.naver.com/habaksa33", "Economy")
print(MyBlog.count)
print(bithub.count)
print(thinnlong.count)
bithub.visitors = 30
print(bithub.blogname)
print(bithub.visitors)
print(thinnlong.visitors) # error
MyBlog.im() # error
bithub.im() # good
MyBlog.sm() # good
bithub.sm() # good
MyBlog.cm() # good
bithub.cm() # not recommended
추가적으로, 인스턴스 메서드 안에서도 클래스 변수와 클래스 메서드에 접근 및 호출이 가능하다.
변수 및 메서드 앞에 클래스 이름을 붙여줘야된다는 점을 잊지말자.
* 예시 : 위 코드에서 MyBlog.count