IT/프로그래밍

[파이썬] 파이썬 클래스, 상속, 오버라이딩 [패스트 캠퍼스 챌린지 13일차]

뜻밖의 행복 2022. 2. 5. 16:17
반응형

 

 

안녕하세요?

 

도전 13일차 곧 2주차가 되는 군요 

오늘은 객체 지향 언어를 처음 배울때 

많이들 좌절하고 놀라는 클래스 심화 입니다. 

C언어에서는 포인터 개념일까요?

 

이해가 안된다면 반복하고 계속 해서 문제를 풀어서 그냥 외워서 하게 되다보면

자연스럽게 이해도 되는 경우도 있어서

 

자신에게 맞는 방법으로 숙달이 되어야 하겠습니다.

 

 

 

오늘 추가로 배운 클래스의 상속 그리고 오버라이딩도 결국은

반복, 중복을 싫어하는 우리 개발자 분들이 그것을 막기 위해 만든 개념입니다.

비슷한 기능을 묶어서 함수를 만든 것처럼 

비슷한 클래스가 어려개 만들어져야 하는 경우는 공통 된 부분을 부모 클래스로 만들어 두고

클래스의 속성과 매서드만 상속 받아서 코드도 깔끔하게 쓰고 

귀찮은 반복을 피하는 것입니다. 

그리고 상속 받은 내용중에서 해당 클래스에서는 다르게 사용해야 하는 부분만 새로 정의 하는 것을

오버라이딩 이라고 합니다.

class Monster:
		def __init__(self, name, health, attack):
				self.name = name
				self.health = health
				self.attack = attack
		def move(self):
				print("지상에서 이동하기")

class Wolf(Monster): #()괄호 안에 부모 클래스 이름을 써주면 됩니다.
		pass

class Shark(Monster):
		def move(self): # 그 중에서 재정의 하고 싶은 매서드만 이런식으로 다시 정의 하는 것이 오버라이딩
				print("바다에서 헤엄치기")

class Dragon(Monster):
		def move(self):
				print("하늘에서 날기")

늑대 = Wolf("외로운늑대", 1000, 200)
상어 = Shark("빠른상어", 5000, 3000)
용 = Dragon("용용이", 5000000, 200000)

늑대.move()
상어.move()
용.move()

이 것이 오늘 배운 예제입니다. 

보면 아래에 3개의 클래스가 있습니다. wolf, shark, dragon이 있는데 

 

		def __init__(self, name, health, attack):
				self.name = name
				self.health = health
				self.attack = attack
		def move(self):
				print("지상에서 이동하기")

 

이 부분이 공통적인 부분이라 계속 해서 반복하기 귀찮아서

Monster 라는 클래스를 만들어 두고 

 

class 클래스명(부모클래스명): 형식으로 상속을 받아서 편하게 사용하는 것입니다.

wolf의 경우 늑대니까 땅위에서 돌아다녀서 이동을 지상에서 하지만

 

아래 shark와 dragon의 경우 각각 바다에서 헤엄치고 하늘에서 날아다녀서 

print 문을 바꿀 필요가 있습니다 .

 

 

 
 
 

 

class Shark(Monster):
		def move(self): # 그 중에서 재정의 하고 싶은 매서드만 이런식으로 다시 정의 하는 것이 오버라이딩
				print("바다에서 헤엄치기")

class Dragon(Monster):
		def move(self):
				print("하늘에서 날기")

그래서 def move(self): 로 재정의 하여 각각 바다에서 헤엄치기, 하늘에서 날기로 수정합니다. 

이것이 오버라이딩 입니다. 

 

메서드 뿐만 아니라 생성자도 오버라이딩이 가능합니다. 

 

class Dragon(Monster):
        def __init__(self, name, health, attack, skill): # 드래곤 부분에만 skill 이라는 속성을 추가하고 싶습니다.
            super().__init__(name, health, attack)       # 지금은 상관없지만 매번 self.name, self.health를 치는 반복과 노가다를 싫어하는 개발자들
                self.skill = skill                       # 당연히 이 반복을 막기 위한 기능으로 super().__init__ 것을 만들어놔서 요 것으로 기존것은 반복해두면 됩니다.

 

네 드래곤 클래스에서만 skill 을 추가 하고 싶을 때 

생성자를 다시 쓸필요 없이 super().__init__(블라블라~) 로 하면 

자신이 상속 받은 부모 클래스의 생성자를 알아서 그대로 가져오기 때문에 

새로 추가한 skill만 self.skill = skill 형식으로 추가 하면 됩니다.

 

우선은 다른 사람이 만든 코딩을 보고 이해할 수 있는 수준까지는 올해 만들어 보자 인데 

과연 가능할지 열심히 계속 해봐야겠습니다.

 

근데 고등학교때 배웠던 외국어 느낌이랑 정말 비슷하네요 

그냥 다른 사람이 작성해둔 코드 보다가 모르는 건 찾아서 이해 하는 과정이

모르는 단어 찾는것 같은 느낌이라 

문법만 최대한 많이 기억해두면 되겠습니다.

 

 

반응형