상속(Inheritance)는 부모가 물려주는 그 상속과 같은 의미이다.

 

상속은 클래스를 다루는 객체지향프로그래밍 언어의 특징이다.

 

예제를 한번 보자.

 

class A:

    def __init__(self):
        self.num1 = 0;
        self.str1 = "Python Class"

    def sayHello(self):
        print("Hello!")

class B(A):
    pass

b1 = B();
print(b1.num1)
print(b1.str1)
b1.sayHello()

결과값

클래스 B는 클래스 A에게서 상속받고 있다. B는 아무런 멤버변수와 메소드가 없음에도 인스턴스를 만들어서 A의 멤버변수와 메소드를 사용하고 있다. 자식클래스 A는 부모클래스 B에게서 모든 것을 물려받았다. 그래서 상속이다.

 

매번 새로 클래스를 만들필요없이 있는 클래스를 상속받아 약간의 수정과 추가를 해서 사용한다면 일이 수월해질 것이다.

 

메소드 오버라이딩

 

오버라이딩은 부모의 메소드를 그대로 사용하지 않고 변형하여 사용하는 것이다. 함수의 재정의 정도로 이해할 수 있다. 부모때의 방식은 버리고 자식의 시대에 맞는 새로운 방법을 고안하는 것이다. 부모의 동일 이름의 메소드는 가리워져 버리므로 호출시에도 새로 변경된 매개변수에 맞는 인수를 전달해야 오류가 안난다.

 

class A:

    def __init__(self):
        self.num1 = 0;
        self.str1 = "Python Class"

    def sayHello(self):
        print("Hello!")

class B(A):
    def sayHello(self,name):
        print("Hello! Mr and Mrs " + name)

b1 = B()
print(b1.num1)
print(b1.str1)
#b1.sayHello()
b1.sayHello("KIM")

메소드 오버라이드

자식의 메소드를 추가

당연히 자식만의 메소드를 추가할 수 있다. 컨스트럭터(생성자)도 바꿀 수 있다. 자식에서 바뀌면 다 부모의 생성자는 사용할 수 없으니 주의한다.

 

class A:

    def __init__(self):
        self.num1 = 0;
        self.str1 = "Python Class"

    def sayHello(self):
        print("Hello!")

class B(A):
    pass
    def sayHello(self,name):
        print("Hello! Mr and Mrs " + name)
    def add(self,a,b):
        return a+b

b1 = B()
print(b1.num1)
print(b1.str1)
b1.sayHello("KIM")
print(b1.add(2,5))

메소드 추가


* 아래의 코드와 같이 A를 상속한 B를 C가 다시 상속할 수 있다. 두번이나 계승되는 것이다. 이런 경우 B에서 오버라이드한 메소드들이 계승된다. A의 메소드가 아니라 B의 메소드가 상속된다. (바로 전의 상위클래스를 상속)

class C(B):
    def toString(self):
        print("C extends B!")


c1 = C()
c1.toString()
c1.sayHello("Lee")

두번째 상속

*클래스변수

클래스 변수는 클래스 자체가 가지는 변수이다. 인스턴스마다 각각의 독립된 메모리 공간을 점유하며 각각의 변수가 있는데 클래스 변수는 하나밖에 없다. 그리고 모든 인스턴스에 공유가 된다.

 

class TestClass:
    classname = "TestClass"


print(TestClass.classname)

TestClass.classname = "MainClass"

print(TestClass.classname)

a = TestClass();
b = TestClass();

print(a.classname)
print(b.classname)

a.classname = "SubClass" #안바뀐다

print(b.classname)

TestClass.classname = "SubClass"
print(b.classname)

print(id(TestClass.classname))
print(id(a.classname))
print(id(b.classname))

클래스 변수는 자바의 static 변수와 비슷하다. 인스턴스간의 공유가 가능하다. 단 값의 변경은 클래스이름으로 해야한다. 인스턴스가 조작할 수 없다. id 함수로 확인 해보면 다 같은 메모리 주소를 가리키고 있다. 주소가 같다는 것은 동일한 변수라는 것이다.

 

클래스 변수

 

공유하기

facebook twitter kakaoTalk kakaostory naver band