CS🏅/파이썬 🖤

[Python] 간단한 class 정리 및 객체지향 프로그래밍

Dobby98 2022. 12. 26. 23:34

참고자료 : https://wikidocs.net/16071

 

41. class 정리 - 클래스 기본적인 사용

## 1. 클래스 개요 - 클래스는 객체의 구조와 행동을 정의합니다. - 객체의 클래스는 초기화를 통해 제어합니다. - 클래스는 복잡한 문제를 다루기 쉽도록 만듭니다. ##…

wikidocs.net

 

1. 객체지향 프로그래밍

  • C, C++, Java 그리고 Python은 대표적인 객체지향 프로그래밍 (Object-Oriented Programming, OOP) 언어이다
  • 여기서 '객체지향'을 이해할 필요가 있다. 쉽게 설명하자면 하나의 프로그램을 구성하기 위해서 다양한 객체를 이용해서 구성한다는 것이다.
  • 우리가 코딩을 하면서 마주치는 상황중에서 이전에 썼던 for문이나 구조가 뒤에서 다시한번 사용되는 경우를 만났봤을 것이다. 이럴때 객체지향적인 코딩을 하지않는다면 똑같은 구조를 다시한번 작성해야한다.
  • 하지만 우리가 사전에 이러한 구조가 다시 사용될것을 예측하고 함수화 했다면 이는 간단히 함수를 불러오기만 하면된다.
  • 즉, 변수와 함수를 통해서 객체지향 프로그램을 할 수 있는 것이다

2. Class

  • 그렇다면 class를 정리하는 글에 왜 객체지향 프로그래밍이 뜬금없이 언급되는지 궁금할 수 있다.
  • 바로 class가 OOP의 핵심이기 때문이다. class를 비유적으로 표현하자면 '설계도'와 같다
  • 즉, class로 같은 구조의 설계도를 만들어 놓고 거기에 instance(인스턴스)를 무엇을 넣는지에 따라서 같이 결과가 달라지는 것이다
  • 따라서 핵심은 다음과 같다 : 객체지향➡️ class = 설계도 = 결국 좋은 코딩을 하기위해서 class를 잘 활용할 줄 알아야 한다.
  • 또한 내가 핵심적으로 공부하고 있는 데이터, AI 분야의 대부분 기능들이 class로 구성되어있다. 즉, 이를 이해하기 위해서 class 개념을 정리하는 것이 신상에 좋을 것이다...

 

" 각설하고 코드를 보자 "

class CustomClass(object):
    def __init__(self, param):
        .......

class를선언하기 위해서는 class [사용할 클래스 이름]을 통해서 선언해주어야한다

여기서 class 네이밍의 특징이 있는데 일반적인 함수나 변수의 경우 서로다른 단어 사이에 '_'를 추가해주는 경우가 대부분이다 ex) A_list 

이러한 네이밍을 snakecase라고하는데 class에서 이름을 지정해줄때는 다른 방식인 CamelCase 방식을 사용한다.

이름부터 느껴 지듯이 낙타의 등 모양에서 따온 이름으로 서로 다른 단어가 시작하면 대문자를 사용한다 (사실 별로 안중요하다 - 일종의 약속이다)

 

이렇게 생선된 class를 py파일로 저장하면 다른 py 파일에서 import 해서 사용할 수도 있다.

우리가 쓰는 모듈이 이러한 방식으로 import 되어서 온다. 즉, 대표적인 numpy 같은 모듈도 안에는 다양한 class들로 구성되어 있다


class BaseClass(object):
    def __init__(self, name, num):
        self.name = name
        self.num = num

클래스를 선언하고 나서 __init__를 사용해서 객체 초기화를  해주어야한다

위 코드를 해석하자면 BaseClass의 object로 들어온 name, num을 클래스 안에서 변수로 지정해주는 것이다

여기서 self는 class 자기 자신이다

 

__init__와 같이 __는 특수한 예약함수나 변수 지정되어 있다. 파이썬에 내장된 약속같은 것이다

__init__는 초기화 __str__는 print(Class)를 하면 str에서 지정한 값이 나온다.

 

이를 좀더 자세히 할고 싶다면 아래 블로그를 참고하길 바란다

https://corikachu.github.io/articles/python/python-magic-method

 

파이썬 더블 언더스코어: Magic Method | Corikachu

파이썬에서 __를 달고있는 메소드들에 대해서 살펴봅시다.

corikachu.github.io

 

__init__에서 활용 가능한 기술은 '유효성 검증'이다

class Flight:

    def __init__(self, number):
        if not number[:2].isalpha():
            raise ValueError("첫 두글자가 알파벳이 아닙니다.")
        if not number[:2].isupper():
            raise ValueError("첫 두글자가 대문자가 아닙니다.")
        if not number[2:].isdigit():
            raise ValueError("세번째 글자 이상이 양의 숫자가 아닙니다.")
        self._number = number

    ...생략

