본문 바로가기
  • hazard_dev@__
  • hazard_dev@__
Python

파이썬_객체지향(class,module)[1]

by Hazard3_o00sung 2020. 2. 19.
728x90

본 포스트는 python을 중심으로 작성되었습니다.

 

파이썬_객체지향(class,module)

파이썬은 객체지향 언어 중 하나입니다. 클래스가 존재합니다. 그럼 클래스는 뭘까요? 우선 프로그래머가 정의한 데이터와 함수의 집합체라고 할 수 있습니다. 그리고 클래스에 선언된 요소들을 object라고 합니다. 

 

이렇게 설명하면 정말 딱딱하니까 쉽게 풀어서 설명하겠습니다.

 

예를 들어, 시장과 마트를 비교해보겠습니다. 주 목적은 생필품을 구매한다는것에서 같지만, 그 내부 기능은 확연한 차이가 납니다.

우선 시장은 흥정이 가능하며, 나이가 많은 사람들 위주로 방문 하고 합니다. 또한, 시장은 외에도 외부시설이라는 점이 차이가 있죠. 그렇기에 시장과 마트는 차이점으로 나누어진다는 것입니다. 우리가 가격을 흥정하고 싶고, 갇힌 공간 보다는 열린 공간에서 소통을 하며 물건을 구매하기엔 시장이 적합합니다. 이처럼 그 고유의 성질을 가진것을 우리는 클래스라고 부릅니다. 

 

그렇다면 시장과 마트를 대표하는 로고가 있다고 가정합니다. 이를 우리는 컴퓨터에서 인스턴스라 부릅니다.

 

1
2
3
4
5
6
class Father(object):
    def __init__(self,value):
    self.value = value
 
if __name__ == "__main__":
    f = Father()
cs

# 파이썬은 공백으로 블록을 구분합니다.

___name__변수 블록안에 선언된 f = Father() 을 클래스의 인스턴스라고 합니다. 

 

 

여기까지는 쉽게 이해할 수 있습니다. 좀 더 깊숙히 들어가겠습니다.

 

만약 인스턴스를 생성하는 과정 중에서 Father()이라고 호출하여 객체를 생성해 클래스를 사용한다고 가정합니다. 그렇다면 이때 Father()은 생성자 가 됩니다. 또한 생성자를 호출하면 그 과정 중 Father().__new__라는 함수가 호출되어 객체가 할당 되고 그다음 Father().__init__ 함수가 객체를 초기화 하여 사용하게 되는 것입니다.

 

그럼 클래스의 성질은 어떤 성질을 가질까요? 앞서 말씀드렸듯이 클래스에는 object(이하 객체)가 있습니다. 객체안에는 데이터도 있고, 함수도 존재하겠죠? 그게 그냥 클래스 성질입니다. 

 

 클래스의 특성

 

클래스의 특성은 아주 다양합니다. 그 중에서 대표적인 슈퍼클래스(super)에 대해서 알아봅니다. 슈퍼클래스는 (부모클래스입니다. 즉 시작점) 모든 속성을 상속하여 특수화라는 과정을 이룹니다. 모든 함수는 자식클래스에서 오버라이드 될 수 있다 라는 것입니다. 

 

상속의 예제를 보겠습니다

1
2
3
4
5
6
class Father(object):
    def __init__(self, value):
        self.value = value
 
class Son(Father):
    pass
cs

자식클래스에서 어떤 구현을 받지 않았지만, 내부적으론 부모클래스를 상속 받고 있고, 부모클래스의 메서드를 오버라이드해서 사용가능합니다. 그렇다면 바인딩은 어떻게 구현될지 알아보겠습니다.

 

동적함수 바인딩이는 함수가 자식클래스 내에서 오버라이드 될 수 있다라는 것입니다. 정리를 하면 자식 클래스에서 부모클래스 를 호출하게 되면 파이썬 환경에서의 메모리 할당은 자식클래스에 오버라이드된 함수를 사용한다라는 것이죠. 만약 부모클래스의 함수를 호출한다면, 파이썬 내장 함수인 super()함수를 사용하여 아주 쉽게 호출할 수 있습니다. 

 

그렇다면, SUPER()함수를 알아봅시다.

 

우선 이론적인 부분은 파이독스를 참조합니다. super()는 자식클래스에서 오버라이드된 함수를 엑세스할때 유용합니다. 

1
2
3
class C(B):
    def method(self, arg):
        super().method(arg) 
cs

 

super()함수의 일반적 선언 방식입니다. 해부를 해보자면, 클래스 c는 b를 상속받습니다. c안에서 정의된 함수는 b에서 상속받은 함수를 재정의 하여 참조를 하고 있습니다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Father(object):
    def __init__(self, value):
        self.value = value
 
class Son(Father):
    def __init__(self, value, name):
        super().__init__(value)
        self.name = name
 
if __name__ == "__main__":
    a = Son("hello""world")
 
 
 
 
cs

앞서 C클래스는 파이독스에서 말하는 기본적 사용 예제이며 아래코드를 보시면 이해를 하기 수월합니다. 

 

Son클래스에서는 Father클래스를 상속받고 있습니다. super()를 이용하여 자식클래스에서 재정의된 Father클래스의 함수를 엑세스 하고 있음을 알 수 있습니다. 그렇다면 Father클래스에서도 __main__진입점 아래서 선언된 hello가 value로 들어갔음을 예상할 수 있습니다.

 

파이썬에서 사용자 정의 클래스는 hashable이다!?

 

 

728x90

댓글