[Python] 객체지향 프로그래밍
객체란?
객체는 속성(attribute)과 동작(action)으로 구성되어 있다. 파이썬에서 객체의 속성은 객체 안의 변수에 저장되고, 객체의 동작은 객체 안에 정의된 함수, 즉 메소드로 구현된다. 객체의 변수와 메소드는 다음과 같이 객체 이름 다음에 점을 찍어서 호출할 수 있다.
객체의 변수 : object.spped
객체의 메소드 : object.drive()
객체 생성하기
#클래스 정의
class Car:
def drive(self):
print("자동차를 주행합니다.")
self.speed = 60
#객체 생성
myCar = Car()
#객체의 속성 설정
myCar.speed = 0
myCar.color = "blue"
#객체의 속성 출력
print("자동차 객체를 생성하였습니다.")
print("자동차의 속도는", myCar.speed)
print("자동차의 색상은", myCar.color)
#객체의 메소드 출력
myCar.drive()
print("자동차의 속도는", myCar.speed)
자동차 객체를 생성하였습니다.
자동차의 속도는 0
자동차의 색상은 blue
자동차를 주행합니다.
자동차의 속도는 60
매직 메소드
매직 메소드는 파이썬에서 사용되는 특별한 메소드들을 의미한다. 이들은 이미 파이썬 내에 정의되어 있고, 클래스 내부에서 매직 메소드들을 오버라이딩 하여 사용할 수 있다. 또한 직접 호출해서 사용하지 않고, 정해진 규칙에 따라 알아서 호출된다는 특징이 있다. 또 하나의 특징으로는 앞 뒤로 두개의 언더바가 붙어 있다는 점이다.
__init__()
생성자는 클래스 객체의 초기화를 담당하는 함수이다. 파이썬에서 생성자는 __init__()이다. 생성자의 목적은 객체가 생성될 때 객체가 필요한 초기화를 위함이다. Car 클래스에 __init__() 메소드를 추가해 보자.
class Car:
#생성자
def __init__(self, speed, color):
self.speed = speed
self.color = color
def drive(self):
print("자동차를 주행합니다.")
self.speed = 60
myCar = Car(0, "blue")
print("자동차 객체를 생성하였습니다.")
print("자동차의 속도는", myCar.speed)
print("자동차의 색상은", myCar.color)
myCar.drive()
print("자동차의 속도는", myCar.speed)
자동차 객체를 생성하였습니다.
자동차의 속도는 0
자동차의 색상은 blue
자동차를 주행합니다.
자동차의 속도는 60
__str__()
앞에서 작성한 myCar 객체를 print()로 출력해보면 다음과 같이 이상한 출력이 나온다.
>>> print(myCar)
<__main__.Car object at 0x0000021F4795E3B0>
객체를 출력했을 때 객체 안의 정보들을 출력하기 위해서는 __str__() 메소드를 클래스 안에 정의하면 된다. __str__() 메소드에서는 일반적으로 객체의 데이터를 문자열로 만들어서 반환한다.
class Car:
def __init__(selft, speed, color):
self.speed = speed
self.color = color
def __str__(self):
msg = "속도:" + str(self.speed) + " 색상:" + self.color
return msg
myCar = Car(0, "blue")
print(myCar)
속도:0 색상:blue
상속
파이썬에서 상속은 자식 클래스를 생성할 때, 자식 클래스(부모 클래스)로 생성해 주면 된다.
예를 들어 터틀 그래픽의 Turtle이라는 클래스를 상속받아서 MyTurtle 클래스를 작성해보자. 거북이를 클릭하면 거북이의 색상이 빨간색으로 변경되도록 MyTurtle 클래스에 이벤트 처리 함수를 추가한다.
from turtle import *
class MyTurtle(Turtle):
def glow(self,x,y):
self.fillcolor("red")
turtle = MyTurtle()
turtle.shape("turtle")
#거북이를 클릭하면 색상이 빨간색으로 변경
turtle.onclick(turtle.glow)
추상 클래스 생성하기
파이썬은 추상 클래스(abstract class)라는 기능을 제공한다. 추상 클래스는 메서드의 목록만 가진 클래스이며 상속받는 클래스에서 메서드 구현을 강제하기 위해 사용한다. 먼저 추상 클래스를 만들려면 import로 abc(abstract base class) 모듈을 가져와야 한다. 그리고 클래스의 ( ) 안에 metaclass=ABCMeta를 지정하고, 메서드를 만들 때 위에 @abstractmethod를 붙여서 추상 메서드로 지정한다.
from abc import *
class 추상클래스이름(metaclass=ABCMeta):
@abstractmethod
def 메서드이름(self):
코드
학생 추상 클래스 StudentBase를 만들고, 이 추상 클래스를 상속받아 학생 클래스 Student를 만들어 보자.
from abc import *
class StudentBase(metaclass=ABCMeta):
@abstractmethod
def study(self):
pass
@abstractmethod
def go_to_school(self):
pass
class Student(StudentBase):
def study(self):
print('공부하기')
def go_to_school(self):
print('학교가기')
james = Student()
james.study()
james.go_to_school()
공부하기
학교가기
추상 클래스인 StudentBase의 추상 메서드 study와 go_to_school은 추상 클래스를 상속받은 Student 클래스에서 구현이 되어야만 한다. 그렇지 않을 경우 에러가 발생한다. 또한 추상 메서드는 호출할 일이 없으므로 pass로 두어서 빈 메서드로 만든다.
출처
https://dojang.io/mod/page/view.php?id=2389