파이썬의 클래스에 대해서 알아보겠습니다. 한개의 계산기를 위한 함수는 아래와 같습니다.
result = 0
def add(num):
global result
result += num
return (result)
print(add(3))
print(add(4))
두개의 계산기는?
result1 = 0
result2 = 0
def add1(num):
global result1
result1 += num
return result1
def add2(num):
global result2
result2 += num
return result2
print(add1(3))
print(add1(4))
print(add2(3))
print(add2(7))
이렇게 표현할 수 있습니다.
그러나 계산기를 100개를 사용한다고 하면 이런식의 함수가 100개가 되어야 하므로 굉장히 비효율적입니다. 이런 비효율성을 해결하기 위해 클래스라는 것을 사용합니다.
클래스는 쿠키커터, 객체는 쿠키!
쿠키커터(클래스)로 쿠키(객체)를 생성합니다. 각각의 쿠키는 디테일이 다를 수 있지만 서로의 쿠키에게 영향을 주지 않습니다. 쿠키커터 하나로 쿠키를 무한대 생성 가능합니다. 쿠키의 디테일을 결정하는 것은 메서드의 역할입니다.
class Cookiecutter:
def starShape(dough):
..press function..
return star
def squareShape(dough):
..press function..
return square
def roundShape(dough):
..press function..
return round
def triangleShape(dough):
..press function..
return triangle
쿠키커터의 클래스를 만들었습니다. 각각의 메서드는 각자 다른 쿠키커터의 모양이 됩니다. 어떤 반죽을 사용하느냐에 따라, 어떤 쿠키커터를 사용하느냐에 따라 쿠키의 생김새와 특징이 달라집니다. 쿠키들을 호출해보겠습니다.
#호출
#쿠키 만들기 준비
a = Cookiecutter()
b = Cookiecutter()
#밀가루로 만든 별모양 쿠키
a.starShape(밀가루반죽)
#쌀가루로 만든 네모난 쿠키
b.squareShape(쌀가루반죽)
이렇게 클래스로 여러가지의 쿠키를 만들 수 있습니다. 여기서 a와 b는 객체입니다.
객체와 인스턴스
a = Cookie()
a라는 객체를 생성했습니다. 이 객체가 어느 클래스의 소속인가를 소개하고 싶을 때 '인스턴스'라는 단어를 사용합니다.
- a는 객체이다
- a는 Cookie의 인스턴스이다
이렇게 위의 코드를 두가지의 문장으로 표현할 수 있겠습니다.
생성자(Constructor)
다음 예제를 살펴보겠습니다.
class Calculator:
def __init__(self):
self.result = 0
def add(self, num):
self.result += num
return self.result
def sub(self, num):
self.result -= num
return self.result
def mult(self, num):
self.result = self.result * num
return self.result
def div(self, num):
self.result = self.result / num
return self.result
호출
a = Calculator()
print(a.add(12))
print(a.sub(2))
print(a.mult(2))
print(a.div(10))
생성자란 객체를 생성했을 때 자동으로 호출되는 메서드를 말합니다. 생성자는 __init__으로 정의합니다. 생성자는 주로 초깃값을 생성할 때나 매개변수와 내부 변수를 연결 할 때 사용합니다. 초깃값 생성 때 다른 함수명으로 정의할 수 있지만 __init__을 사용하면 파이썬이 이 메서드명을 생성자로 인식해 자동으로 호출해주기 때문에 __init__을 사용하는 것이 안전합니다.
위 코드의 메서드에 공통적인 특징이 있습니다. 바로 모두 self를 사용하는 것입니다. self는 파이썬에서만 볼수 있는 특징이며, 다른 언어는 가지고 있지 않습니다. self를 사용하는 이유는 이 함수의 객체가 해당 클래스의 인스턴스인지 확인하기 위함입니다. 그렇기 때문에 함수의 첫번째 인자를 꼭 self로 정의해야 인스턴스를 생성할 수 있습니다. Self는 객체 스스로를 매개변수로 호출하였다 하여 관례적으로 self라고 사용합니다. 그렇기에 다른 단어를 사용해도 무방합니다.
메서드를 호출한 객체 a를 오른쪽의 self라는 매개변수를 사용하여 대입하는 원리입니다. 그렇기 때문에 매개변수가 없어도 self는 꼭 정의 해주어야 합니다.
생성자 예제를 보겠습니다.
class studentInfo:
def __init__(self, name, language, coffee):
self.name = name
self.language = language
self.coffee = coffee
def print_info(self):
print("----------------------")
print("환영합니다,", self.name, "씨!")
print(self.language, "배우는 건 어때요?")
print(self.coffee, "한잔 하면서 힘내요!")
print("----------------------")
Lily = studentInfo("Lily", "파이썬", "라떼")
Lily.print_info()
Emily = studentInfo("Emily", "자바", "아메리카노")
Emily.print_info()
Billy = studentInfo("Billy", "C++", "카푸치노")
Billy.print_info()
위의 생성자를 보면 매개변수로 받은 name 인자를 self가 붙은 변수에 저장해주는 것을 확인할 수 있습니다. 즉, 외부의 매개변수와 내부 변수를 연결해주는 역할을 생성자가 수행하는 것입니다.
상속(Inheritance)
상속이란 클래스가 다른 클래스로부터 속성을 물려받아 사용할 수 있는 것입니다. 상속은 클래스명 옆의 괄호에 상속받고 싶은 클래스명을 대입함으로써 이루어집니다.
class Calculator:
def __init__(self):
self.result = 0
def add(self, num):
self.result += num
return self.result
def sub(self, num):
self.result -= num
return self.result
def mult(self, num):
self.result = self.result * num
return self.result
def div(self, num):
self.result = self.result / num
return self.result
class CalculatorExtend(Calculator):
def square(self, num):
self.result = self.result ** num
return self.result
위의 사칙연산을 기본으로 가지고 있는 계산기의 클래스를 생성했습니다. 사용자가 제곱이라는 기능을 추가하고 싶어 CalculatorExtend라는 함수를 만들고 Calculator의 클래스를 상속받았습니다. 상속 받을 클래스는 부모 클래스라 칭하며, 상속 받는 클래스는 자식 클래스라 칭합니다. 결과적으로, 자식클래스인 CalculatorExtend는 부모클래스의 메서드를 다 기입하지 않아도 상속만 받으면 부모클래스의 모든 메서드를 호출할 수 있습니다.
a = CalculatorExtend()
print(a.add(12))
print(a.sub(2))
print(a.mult(2))
print(a.div(10))
print(a.square(3))
이렇게 모든 기능을 호출 할 수 있게 됩니다. 나중에 라이브러리를 상속 받고 싶을때 이렇게 사용할 수 있습니다.
오버라이딩(Overriding)
부모클래스에 있는 속성을 자식클래스에서 상속을 받으나, 그 기능을 재정의 할 때 사용합니다. 결과적으로 메서드를 오버라이딩 하게 되면 부모클래스가 아닌 자식클래스에 있는 메서드를 호출하게 됩니다. 방법은 부모클래스를 상속받고 오버라이딩 하고싶은 메서드와 같은 이름을 사용하여 재정의하면 됩니다. 예제를 살펴보겠습니다.
class Calculator:
def __init__(self):
self.result = 0
def add(self, num):
self.result += num
return self.result
def sub(self, num):
self.result -= num
return self.result
def mult(self, num):
self.result = self.result * num
return self.result
def div(self, num):
self.result = self.result / num
return self.result
사칙연산을 메서드로 가진 계산기 클래스입니다. 나누기 메서드 div를 보면 나누기 기능이 있긴 하나 num에 0이 대입되게 되면 ZeroDivisionError가 뜨게 됩니다. 왜냐하면 숫자를 0으로 나눌 수 없기 때문입니다. 이 나누기 기능에 ZeroDivisionError가 뜨지 않게 메서드를 재정의 하려면 아래와 같은 방법으로 진행하면 됩니다.
class CalculatorExtend(Calculator):
def square(self, num):
self.result = self.result ** num
return self.result
#Override
def div(self, num):
if num == 0:
return 0
else:
self.result = self.result / num
return self.result
자식클래스에 부모클래스에 호출한 div와 같은 이름을 사용하는 것을 볼 수 있습니다. 즉, 오버라이딩을 할 때는 자식클래스에서 재정의 하고 싶은 부모클래스의 메서드 이름을 그대로 빌려와 정의 한 후 재정의 하면 되겠습니다.
클래스변수
클래스 변수란 다른 객체와 다르게 클래스 안에서 생성하는 변수입니다. 서로 다른 객체에 영향을 주거나 받지 않으며, 간단히 클래스 안의 글로벌 변수라고 생각하면 쉽습니다.
class Food:
food = "Bread"
a = Food()
b = Food()
print(a.food)
print(b.food)
print(id(a.food))
print(id(b.food))
모듈
모듈이란, 함수나 변수 혹은 클래스만을 모아놓은 파일입니다. 확장자가 .py로 끝난다면 모두 모듈입니다. 다른 파이썬 파일에서 사용할 수 있게끔 만들어놓은 파일입니다. 맨 위 import로 정의합니다.
'파이썬' 카테고리의 다른 글
파이썬 모듈 (0) | 2019.09.16 |
---|---|
코딩일기1: 파이썬 이미지 로드가 안될때 (1) | 2019.09.13 |
파이썬 메모리 영역 (1) | 2019.09.11 |
파이썬 기초 및 자료형2 (0) | 2019.09.11 |
파이썬 기초 및 자료형1 (0) | 2019.09.05 |