안녕하세요. 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 2023년 1월 - SQLER의 업데이트 강좌 리스트 코난(김대우) 2023.01.02 2096
Notice Python 무료 강좌 - 기초, 중급, 머신러닝(2021년 1월 업데이트) 코난(김대우) 2021.01.01 1200
116 오픈소스 소통을 위한 Git 공부하기 | ep4. 변경 단위를 만들기 위한 Commit | 애저 듣고보는 잡학지식 코난(김대우) 2022.10.31 23
115 오픈소스 소통을 위한 Git 공부하기 | ep3. 소스를 가져오기 위한 Clone | 애저 듣고보는 잡학지식 코난(김대우) 2022.10.30 24
114 오픈소스 소통을 위한 Git 공부하기 | ep2. Git를 소개합니다 | 애저 듣고보는 잡학지식 코난(김대우) 2022.10.28 33
113 오픈소스 소통을 위한 Git 공부하기 | ep1. 버전 관리의 중요성 | 애저 듣고보는 잡학지식 코난(김대우) 2022.10.27 32
112 오픈소스 소통을 위한 Git 공부하기 | ep0. 인트로 | 애저 듣고보는 잡학지식 코난(김대우) 2022.10.24 61
111 Azure VM - 오픈소스 ROS Gazebo Web 설치 및 실행 file 코난(김대우) 2022.10.19 64
110 parquet 파일의 meta 정보 추출 코난(김대우) 2021.11.16 913
109 embedded SQL - GlueSQL, rust 기반 오픈소스 프로젝트 file 코난(김대우) 2021.10.22 371
108 대규모 머신러닝 프로젝트 Serving에 사용되는 Python WAS, ASGI - uvicorn file 코난(김대우) 2021.10.06 732
107 Apache Arrow 리뷰 file 코난(김대우) 2021.10.05 1611
106 autopep8을 이용한 python 린트(linting) 구현 코난(김대우) 2021.09.15 477
105 Python에서 환경변수(environment variable) 처리 코난(김대우) 2021.09.15 187
104 Python에서 random 문자열이나 숫자 가져오는 방법 코난(김대우) 2021.09.15 679
103 Python 중급 강좌 - 9. 비동기 작업(Asynchronous operations): asyncio 코난(김대우) 2021.01.03 586
102 Python 중급 강좌 - 8. 외부 리소스 관리(Managing external resources): with 코난(김대우) 2021.01.03 294
101 Python 중급 강좌 - 7. 파일작업(File read/write) file 코난(김대우) 2021.01.03 1132
100 Python 중급 강좌 - 6. 파일시스템(File system) 관리 코난(김대우) 2021.01.03 426
99 Python 중급 강좌 - 5. 다중상속(Mixins - multiple inheritance) 코난(김대우) 2021.01.03 299
98 Python 중급 강좌 - 4. 상속(Inheritance) 코난(김대우) 2021.01.03 179
» Python 중급 강좌 - 3. 클래스(Class) 코난(김대우) 2021.01.03 230





XE Login