본문 바로가기

Programming Language/Python

파이썬_기초단계 알아보기_ep.8 클래스가 복사가! 된다고!

320x100

 

네, 만들어진 클래스 변수와 함수를 이어받으면
클래스가 복사가 됩니다

[클래스 상속]

이번 단계에서는 객체와 클래스를 사용하는 이유,
클래스 상속에 대해서 알아보겠습니다

 

 

서론

 

올해의 크리스마스가 얼마 남지 않았습니다.
크리스마스 선물로 가장 받고싶었던 선물이 무엇이었나요?

인형, 스테이크, 장난감, 컴퓨터 등등...

필자의 어린시절에는 장난감 로봇이었습니다.

지난번 메서드에는 자전거도 나오고, 차도 나왔으니
움직이는 장난감 로봇을 등장시킬까 합니다.

로봇 이름과 로봇의 위치를 이용해서 이번엔 누구의
집으로 갈지, 행복한 산타가 되어보겠습니다.

 

객체와 클래스를 사용하는 이유

 

자, 지금 생각해보니 함수만 최대한 사용하고

객체와 클래스는 굳이 사용할 필요까진 없지 않을까?

하는 생각이 들기도 합니다.

 

근데 지금까지는 배웠죠? 그럼 왜 객체와 클래스를

굳 이 사용해야 할까요?

 

먼저, 코드관리가 편합니다.

큰 프로그램을 만들 때는 클래스와 객체를 꽤 많이 이용하는데

유사한 객체가 많은 프로그램을 만들때도 주로 클래스와 객체를

이용해 코드를 작성합니다.

 

한국을 돌아다니고 있는 작은 장난감 로봇이 하나 있다고

생각해봅시다. 초기위치는 0 입니다.

 

로봇의 속성 : 이름, 위치
로봇의 동작 : 한 칸 이동

 

자, 클래스와 객체를 사용하지 않을 경우입니다.

 

robot_name = 'R1'  # 로봇 이름
robot_pos = 0      # 로봇의 초기 위치

def robot_move():
    global robot_pos
    robot_pos = robot_pos +1
    print("{0} position: {1}".format(robot_name, robot_pos))

 

함수 사용

 

robot_move()
R1 position: 2

 

좋습니다.

이제 움직이는 로봇을 한 대 더 만들어보겠습니다.

위치는 10부터 시작합니다.

 

robot1_name = 'R1'  # 로봇 이름
robot1_pos = 0      # 로봇의 초기 위치

def robot1_move():
    global robot1_pos
    robot1_pos = robot1_pos+1
    print("{0} position: {1}".format(robot1_name, robot1_pos))
    
robot2_name = 'R2'
robot2_pos = 10

def robot2_move():
    global robot2_pos
    robot2_pos = robot2_pos+1
    print("{0} position: {1}".format(robot2_name, robot2_pos))

 

함수 사용 (2번)

 

robot1_move()
robot2_move()
R1 position: 1
R2 position: 11

 

마찬가지로 position 변수가 1이 늘어난 것을 볼 수있죠?

 

자, 로봇이 늘어날 수록 더 많은 변수와 함수가 필요하며 코드가 길어집니다.

로봇 별로 변수와 함수의 역할이 같으므로 클래스와 객체를 이용하면

편합니다.

 

class robot():
    def __init__(self, name, pos):
        self.name = name  # 로봇 객체의 이름
        self.pos = pos    # 로봇 객체의 위치
    def move(self):
        self.pos = self.pos+1
        print("{0} position: {1}".format(self.name, self.pos))
robot1 = robot('R1', 0)
robot2 = robot('R2', 10)

 

좋습니다. 메서드를 실행하겠습니다.

 

robot1.move()
robot2.move()
R1 position: 1
R2 position: 11

 

더 많은 객체를 생성하고, 메서드도 실행합니다.

소숫점도 가능합니다.

 

myRobot3 = Robot('R3', 30)
myRobot4 = Robot('R4', 40)
myRobot5 = Robot('R5', 0.1)


myRobot3.move()
myRobot4.move()
myRobot5.move()
R3 position: 31
R4 position: 41
R5 position: 1.1

 

