본문 바로가기
Python/Python 개념

파이썬 클래스와 객체

by hyun-am 2020. 12. 9.

클래스란?

 

클래스는 사전에 정의된 특별한 데이터와 메서드의 집합입니다. 클래스에 선언된 모양 그대로 생성된 실체를 객체(object)라고 합니다. 객체가 소프트웨어에 실체화될 때(메모리에 할당되어 사용될 때), 이 실체를 인스턴스라고 합니다. 객체는 인스턴스를 포함할 수 있으며, 포괄적인 의미를 지닙니다.

 

파이썬은 다음과 같이 클래스를 생성할 수 있습니다.

class Calculator:
    def __init__(self):
        self.result = 0
    
    def add(self,num):
        self.result +=num
        return self.result
cal1 = Calculator()
print(cal1)

## 출력 값
# <__main__.Calculator object at 0x7fc0c97e8fd0>

다음과 같이 파이썬 클래스 인스턴스가 생성된 것을 확인할 수 있습니다.

여기서 객체와 인스턴스의 차이는 다음과 같습니다.

객체와 인스턴스

 

클래스로 만든 객체를 인스턴스라고 하는데 여기서 클래스와 인스턴스는 다음과 같습니다.

위에 cal1 = Calculator()는 cal1는 객체이고 cal1는 Calculator의 인스턴스다 라고 생각하면 되겠습니다.

 

클래스 인스턴스 생성하기

 

클래스 인스턴스 생성은 함수 표기법을 사용하여 초기 상태의 객체를 생성하는 일입니다. 인스턴스 생성 작업은 어떤 특징을 가진 빈 객체를 만드는 것입니다.

또한 여러 이름을 같은 객체에 바인딩 할 수 있습니다. 예를 들면 Orange라는 클래스가 있습니다. 이때 Orange()를 호출하여 객체를 생성했는데 이 때 Orange()를 생성자라고 합니다.

호출되어서 동작 되는 과정을 보면 다음과 같습니다.

  1. 생성자 호출
  1. Orange.__new__()라는 특수 메서드 호출
  1. 객체 할당
  1. Orange.__init__() 메서드가 객체를 초기화합니다.

 

속성

객체에는 데이터와 메서드로 이루어지는 클래스 속성이 있습니다. 메서드 속성은 함수인데, 그 첫 번째 인수는 호출된 인스턴스 자신입니다. 파이썬에서는 이것을 self라고 합니다.

속성들은 .뒤에 나오는 모든 이름입니다. 모듈 내 모든 이름의 참조는 속성 참조입니다.

형식은 다음과 같습니다.

모듈명.함수명

모듈명은 모듈 객체이고 함수명은 객체의 속성 중 하나 입니다.

 

네임스페이스(namespace)

네임스페이스는 이름을 객체로 매핑 하는 것입니다. 대부분 네임스페이스는 파이썬 딕셔너리로 구성되어 있습니다.

 

스코프(scope)

스코프는 네임스페이스에 직접 접근할 수 있는 파이썬 프로그램의 텍스트 영역입니다. 스코프는 정적으로 결정되지만, 동적으로 사용됩니다.

 

객체지향 프로그래밍

 

특수화

특수화란 슈퍼클래스(super class),부모클래스(parent class)의 모든 속성을 상속하여 새 클래스를 만드는 절차입니다. 모든 메서드 들은 서브 클래스에서 재정의(오버라이드)될 수 있습니다. 파이썬에서 모든 메서드는 가상 메서드입니다. 여기서 가상 메소드란 클래스 내에서 같은 시그니처의 함수로 오버라이딩 될 수 있는 함수 또는 메소드 라는 뜻을 가지고 있습니다. <참고:https://ko.wikipedia.org/wiki/가상_함수>

상속의 예시 코드는 다음과 같습니다. 또한 파이썬 스타일 가이드에서 한 클래스가 다른 클래스를 상속 받지 않으면, 파이썬의 최상위 클래스인 object를 명시적으로 표시하는 것을 권장합니다.

 

class ParentClass(object):
    pass

class ChildClass(ParentClass):
    pass

 

다형성

다형성이란 다른말로 동적 메서드 바인딩이라고도 하는데 메서드가 서브 클래스 내에서 재정의 될 수 있다는 원리 입니다. 즉, 서브 클래스 객체에서 슈퍼클래스와 동명의 메서드를 호출하면은 파이썬의 서브클래스에 정의된 메서드를 사용한다는 뜻입니다. 만약 슈퍼클래스의 메서드를 호출해야 한다면, 내장된 super()메서드를 사용하여 쉽게 호출할 수 있습니다.

 

오버라이딩과 다형성을 활용한 코드는 다음과 같습니다.

