IT 공부/python

2020-10-10 Python 과 Ruby 재정의 OverRide

JONGI-N CHOI 2020. 10. 10. 23:02

 

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 - 생활코딩

www.youtube.com/watch?v=CUvXIz8Y-4o&list=PLuHgQVnccGMA0lO0qip6Phh6UL73TS0es&index=98&ab_channel=%EC%83%9D%ED%99%9C%EC%BD%94%EB%94%A9