어린 강아지들은 부모 강아지를 닮았을까요? 옆집 강아지를

닮았을까요? 물론 옆집 강아지가 부모 강아지는 아니라는 조건에서

말이죠. 

 

 

당연히 아기 강아지는 부모 개를 닮기 마련입니다.

래브라도의 특성은 아기 래브라도에게, 치와와의 특성은 아기 치와와에게,

쉐퍼드의 속성은 아기 쉐퍼드에게 넘겨주죠?

 

이처럼 만들어진 클래스 변수와 함수를 이어받고

새로운 내용을 추가해 클래스를 선언하는 것을 상속 이라고 합니다.

 

클래스 상속

 

두 가지로 분류할 수 있습니다.

 

부모 클래스(슈퍼 클래스, 상위 클래스)와 자식 클래스 (서브 클래스, 하위클래스)

 

구조

 

class 자식 클래스 이름(부모 클래스 이름):

	<코드 블록>

 

이번에도 자전거 클래스를 한번 가져와보겠습니다.

 

class Bicycle():
    
    def __init__(self, wheel_size, color):
        self.wheel_size = wheel_size
        self.color = color
        
    def move(self, speed):
        print("자전거 : 시속 {0}km로 전진".format(speed))
        
    def turn(self, direction):
        print("자전거 : {0}로 회전".format(direction))
        
    def stop(self):
        print("자전거({0},{1}): 정지".format(self.wheel_size, self.color))

 

변수를 넣어줍니다.

 

a = Bicycle(911, "red")

a.move(10)
a.turn("우")
a.stop()
자전거 : 시속 10km로 전진
자전거 : 우로 회전
자전거(911,red): 정지

 

자식 클래스를 생성해볼까요?

자, 구조는 부모클래스 이름.함수명() 또는 super().함수명()

을 사용합니다.

 

자전거의 다음 단계, 접는 자전거를 소개합니다!

 

class FoldingBicycle(Bicycle):
    
    def __init__(self, wheel_size, color, state):  #FoldingBicycle 초기화
        super().__init__(wheel_size, color) #super()도 사용 가능
        self.state = state # 자식 클래스에서 새로 추가한 변수
        
    def fold(self):
        self.state = 'folding'
        print('자전거: 접기, state = {0}'.format(self.state))
        
    def move(self, speed):
        print("자전거 :시속 {0}킬로미터로 후진".format(speed))  
        #오버라이딩 : 부모 클래스에서 함수를 정의해도, 자식 클래스에서 다시 정의하면 자식 클래스가 덮어씌어 짐
        
    def unfold(self):
        self.state = 'unfolding'
        print("자전거: 펴기, state = {0}".format(self.state))

 

몇 가지 속성은 부모 클래스인 Bicycle에서 물려받았습니다.

그리고 move는 전진이 아닌, 후진하는 속성을 덮어씌웠습니다.

이를 오버라이딩 이라 부릅니다.

 

자전거 :시속 20킬로미터로 후진
자전거: 접기, state = folding
자전거: 펴기, state = unfolding
자전거 : 19로 회전
자전거(10,black): 정지

 

다만 fold/ unfold가 추가됬습니다.

 

a = FoldingBicycle(10, "black", "unfolding") # 객체 생성

a.move(20) # ▶자식 클래스가 대체
a.fold() # 부모 클래스에서 진행
a.unfold()
a.turn(19)
a.stop()
자전거 :시속 20킬로미터로 후진
자전거: 접기, state = folding
자전거: 펴기, state = unfolding
자전거 : 19로 회전
자전거(10,black): 정지

 

이렇게 하여, 클래스와 객체 부분을 완료했습니다.
쉽지 않은 내용이지만, 실제 코드들을 본다면
머릿속으로 로직이 구성되는 것을 느낄 수 있게 됩니다.

 

 

다음은 파이썬 기초단계의 마지막 시간, 문자열과 데이터, 파일들을

다루는 것을 배워보겠습니다.

 

다음 단계 배우기 : https://astart.tistory.com/18

 

 

 

728x90