반응형

클래스 상속(Class Inheritance)

클래스는 상속을 통해 다른 클래스의 멤버 메서드 및 속성과 같은 특성을 상속할 수 있습니다.

다른 클래스를 상속하는 클래스를 자식 클래스라고 합니다. 반면에 다른 클래스에 의해 상속된 클래스를 부모 클래스라고 합니다.

자식은 여러 부모 클래스에서 상속할 수 있지만 부모 클래스는 여러 자식 클래스에서 상속될 수 있습니다.

 

Python에서 상속의 간단한 예를 살펴보겠습니다. 다음 스크립트에서 하나의 메서드 display_text() Parent 클래스를 정의합니다. 그리고 Parent 클래스를 상속하는 Child라는 자식 클래스를 선언합니다.

클래스에서 상속하려면 자식 클래스 이름 뒤에 오는 괄호 안에 부모 클래스 이름을 전달하기만 하면 됩니다.

 

여기서, pass 키워드는 코드가 구문상 필요는 하지만 프로그램이 아무 작업도 하지 않기를 원하는 경우 사용합니다.

클래스나 함수에서 pass키워드를 사용하는 경우 클래스가 내부 동작은 필요없고, 의미적으로 껍데기만 필요한 경우에 사용합니다. 아래 스크립트의 chile클래스는 내부에 속성이나 메서드가 하나도 없이 빈 껍데기의 클래스를 만들었습니다.

 

class Parent:

  def display_text(self):

    self.id = 10

    print("A function inside the parent class")

 

class Child(Parent):

  pass

 

child클래스의 객체를 만들고 부모 클래스 내의 메서드인 display_text()함수와 id를 호출한 결과입니다. 출력은 display_text() 메서드가 Child 클래스 내부에 정의되어 있지 않더라도 Child 클래스 객체에서 display_text() 메서드를 성공적으로 호출할 수 있음을 보여줍니다.

 

child = Child()

child.display_text()

print(child.id)

 

Output:

A function inside the parent class

10

 

클래스 상속 예제

자식 클래스와 부모 클래스 사이에는 is-a 관계가 있습니다. 상속의 기본 개념은 다양한 클래스 간에 공통되는 멤버 속성 및 메서드를 부모 클래스 내부에 그룹화할 수 있고 자식 클래스에 고유한 멤버 및 속성을 자식 클래스 내부에 구현할 수 있다는 것입니다.

 

다음 스크립트는 두 개의 속성 name area와 하나의 메소드 display_shape_attr()이 있는 Shape라는 클래스를 생성합니다.

class Shape:

  def set_shape_attr(selfnamearea):

    self.shape_name = name

    self.area = area

 

  def display_shape_attr(self):

    print("The shape name is ", self.shape_name)

    print("The shape area is "self.area)

 

 

Shape 클래스를 상속받는 두 개의 자식 클래스를 만들어 보겠습니다. 첫 번째 클래스는 원의 반지름(radius) 속성이 있고 반지름 값을 표시하는 메서드를 갖는 Circle클래스를 만들었습니다. Circle Shape 클래스 사이의 관계는 Circle is-a Shape인 것처럼 is-a입니다.

 

class Circle(Shape):

  def set_circle_attr(selfradius):

    self.radius = radius

 

  def display_circle_attr(self):

    print("The radius of the circle is ", self.radius)

 

Shape 클래스를 상속하는 Square라는 또 다른 클래스를 만들어 보겠습니다. Square 클래스에는 꼭지점 개수 속성과 이 꼭지점 값을 표시하는 메서드로 구성되어 있습니다.

 

class Square(Shape):

  def set_square_attr(selfvertices):

    self.vertices = vertices

 

  def display_square_attr(self):

    print("Total number of vertices in a square ", self.vertices)

 

Circle Square 클래스에는 모두 name area라는 두 가지 공통 속성이 있음을 알 수 있습니다. 공통 속성은 부모 클래스인 Shape 클래스에서 구현되었습니다. 반경 및 꼭짓점과 같은 특정 속성은 각각 Circle Square 클래스에서 구현됩니다.

다음 스크립트는 Circle 클래스의 객체를 생성하고 이름, 면적 및 반경 속성 값을 표시합니다.

circle = Circle()

 

# calling parent class methods

circle.set_shape_attr("Circle", 200)

circle.display_shape_attr()

 

# calling child class methods

circle.set_circle_attr(500)

circle.display_circle_attr()

 

Output:

The shape name is  Circle

The shape area is  200

The radius of the circle is  500

 

마찬가지로 다음 스크립트는 Square 클래스의 객체를 생성하고 이름, 면적 및 꼭지점 개수 속성의 값을 표시합니다.

square = Square()

 

# calling parent class methods

square.set_shape_attr("Square", 230)

square.display_shape_attr()

 

# calling child class methods

square.set_square_attr(4)

square.display_square_attr()

 

Output:

The shape name is  Square

The shape area is  230

Total number of vertices in a square  4

 

자식클래스를 통해 부모 클래스의 생성자 호출하기

부모 클래스와 자식 클래스 모두에서 생성자를 정의할 수 있습니다. 그런 다음 자식 클래스 생성자를 사용하여 부모 클래스 생성자를 초기화할 수 있습니다.

다음 스크립트는 Shape라는 상위 클래스를 정의합니다.

 

class Shape:

  def __init__(selfnamearea):

    self.shape_name = name

    self.area = area

 

  def display_shape_attr(self):

    print("The shape name is ", self.shape_name)

    print("The shape area is ", self.area)

 

다음 스크립트는 Shape 상위 클래스를 상속하는 Circle 하위 클래스를 정의합니다. Circle 클래스의 생성자를 보십시오. 이름, 면적 및 반경의 세 가지 매개변수를 사용하였습니다.

생성자 내에서 super() 키워드는 상위 클래스를 참조하는 데 사용됩니다.

상위 클래스 생성자는 super().__init__() 메서드를 사용하여 호출되고 circle클래스의 __init__()에서 입력받은 name area 매개변수의 값은 상위 클래스 생성자에 전달됩니다. 세 번째 매개변수는 자식 클래스 속성, 즉 반경을 초기화합니다.

class Circle(Shape):

  def __init__(selfnamearearadius):

    부모 클래스의 생성자를 호출

    super().__init__(name, area)

    self.radius = radius

 

  def display_circle_attr(self):

    print("The radius of the circle is ", self.radius)

 

이제 Circle 클래스의 개체를 만들 때 세 개의 매개변수 값을 전달합니다. 처음 두 매개변수 값은 부모 클래스 속성인 name area를 초기화하는 반면, 세 번째 매개변수는 자식 클래스 속성인 radius를 초기화합니다.

circle = Circle("Circle", 700, 400)

 

# calling parent class methods

circle.display_shape_attr()

 

# calling child class methods

circle.display_circle_attr()

 

Output:

The shape name is  Circle

The shape area is  700

The radius of the circle is  400

반응형

+ Recent posts