[Verilog/SystemVerilog] 상속 | 다형성 | 상속과 다형성의 차이 | Inheritance |Polymorphism

2024. 5. 6. 18:09(System)Verilog 시스템 베릴로그

반응형

상속

 

상속은 객체 지향 프로그래밍(OOP)의 개념으로,

Class를 확장하여 새로운 Class를 만들고, 그 새로운 클래스 객체의 핸들에서 원래 부모 클래스의 모든 속성과 메서드에 액세스 할 수 있다. 이를 통해 코드의 중복을 피하고 모듈 간의 관계를 명확하게 표현할 수 있다.

 

1. 부모 클래스 (Base Class) / 상위 모듈 

- 상속을 제공하는 Class 또는 module을 말한다.

- 부모 클래스에서는 공통된 속성과 동작이 정의되어 있음.

 

2. 자식 클래스 (Derived Class) / 하위 모듈 

- 상속을 받아 부모 클래스의 속성과 동작을 확장하거나 수정하여 사용하는 Class 또는 module.

- 자식 클래스는 부모 클래스의 모든 속성과 동작을 상속받음.

 

상속은 부모 클래스로부터 속성과 메서드를 상속받아 자식 클래스에서 재사용하는 개념이다. 이것은 객체 간의 'is-a' 관계를 나타내며, 자식 클래스는 부모 클래스의 특성을 확장하고, 더 구체적인 형태로 표현할 수 있다. 예를 들어, "개는 동물이다"라는 관계에서 개는 동물 클래스의 속성과 메서드를 상속받는다.

 

 

다형성

 

다형성은 객체 지향 프로그래밍(OOP)에서 중요한 개념 중 하나로, 부모 클래스 유형의 변수를 사용하여 서브클래스 객체를 다룰 수 있는 것을 의미한다. 즉, 하위 클래스의 객체를 부모 클래스의 변수에 담을 수 있고, 이 변수를 통해 하위 클래스의 메서드를 호출할 수 있다.

 

다형성은 또한 부모 클래스의 메서드가 하위 클래스에서 다르게 정의될 수 있도록 하는 것이다.

이를 위해서는 부모 클래스에서 해당 메서드를 가상(virtual)으로 선언해야 한다. 그러면 하위 클래스에서 이 메서드를 재정의할 수 있어서 같은 이름의 메서드가 각 클래스마다 다른 동작을 수행할 수 있게 된다.

 

요약하자면, 다형성은 부모 클래스의 변수에 서브클래스 객체를 담을 수 있게 해주고, 부모 클래스의 메서드가 하위 클래스에서 다르게 정의될 수 있게 합니다. 이를 통해 코드의 유연성이 높아지고, 객체 지향 프로그래밍에서 코드를 더 잘 구성할 수 있습니다.

 

 

다형성은 한 가지 인터페이스나 메서드가 다양한 형태로 동작할 수 있는 것을 의미한다. 이는 객체 간의 'can-do' 관계를 내며, 같은 이름의 메서드가 다른 클래스에서 다른 동작을 수행할 수 있는 것이다. 예를 들어, 동일한 '소리를 만드는' 메서드가 동물 클래스와 자식 클래스인 개 클래스에서 다르게 작동할 수 있다. 개는 짖는 소리를 내지만, 다른 동물은 다른 소리를 낼 수 있다.

 

상속 - 다형성의 차이점

  • 기초
    - 상속 : 클래스 간의 계층 구조를 형성하고 부모 클래스의 특성을 자식 클래스가 상속받는 것 
    - 다형성 : 한 가지 인터페이스나 메서드가 여러 형태로 구현
  • 목적
    - 상속 : 코드의 재사용을 위해 사용되며 클래스 간의 계층 구조를 형성하고, 코드를 구조화.
    - 다형성 : 코드의 유연성을 높이기 위해 사용되며, 한 가지 인터페이스나 메서드가 다양한 방식으로 동작.
  • 구현
    - 상속 : 클래스 간의 상속 관계를 설정하여 부모 클래스의 멤버를 자식 클래스가 상속받음.
    - 다형성 : 같은 이름의 메서드나 인터페이스를 다양한 방식으로 구현하는 것.

 

요약하자면, 상속은 클래스 간의 계층 구조를 형성하여 코드의 재사용성을 높이고, 부모 클래스의 특성을 자식 클래스가 상속받는 것이고,

반면에 다형성같은 이름의 메서드나 인터페이스가 다양한 형태로 동작할 수 있는 것을 의미한다.

 

상속과 다형성은 서로 보완적인 개념으로, 객체 지향 프로그래밍에서 유연하고 구조화된 코드를 작성하는 데 중요한 역할을 한다.


상속의 예시

// 부모 모듈 정의
class Animal;
   function void makeSound();
      $display("Animal makes a sound");
   endfunction
endclass

// 자식 모듈 정의 (부모 class Animal 상속받음)
class Dog extends Animal;
   function void makeSound();
      $display("Dog barks");
   endfunction
endclass

// 테스트벤치에서 사용 예시
module testbench;
   Animal animal;
   Dog dog;

   initial begin
      animal = new();
      dog = new();
      
      animal.makeSound(); // "Animal makes a sound" 출력
      dog.makeSound();    // "Dog barks" 출력
   end
endmodule

 

 

다형성의 예시

// 부모 클래스 정의
class Animal; 
    virtual function void makeSound();  // 가상 메소드 makeSound
        $display("동물이 소리를 내고 있습니다.");
    endfunction
endclass

// 자식 클래스1
class Dog extends Animal;
    virtual function void makeSound();  // 부모 클래스의 makeSound 메소드 재정의
        $display("개가 멍멍 짖고 있습니다.");
    endfunction
endclass

// 자식 클래스2
class Cat extends Animal;
    virtual function void makeSound(); // 부모 클래스의 makeSound 메소드 재정의
        $display("고양이가 야옹야옹 울고 있습니다.");
    endfunction
endclass


module PolymorphismTest;
    initial begin
    	// Animal 클래스의 변수에 Dog, Cat 객체를 할당
        Animal animal1 = new Dog();
        Animal animal2 = new Cat();
        
        // 해당 변수를 통해 makeSound 메서드를 호출 
        animal1.makeSound(); // 개가 멍멍 짖고 있습니다.
        animal2.makeSound(); // 고양이가 야옹야옹 울고 있습니다.
    end
endmodule

 

반응형