RoyalAzalea

Hello, this is my personal blog

Python Ruby Study _ 상속

06 Feb 2017 » python, ruby

python과 ruby의 상속(Inheritance)에 대해 보겠다. 상속을 사용하면 여러 장점이 있다. 기존에 있던 객체의 기능을 그대로 가지면서 새로운 기능을 추가할 수 있고, 코드의 중복을 제거할 수 있고, 상속시 부모클래스의 기능이 바뀌면 하위클래스의 기능도 바뀌므로 유지보수가 쉽다. 그리고 상속을 통해 연관된 객체들을 조직화하여 관리할 수 있다.

아래는 상속의 기본 예제이다. python의 경우 기존 object자리에 상속받을 클래스 명을 쓴다. ruby의 경우 <를 이용하여 어떤 클래스를 상속받는지 쓴다. 참고로 c2.method1이 실행되면 우선 class2에서 method1을 찾는다. method1이 있으면 바로 실행을 시키지만 없는 경우 부모인 class1에서 method1을 찾고 실행을 시켜준다.

python

# your code goes here
class Class1(object):
	def method1(self):
		return 'm1'

c1 = Class1()
print(c1, c1.method1())

class Class2(Class1):
	def method2(self):
		return 'm2'

c2 = Class2()
print(c2, c2.method1())
print(c2, c2.method2())

result

<__main__.Class1 object at 0x55ae8d6c> m1
<__main__.Class2 object at 0x55ae8dac> m1
<__main__.Class2 object at 0x55ae8dac> m2

ruby

# your code goes here
class Class1
	def method1()
		return 'm1'
	end
end

c1 = Class1.new()
p c1, c1.method1

class Class2 < Class1
	def method2()
		return 'm2'
	end
end

c2 = Class2.new()
p c2, c2.method1
p c2, c2.method2

result

#<Class1:0x93bd2ac>
"m1"
#<Class2:0x93bd194>
"m1"
#<Class2:0x93bd194>
"m2"

이전에 만든 Cal_Class를 상속받아 곱하기와 나누기 기능을 추가한 CalPlus_Class를 만드는 예제이다.

참고로 CalPlus_Class에는 생성자가 없어서 인스턴스 생성시 부모인 Cal_Class의 생성자를 사용함!!

python

# your code goes here
class Cal(object):
    def __init__(self, v1, v2):
        if isinstance(v1, int):
            self.v1 = v1
        if isinstance(v2, int):
            self.v2 = v2
    def add(self):
        return self.v1+self.v2
    def subtract(self):
        return self.v1-self.v2
    def setV1(self, v):
        if isinstance(v, int):
            self.v1 = v
    def getV1(self):
        return self.v1

class CalPlus(Cal):
	def multiply(self):
		return self.v1 * self.v2
	def divide(self):
		return self.v1 / self.v2

calculator = CalPlus(10,10)
print(calculator.add())
print(calculator.multiply())
print(calculator.divide())

result

20
100
1.0

ruby

# your code goes here
class Cal
  attr_reader :v1, :v2
  attr_writer :v1
  def initialize(v1,v2)
    @v1 = v1
    @v2 = v2
  end
  def add()
    return @v1+@v2
  end
  def subtract()
    return @v1-@v2
  end
  def setV1(v)
    if v.is_a?(Integer)
      @v1 = v
    end
  end
  def getV1()
    return @v1
  end
end

class CalPlus < Cal
	def multiply()
		return @v1 * @v2
	end
	def divide()
		return @v1 / @v2
	end
end

calculator = CalPlus.new(10,10)
p calculator.add
p calculator.multiply
p calculator.divide

result

20
100
1