위의 코드를 보면 __init__에서 number를 받았을 때 각 인덱싱 한 값이 알파벳이 아닐 경우 아래의 ValueError가 나오게 할 수 있다.

(ValueError가 뭐지 라는 말이 나올 수 있지만 당신은 이미 익숙한 것이다. 파이썬 실행후 우리의 코드가 오류가 났을 때 콘솔 창에 항상 나오던 그 멘트들, 그중 하나가 ValueError이니까...)

 

즉, 이러한 설정을 통해서 뒤에 유효성이 꼬이는 일을 사전에 방지할 수 있다.

 

 

3. Inheritance 상속

상속 : 무슨 재벌집 막내 아들 처럼 유산을 물려주는 느낌이 드는 단어이다 (사실 맞다)

부모 클래스로 부터 속성과 Method를 물려받은 자식 클래스를 생성하는 것이다.

사전 지식이 없는 당신이 이 문장을 한번에 이해했다면 당신은 천재이다.

 

이해가 안될때는 코드를 봐야한다

class Person(object): # 부모 클래스 Person 선언
    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender
        
    def about_me(self): # Method 선언
        print("저의 이름은 ", self.name, "이구요, 제 나이는 ", str(self.age), "살입니다.")

위와 같은 class를 선언해주었다고 가정하자

우리는 이러한 클래스를 '부모' 클래스로 사용할 것이다

부모 클래스인 object에는 name, age, gender가 들어가고 이를 한문장으로 소개하는 about_me 메소드가 있다

 

이를 활용해서 자녀에서 상속해보자. 재벌집들 처럼...

 

class Employee(Person): # 부모 클래스 Person으로 부터 상속
    def __init__(self, name, age, gender, salary, hire_date):
        super().__init__(name, age, gender) # 부모객체 사용
        
    def about_me(self): # 부모 클래스 함수 재정의
        super().about_me() # 부모 클래스 함수 사용

아들 클래스의 이름은 Employee이다 여기에 object로 Person인 부모 클래스를 넣어주자 (우리는 이를 상속이라고 한다)

그리고 아래를 보자 

__init__와 about_me 메소드에 super().가 붙은 메소드가 보일 것이다.

즉, 부모의 함수를 상속받을 때는 부모 클래스의 메소드 명에 super().를 붙여서 가져오는 것이다

마치 상속세를 내는 것과 같다.

 

이렇게 상속받은 메소드는 부모 메소드와 같은 결과를 만든다.

 

mro()함수를 사용하면 상속관계를 알 수 이다

>>> Employee.mro()
<class 'inheritance.Person'>

 

4. Visibility 가시성

상업적인 소스코드를 만들거나 또는 오류를 방지하기 위해서 클래서 안에 위치하는 모든 변수를 이용자에게 제공할 필요가 없는 경우가 있다 즉, class 안에 존재하는 변수에 대한 접근 권한을 부여함으로 조절하는 것이다.

 

이를 비공개 속성이라고 하는데 변수 앞에 _ (언더바)를 추가함으로 내부적으로만 사용하는 변수라고 선언하는 것이

class Flight:

    def __init__(self, number):
        if not number[:2].isalpha():
            raise ValueError("첫 두글자가 알파벳이 아닙니다.")
        if not number[:2].isupper():
            raise ValueError("첫 두글자가 대문자가 아닙니다.")
        if not number[2:].isdigit():
            raise ValueError("세번째 글자 이상이 양의 숫자가 아닙니다.")
        self.__number = number

    def number(self):
        return self.__number

number앞에 언더바가 추가된 것을 확인할 수있다.

>>> from airtravel import Flight
>>> f= Flight("AB001")
>>> f.number() 
'AB001'
>>> f.__number
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Flight' object has no attribute '__number'

결과를 확인 해보면 위와같이 외부에서 클래스 안의 변수를 못불러 온것을 알 수있다.

 

 

 

오늘은 간단하게 class와 객체지향에 대해서 알아보았다

아직 class에 대해서 설명할 내용이 많이 남아 있지만 

아직 이해못한거 반 + 많은 내용 반이라서 다음 글로 돌아오겠다

 

예고 : 다음글은 class의 decorate이다

'CS🏅 > 파이썬 🖤' 카테고리의 다른 글

[CS]CPU bound vs. I/O bound  (0) 2023.06.08
[Python] Typing 2편  (0) 2023.05.31
[Python] Typing 1편  (0) 2023.05.30
[Python] Iterator vs. Generator  (0) 2023.03.14
[Python] 파이썬 데코레이터  (0) 2022.12.27