OverRide
자식 객체가 부모 객체의 기능 2가 마음에 안들거나 변형할 때
자식객체에 부모객체의 기능2라는 method명와 같은 것을 새로 재정의하는 것을 OverRide라고 한다.
<Ruby> OverRide를 활용한 갇단한 계산기 예제
class Cal
attr_reader :value
attr_writer :value
attr_accessor :value
@@_history = []
#생성자, constructor
def initialize(v1, v2)
@v1 = v1 # @변수 => 인스턴스 변수 -> instance가 속해있는 모든 method에서 사용가능
@v2 = v2
end
def add()
result = @v1+@v2
@@_history.push("add : #{@v1} + #{@v2} = #{result}")
return result
end
def subtract()
result = @v1-@v2
@@_history.push("subtract : #{@v1} - #{@v2} = #{result}")
return result
end
def setV1(v)
if v.is_a?(Integer)
@v1 = v
end
end
def getV1()
return @v1
end
def Cal.history()
for item in @@_history
p item
end
end
def info()
return "Cal => v1 :#{@v1}, v2 : #{@v2}"
end
end
class CalMultiply < Cal
def multiply()
result = @v1*@v2
@@_history.push("multiply : #{@v1} * #{@v2} = #{result}")
return result
end
def info()
return "CalMultiply => #{super()}"
end
end
class CalDivide < CalMultiply
def divide()
result = @v1/@v2
@@_history.push("divide : #{@v1} / #{@v2} = #{result}")
return result
end
def info()
return "CalDivide => #{super()}"
end
end
c0 = Cal.new(30, 60)
p c0.info()
c1 = CalMultiply.new(10, 10 )
p c1.info()
c2 = CalDivide.new(20, 10)
p c2.info()
* #{변수명} 이 것은 출력할 문자열 "" 안에 같이 변수를 출력해주고 싶은 경우 사용하는 것
* super() 는 현재 super()가 소속되어있는 method와 똑같은 이름을 가진 부모객채의 method를 가르킴
<Cal (부모객체)>
def info()
return "Cal => v1 :#{@v1}, v2 : #{@v2}"
end
이미 Cal이라는 부모객체에 info()라는 method가 존재한다.
<Cal을 상속받은 CalMultiply 자식 객체>
def info()
return "CalMultiply => #{super()}"
end
하지만, CalMultiply 객체에서는 Cal(부모객체)의 info() method에서 기능을 변경하고 싶기 때문에 재정의(OverRide)를 한 것이다.
<CalMultiply 을 상속받은 CalDivide 자식 객체>
def info()
return "CalDivide => #{super()}"
end
CalDivide 객체에서는 CalMultiply(부모객체)의 info() method에서 기능을 변경하고 싶기 때문에 재정의(OverRide)를 한 것이다.
결과값
<Cal (부모객체)>
"Cal => v1 :30, v2 : 60"
<Cal을 상속받은 CalMultiply 자식 객체>
"CalMultiply => Cal => v1 :10, v2 : 10"
<CalMultiply 을 상속받은 CalDivide 자식 객체>
"CalDivide => CalMultiply => Cal => v1 :20, v2 : 10"
<Python> OverRide를 활용한 갇단한 계산기 예제
class Cal(object):
_history = []
def __init__(self, v1, v2):
if isinstance(v1, int):
self.v1 = v1
if isinstance(v2, int):
self.v2 = v2
def add(self):
result = self.v1+self.v2
Cal._history.append("add : %d + %d = %d" %(self.v1, self.v2, result))
return result
def subtract(self):
result = self.v1-self.v2
Cal._history.append("subtract : %d - %d = %d" %(self.v1, self.v2, result))
return result
def setV1(self, v):
if isinstance(v, int):
self.v1 = v
def getV1(self):
return self.v1
@classmethod
def history(cls):
for item in Cal._history:
print(item)
def info(self):
return "Cal => v1 : %d, v2 : %d" %(self.v1, self.v2)
class CalMultiply(Cal):
def multiply(self):
result = self.v1*self.v2
Cal._history.append("multiply : %d * %d = %d" %(self.v1, self.v2, result))
return result
def info(self):
return "CalMultiply => %s" %(super().info())
class CalDivide(CalMultiply):
def divide(self):
result = self.v1/self.v2
Cal._history.append("divide : %d / %d = %d" %(self.v1, self.v2, result))
return result
def info(self):
return "CalDivide => %s" %(super().info())
c0 = Cal(30, 60)
print(c0.info())
c1 = CalMultiply(10, 10)
print(c1.info())
c2 = CalDivide(10, 10)
print(c2.info())
* %d 는 문자열 "" 안에 바로 숫자를 넣고 싶은 경우 사용한다. "숫자 %d" %(4) 해주면 출력 값은 숫자 4
%s 는 문자열을 삽입하고 싶을 경우
* super().info() 에서 super()은 ruby와 다르게 부모 객체를 가르키는 것이고 . 뒤에 나오는 변수명 (info()) 가 부모 객체에서 재정의하고 싶은 변수명을 가르킨다. 따라서, 부모객체 Cal에서의 info()를 재정의 하겠다는 말이다.
<Cal (부모객체)>
def info(self):
return "Cal => v1 : %d, v2 : %d" %(self.v1, self.v2)
이미 Cal이라는 부모객체에 info()라는 method가 존재한다.
<Cal을 상속받은 CalMultiply 자식 객체>
def info(self):
return "CalMultiply => %s" %(super().info())
하지만, CalMultiply 객체에서는 Cal(부모객체)의 info() method에서 기능을 변경하고 싶기 때문에 재정의(OverRide)를 한 것이다.
<CalMultiply 을 상속받은 CalDivide 자식 객체>
def info(self):
return "CalDivide => %s" %(super().info())
CalDivide 객체에서는 CalMultiply(부모객체)의 info() method에서 기능을 변경하고 싶기 때문에 재정의(OverRide)를 한 것이다.
결과값
<Cal (부모객체)>
Cal => v1 : 30, v2 : 60
<Cal을 상속받은 CalMultiply 자식 객체>
CalMultiply => Cal => v1 : 10, v2 : 10
<CalMultiply 을 상속받은 CalDivide 자식 객체>
CalDivide => CalMultiply => Cal => v1 : 10, v2 : 10
참고자료 YOUTUBE - 생활코딩
'IT 공부 > python' 카테고리의 다른 글
2020-10-11 Python 과 Ruby 다중상속 (0) | 2020.10.11 |
---|---|
2020-10-11 Python 과 Ruby 객채의 모듈화 (0) | 2020.10.11 |
2020-10-09 Python 과 Ruby 클래스 맴버 / 클래스 변수 (2) (0) | 2020.10.09 |
2020-10-09 Python 과 Ruby 클래스 멤버 , 클래스 변수 (0) | 2020.10.09 |
2020-10-08 Python 과 Ruby 상속 (2) (0) | 2020.10.08 |