파이썬_실전 프로젝트

거북이 클래스/객체(인스턴스) 생성

클래스와 객체(인스턴스)를 이용하면, 여러개의 거북이를 그릴수도 있고, 거북이에게 기본 명령어 외에 여러가지 명령어를 추가해줄수도 있습니다. 이를 이용해서 앞에서 만든 박스 함수를 거북이 클래스에다 합쳐 볼 생각입니다.

** 클래스와 인스턴스(구현체)가 정확한 표현입니다. 객체라는 단어를 인스턴스와 혼용해서 미리 말씀드립니다. 아래 내용에서 최대한 수정해놓겠습니다.

 

여러개의 거북이 객체(인스턴스) 생성

두마리의 거북이가 각각 다른 도형을 그립니다.   

import turtle

t1 = turtle.Turtle() # t1 이라는 거북이 인스턴스 생성
t2 = turtle.Turtle() # t2 라는 거북이 인스턴스 생성

t1.shape('turtle')
t1.color('red')
t1.fd(50)

t2.shape('turtle')
t2.color('blue')
t2.left(90)
t2.fd(70)

turtle.exitonclick() # 클릭시 창을 닫아주는 명령어

turtle 패키지내의 Turtle 이라는 기본 클래스를 이용하여, t1,t2 라는 이름의 거북이 인스턴스(구현체) 2개를 생성하고, 각각의 인스턴스에게 명령을 내린것입니다. 숫자를 더 늘려서 원하는 만큼 더 만들수도 있습니다. 하나의 클래스에서 생성된 쌍둥이 거북이들이 개별적으로 명령을 받고, 개별적으로 움직입니다.

 

새 클래스 정의

이제 앞서 만든 박스 함수를 거북이 명령어로 바꿔보죠. 상상하자면 이런식이죠.

t3.box(-50,-150,80,50,'blue')

이렇게 되면 t3라는 이름의 새로운 거북이는 자체 박스 명령어를 가지게 됩니다. 
원래는 별도의 함수였습니다. box(-50,-150,80,50,'blue')

 

먼저 Turtle_new 라는 새로운 클래스를 정의하고,

class Turtle_new():  # 클래스 정의
    pass

t3 = Turtle_new()   # 객체 생성 

t3.fd(50)           # 명령 실행

선 그리는 명령을 했지만, 빈 클래스이기 때문에 오류 메세지만 나옵니다.

 

선을 그리기 위해서는 일단 기존의 거북이 클래스를 상속받아야 합니다.

import turtle

class Turtle_new(turtle.Turtle): # 기존 클래스를 상속
    pass

t3 = Turtle_new()

t3.fd(50)

기존의 거북이 클래스를 새로운 클래스의 괄호 안으로 넣어줬습니다.
이제 t3 거북이 인스턴스는 기존의 명령어를 모두 수행할수 있습니다.

 

함수 추가

 이제 새 클래스에 박스 함수를 추가해주면 새 거북이 t3는 선도 그릴수 있고, 박스도 그릴수 있습니다.

import turtle

class Turtle_new(turtle.Turtle):
    def box(self, pos_x, pos_y, x, y, color):
        self.penup()
        self.goto(pos_x - x/2,pos_y - y/2)
        self.pendown()
        self.speed('fast')
        self.color(color)
        self.begin_fill()
        self.fd(x)
        self.left(90)
        self.fd(y)
        self.left(90)
        self.fd(x)
        self.left(90)
        self.fd(y)
        self.left(90)
        self.end_fill()

t3 = Turtle_new()

t3.fd(100)
t3.box(-50,-150,80,50,'blue')

turtle.exitonclick()

주의할점은 클래스 내부에 함수를 작성할때, 기존의 인스턴스이름이 들어가던 자리는 모두 self 로 바꿔줘야 하고, 함수 첫번째 인자로 self 를 넘겨줘야 합니다. 클래스는 인스턴스생성 이전의 상태이기 때문에, 인스턴스이름이 들어갈수가 없죠. 그래서 인스턴스이름 자리에 self라고 표시해줘야 합니다.

 

새로운 인스턴스 생성

새로 만든 클래스로 거북이 3개를 다시 만들었습니다.

t1 = Turtle_new()
t2 = Turtle_new()
t3 = Turtle_new()

 거북이 인스턴스 3개를 생성하고, 아래 명령을 실행하면

t1.shape('turtle')
t1.color('red')
t1.fd(50)
t1.box(100,0,50,50,'red')

t2.shape('turtle')
t2.color('blue')
t2.left(90)
t2.fd(70)
t2.box(0,100,50,50,'blue')

t3.shape('turtle')
t3.color('green')
t3.box(-50,0,80,50,'green')

 세 거북이 모두, 선도 그릴수 있고, 박스도 그릴수 있는 것을 볼수 있습니다.

이런식으로 기존의 클래스를 가져와서, 내가 필요한 기능만 추가해서 새로운 인스턴스를 만드는 것을 객체지향프로그래밍이라고 합니다. 이미 있는 기능은 만들 필요가 없고, 협업도 편리하기 때문에, 대규모의 소프트웨어를 만들때 개발기간을 줄일 수 있습니다. 사실 파이썬의 대부분의 기능은 객체로 설계된 것들입니다. 객체지향을 배우기도 전에 우리는 이미 객체프로그램을 쓰고 있는셈이죠.

객체지향 개념에 대한 자세한 설명은 이고잉님의 강의를 참조하세요. https://opentutorials.org/course/1750/9624

댓글

댓글 본문