2023년 6월 업데이트
안녕하세요. SQLER의 코난 김대우입니다.
이번 강좌에서는, Python 중급 강좌 - 3. 클래스(Class)를 진행토록 하겠습니다.
SQLER에서 진행되는 전체 Python / 머신러닝 강좌 목록
코드를 실행하기 위해서는, vscode에서 새로운 파일을 만들고 실행하시면 됩니다.
예를 들어, 3_class.py를 생성하고 코드를 실행합니다.
TL;DR
Python의 클래스는 재사용 가능한 구성요소를 생성하고 데이터와 기능을 모듈화 합니다. 이 챕터에서는 클래스를 사용하는 이유를 소개하고 Python 클래스의 생성자와 메서드를 포함한 클래스의 기본 구조를 예제를 통해 살펴봅니다.
Python 중급 강좌 - 3. 클래스(Class)
클래스는 데이터 구조와 동작을 정의합니다. 클래스를 사용하면 데이터와 기능(functionality)을 함께 그룹화할 수 있습니다.
Python은 유연한 언어이고, 많은 기능을 지원하며, 물론 객체지향 프로그래밍(Object Oriented Programming) 역시 지원합니다.
이 강좌에서는 클래스가 무엇이고 오브젝트가 무엇인지에 대해서는 깊이 다루지 않고, Python에서 어떻게 클래스를 사용가능한지에 대해 초점을 맞춰 진행합니다.
클래스를 사용하는 이유는
- 재사용 가능한 구성요소 생성
- 데이터와 작업을 그룹으로 사용
으로, 다른 언어와 같습니다.
그럼, 먼저 Python에서 클래스를 사용하는 예제를 살펴보겠습니다.
Python 클래스 예제
class Presenter(): def __init__(self, name): # 생성자(Constructor) self.name = name def say_hello(self): # 메서드(method) print('Hello, ' + self.name) presenter = Presenter('Chris') presenter.name = 'Christopher' presenter.say_hello()
그냥 봐도 쉬워 보이지요? self라는 키워드는 뭔가 이상해 보입니다. 그럼 상세히 살펴보도록 하겠습니다.
클래스 기본 구조
Python에서 클래스 이름은 PascalCasing으로 첫 대문자로 설정합니다.(snake_case도 권장합니다)
class Presenter():
☑️ 챗GPT 활용: python PascalCasing에 대해서 알려줘
☑️ 챗GPT 활용: python snake_case에 대해서 알려줘
생성자(Constructor)와 같은 클래스 내부용 멤버들은 "__"로 두 개의 언더스코어를 이용해 설정합니다.
sef __init__(self, name): # 생성자(Constructor) self.name = name
클래스의 메서드는 이렇게 첫 파라미터가 "self", 다음 파라미터부터는 사용자 정의 파라미터를 쓸 수 있습니다.
def __init__(self, name):
이렇게 Python에서는 self를 이용해 클래스의 속성(property 또는 field) 값을 적용합니다.
self.변수명 = 값
위 코드에서 보는, say_hello 메서드처럼, 모든 클래스 메서드는 self를 첫 번째 파라미터로 받아야 합니다.
def say_hello(self): # 메서드(method) print('Hello, ' + self.name)
클래스 개체(Object) 생성은 이렇게 class명과 파라미터를 이용합니다.
presenter = Presenter('Chris')
타 언어와 다르게 new 등의 키워드를 사용하지 않습니다.
클래스 메서드를 호출할 때에는, 개체에 메서드를 호출해 사용합니다.
presenter.say_hello()
"new"와 같은 키워드 사용하지 않고, self라는 특수 파라미터를 이용하는 것이 조금 특이하지만, 이렇게 Python에서 class를 생성하고 사용할 수 있습니다. 생성하는 구조 부분이 약간 다르지만, 내부 구조도 단순하고 사용하기 쉽다는 것을 알 수 있습니다.
Python의 class accessibility(접근제한자)
- 모두 public이며, private 등은 엄밀히 말하면 없습니다.
- class member 중에 "_"(언더스코어)의 의미는 사용을 권장하지 않는 일반적으로 protected 멤버를 의미하는 제안 규약(convention)입니다.
- "__"(더블 언더스코어)는 "외부에서 사용하지 말 것"을 가이드하는 멤버를 의미하는 일반적으로 private 제안 규약입니다.
위의 첫 예제에서는, "__init__" 생성자와 같은 경우입니다. 이외에도, __iter__ 등 여러 내부용 멤버를 이후 확인 가능합니다.
property 사용
Python에서도 getter/setter와 같은 메서드 형태로, 클래스 인스턴스의 속성값을 쉽게 가져오거나 지정할 수 기능을 제공합니다.
이때, @propery를 이용하면, 쉽게 구현할 수 있습니다.
class Presenter(): def __init__(self, name): # 생성자(Constructor) self.name = name @property def name(self): # setter print('Retrieving name...') return self.__name @name.setter # getter의 name과 같음 def name(self, value): # getter # 이곳에 검증 코드가 있다고 가정 print('Validating name...') self.__name = value presenter = Presenter('Chris') presenter.name = 'Christopher' print(presenter.name) === 실행결과 === Validating name... Validating name... Retrieving name... Christopher
Python의 속성은 property(또는 field) 스타일의 접근을 허용, 하지만 실제로는 위의 코드와 같이 메서드로 작동합니다.
이런 @ 데코레이터는 지난 강좌를 참고하세요. - 개발자 커뮤니티 SQLER.com - Python 초급 강좌 목차 - 18. 데코레이터(Decorators)
클래스 getter의 경우는
x = presenter.name
형태로 사용됩니다.
클래스 setter의 경우는
presenter.name = 'Christopher'
이런 형태로 사용됩니다.
그런데, 위의 결과와 같이 두 번 property가 실행된 것을 확인 가능합니다. 분명 한 번만 했는데? 왜 두 번 실행된 건지?
생성자를 보면, 생성자에서도 setter를 호출하고 있습니다. 이 생성자를 통해 한번 더 호출됩니다.
이렇게 Python에서 이렇게 property를 사용하면, 다른 모듈에서 이 클래스를 사용할 때 좀 더 구체적인 제어를 할 수 있도록 설정할 수 있습니다.
클래스와 모듈, 패키지
Python 클래스 강좌, 다른 언어에 비해서 무척 쉽지요?
지난 초급 강좌에서 배운 모듈 강좌 - 개발자 커뮤니티 SQLER.com - Python 초급 강좌 목차 - 15. 패키지(Package): import, pip와 잘 연계해 import 하면, 대규모의 클래스 코드도 조직적으로 잘 모듈화 시켜서 구성할 수 있습니다.
수고하셨습니다.
파이썬 강좌 책 구매
강좌가 도움이 되셨다면, 책으로 구매 가능합니다. 책 판매 수익금은 전액 코딩 교육 사회공헌 활동에 기부되며, 아래 링크에서 구매하시면 더 많은 금액이 기부됩니다.
책구매 링크: 챗GPT와 함께하는 파이썬 & 머신러닝 코딩 마스터
참고자료
개발자 커뮤니티 SQLER.com - Python 무료 강좌 - 기초, 중급, 머신러닝
개발자 커뮤니티 SQLER.com - Python 초급 강좌 목차 - 15. 패키지(Package): import, pip