파이썬 & 오픈소스 개발 Tip과 강좌

이곳은 파이썬과 여러 오픈소스 기반 프레임워크 관련 Tip과 강좌 게시판 입니다. 관련 개발을 진행하면서 알아내신 Tip이나 강좌와 새로운 소식을 적어 주시면 다른 공부하는 분들에게 큰 도움이 됩니다. 감사합니다. SQLER.com은 개발자와 IT전문가의 지식 나눔을 실천하기 위해 노력하고 있습니다.

안녕하세요. SQLER의 코난 김대우입니다. 

이번 강좌에서는, Python 중급 강좌 - 3. 클래스(Class)를 진행토록 하겠습니다.

 

SQLER에서 진행되는 전체 Python / 머신러닝 강좌 목록

 

코드를 실행하기 위해서는, vscode에서 새로운 파일을 만들고 실행하시면 됩니다.

예를 들어, 3_class.py를 생성하고 코드를 실행합니다.

 

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으로 첫 대문자로 설정합니다.

class Presenter():

 

생성자(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의 perperty는 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 하면, 대규모의 클래스 코드도 조직적으로 잘 모듈화 시켜서 구성할 수 있습니다.

 

수고하셨습니다.

 


참고자료

개발자 커뮤니티 SQLER.com - Python 무료 강좌 - 기초, 중급, 머신러닝

c9-python-getting-started/more-python-for-beginners/03 - Classes at master · CloudBreadPaPa/c9-python-getting-started (github.com)

개발자 커뮤니티 SQLER.com - Python 초급 강좌 목차 - 15. 패키지(Package): import, pip

 

No. Subject Author Date Views
Notice Python 무료 강좌 - 기초, 중급, 머신러닝(2021년 1월 업데이트) 코난(김대우) 2021.01.01 51
103 Python 중급 강좌 - 9. 비동기 작업(Asynchronous operations): asyncio 코난(김대우) 2021.01.03 44
102 Python 중급 강좌 - 8. 외부 리소스 관리(Managing external resources): with 코난(김대우) 2021.01.03 24
101 Python 중급 강좌 - 7. 파일작업(File read/write) file 코난(김대우) 2021.01.03 28
100 Python 중급 강좌 - 6. 파일시스템(File system) 관리 코난(김대우) 2021.01.03 23
99 Python 중급 강좌 - 5. 다중상속(Mixins - multiple inheritance) 코난(김대우) 2021.01.03 27
98 Python 중급 강좌 - 4. 상속(Inheritance) 코난(김대우) 2021.01.03 9
» Python 중급 강좌 - 3. 클래스(Class) 코난(김대우) 2021.01.03 6
96 Python 중급 강좌 - 2. 람다(Lamda) file 코난(김대우) 2021.01.03 20
95 Python 중급 강좌 - 1. Python 스타일 가이드: 서식(Formatting)과 린팅(Linting) file 코난(김대우) 2021.01.02 22
94 Python 초급 강좌 목차 - 19. 코드에서 중요한 키(패드워드) 관리 - dotenv 코난(김대우) 2021.01.02 12
93 Python 초급 강좌 목차 - 18. 데코레이터(Decorators) 코난(김대우) 2021.01.02 7
92 Python 초급 강좌 목차 - 17. JSON 데이터 처리 file 코난(김대우) 2021.01.02 16
91 Python 초급 강좌 목차 - 16. 외부 웹서비스 API 호출 file 코난(김대우) 2021.01.02 13
90 Python 초급 강좌 목차 - 15. 패키지(Package): import, pip 코난(김대우) 2021.01.02 7
89 Python 초급 강좌 목차 - 14. 함수 파라미터(Parameter) 코난(김대우) 2021.01.02 8
88 Python 초급 강좌 목차 - 13. 함수(Function) 코난(김대우) 2021.01.02 8
87 Python 초급 강좌 목차 - 12. 반복문(Loop): for, while 코난(김대우) 2021.01.02 6
86 Python 초급 강좌 목차 - 11. 컬렉션(Collection): list, array, dictionary file 코난(김대우) 2021.01.02 8
85 Python 초급 강좌 목차 - 10. 조건문(Condition):3 복잡한 조건 처리 코난(김대우) 2021.01.01 6
84 Python 초급 강좌 목차 - 9. 조건문(Condition):2 다중 조건 처리 코난(김대우) 2021.01.01 4





XE Login