class Symbol(object):
    def __init__(self, value):
        self.value = value

    def __eq__(self, other):
        if isinstance(self, other.__class__):
            return self.value == other.value
        else:
            return NotImplemented

    def __hash__(self):
        return hash(self.value)


if __name__ == "__main__":
    x = Symbol("Py")
    y = Symbol("Py")

    symbols = set()
    symbols.add(x)
    symbols.add(y)

    print(x is y)
    print(x == y)
    print(len(symbols))

# 출력 값
# False
# True
# 1

 

합성과 집합화

합성과 집합화는 한 클래스에서 다른 클래스의 인스턴스 변수를 포함하는 것을 말하며, 클래스 간의 관계를 나타냅니다.

파이썬의 모든 클래스는 상속을 사용하고, 대부분의 클래스는 다양한 타입의 인스턴스 변수를 가지며, 합성과 집합화를 사용합니다.

<합성과 집합>

  • 합성은 A와 B가 강한 연관관계를 가지고 있습니다. 그리고 강한 생명 주기를 가지고 있는데 다시 말하자면, 예를들면 스마트폰-충전기, 집-방, 마트-계산대와 같은 관계를 뜻합니다.
  • 집합은 A와 B가 연관관계가 있지만 약한 생명주기를 가지고 있습니다. 즉 이말은 독립적으로 존재한다는 뜻을 가지고 있습니다. 예를 들면, (국어,영어,수학,사회,과학,체육), (한식,중식,일식,양식) 이런 관계들을 뜻합니다.

 

클래스 예제

  • 점클래스(Super Class)
  • 원클래스(Sub Class)

 

구현 코드

 

<클래스 선언하기>

 

circle_class.py

import math


class Point(object):
    def __init__(self, x=0, y=0):
        self.x = x  # 데이터 속성
        self.y = y

    def distance_from_origin(self):
        return math.hypot(self.x, self.y)

    def __eq__(self, other):
        return self.x == other.x and self.y == other.y

    def __repr__(self):
        return "point({0.x!r},{0.y!r})".format(self)

    def __str__(self):
        return "({0.x!r},{0.y!r})".format(self)


class Circle(Point):
    def __init__(self, radius, x=0, y=0):
        super().__init__(x, y)  # 생성 및 초기화
        self.radius = radius

    def edge_distance_from_origin(self):
        return abs(self.distance_from_origin()-self.radius)

    def area(self):
        return math.pi*(self.radius**2)

    def circumference(self):
        return 2*math.pi*self.radius

    def __eq__(self, other):
        return self.radius == other.radius and super().__eq__(other)

    def __repr__(self):
        return "circle ({0.radius!r},{0.x!r})".format(self)

 

<클래스를 import해서 출력하기>

import circle_class as shape

a = shape.Point(5, 12)
# a 값 출력 하기
print(a)
# repr a 출력하기
print(repr(a))
# str로 출력하기
print(str(a))
# 중심으로 부터 거리 구하기
print(a.distance_from_origin())

circle = shape.Circle(5, 3, 3)
# 원 출력
print(circle)
# repr circle 출력하기
print(repr(circle))
# circle 넓이 구하기
print(circle.area())
# circle 둘레 구하기
print(circle.circumference())

### 출력값
# (5,12)
# point(5,12)
# (5,12)
# 13.0
# (3,3)
# circle (5,3)
# 78.53981633974483
# 31.41592653589793

 

 

 

참고 서적

 

파이썬 자료구조와 알고리즘 : https://books.google.co.kr/books/about/파이썬_자료구조와_알고리즘.html?id=L12nDwAAQBAJ&printsec=frontcover&source=kp_read_button&redir_esc=y#v=onepage&q&f=false

점프 투 파이썬 : https://wikidocs.net/book/1

 

 

가상 함수 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 객체 지향 프로그래밍에서, 가상 함수(virtual function 또는 virtual method)는 상속하는 클래스 내에서 같은 시그니처의 함수로 오버라이딩 될 수 있는 함수 또는 메

ko.wikipedia.org

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

 

파이썬 자료구조와 알고리즘

저자_ 미아 스타인 서프라인(Surfline)의 시니어 소프트웨어 보안 엔지니어. 이전에는 엣시, 애플, 옐프 등에서 근무했다. 고교 시절부터 리눅스로 해킹과 코딩을 즐겼고 2014년 리커스 센터(Recurse Ce

books.google.co.kr

 

'Python > Python 개념' 카테고리의 다른 글

파이썬 멀티 프로세스  (0) 2020.12.11
파이썬 디자인 패턴 - 1  (2) 2020.12.09
파이썬 파일 처리하기  (0) 2020.12.07
파이썬 반복과 이터레이터  (0) 2020.09.22
파이썬 자료구조(심화)-2  (0) 2020.09.17

댓글