클래스란?
클래스는 사전에 정의된 특별한 데이터와 메서드의 집합입니다. 클래스에 선언된 모양 그대로 생성된 실체를 객체(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()를 생성자라고 합니다.
호출되어서 동작 되는 과정을 보면 다음과 같습니다.
- 생성자 호출
- Orange.__new__()라는 특수 메서드 호출
- 객체 할당
- 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
'Python > Python 개념' 카테고리의 다른 글
파이썬 멀티 프로세스 (0) | 2020.12.11 |
---|---|
파이썬 디자인 패턴 - 1 (2) | 2020.12.09 |
파이썬 파일 처리하기 (0) | 2020.12.07 |
파이썬 반복과 이터레이터 (0) | 2020.09.22 |
파이썬 자료구조(심화)-2 (0) | 2020.09.17 |
댓글