상세 컨텐츠

본문 제목

솔리디티 강좌 11강 상속 - overriding 오버라이딩

솔리디티 깨부수기 - 기본

by D_One 2021. 9. 6. 22:28

본문

 

 

안녕하세요

지난번 시간때는 상속 정의하는 법을 배웠습니다.

상속함에 따라서, 상속받은 함수를 다르게 변경할 수 도 있잖아요.

 

그럴경우, 저희는 오버라이딩이라고 합니다.

즉 상속받은 함수를 덮어 씌기라고 생각하시면 편해요.

 

예를 들어서, 

 

// SPDX-License-Identifier:GPL-30
pragma solidity >= 0.7.0 < 0.9.0;

contract Father{
    string public familyName = "Kim";
    string public givenName = "Jung";
    uint256 public money = 100; 
    
    constructor(string memory _givenName) public {
        givenName = _givenName;
    }
    
    
    function getFamilyName() view public  returns(string memory){
        return familyName;
    } 
    
    function getGivenName() view public  returns(string memory){
        return givenName;
    } 
    
    function getMoney() view public returns(uint256){
        return money;
    }
    

}

contract Son is Father("James"){
    
}

지난번 강의 코드입니다.

 

저희는 getMoney 부분을 오버라이딩 해보겠습니다.

아들 컨트랙이 아버지 컨트랙에게 돈 100 만원을 상속받는다고 가정하였을때, 아들이 그 100만원을 저금하고,  아들이 일을하면 월급을 또 저금 함으로써 아들돈이 증가 할 수 있잖아요.

 

저희는 그 부분을 getMoney 부분을 오버라이딩 통해서 구현 해보겠습니다.

 

먼저 오버라이딩을 하기 위해서는, 오버라이딩할 함수에 virtual 을 명시해주어야합니다.

 

    function getMoney() view  public virtual returns(uint256){
        return money;
    }

위와 같이 아버지 컨트랙에 virtual 을 써줌으로써, 자식 컨트랙에서 오버라이딩을 할 것이다 라고 알려줘야합니다.

 

그러고 나서 Son 컨트랙에 들어가서,

 

contract Son is Father("James"){
    
    uint256 public earning = 0;
    function work() public {
        earning += 100;
    }
    
     function getMoney() view  public override returns(uint256){
        return money+earning;
    }

}

이런식으로 써줄수 있습니다.

 

일단! 

getMoney만 중심으로 볼게요.

getMoney를 보면 override 를 볼 수 가있을거예요.

이 override를 명시함으로써 저희는 인제 getMoeny 의 함수를 오버라이딩 할 수 있게 된거예요.

즉, getMoney 안의 내용들을 저희 맘대로 바꿀수 있다는 것입니다.

 

안의 내용을 보면 기존의 getMoeny와 다른걸 알 수 있어요. 

기존에는 return money 였지만, 저희는 Son 컨트랙에서 return money+earning; 변경해줬습니다.

getMoeny가 오버라이딩 됬음을 알려주죠  

 

자 그러면 earning 이라는 변수는 Son 컨트랙이 일을 하였을 때 벌어 들이는 수입입니다.

getMoeny 위를 보시면 work 이라는 함수가 보이는데 이 함수는 Son 컨트랙이 일을 해서 돈을 번것을 나타 냅니다.

즉 work 함수를 돌리면 earning 100 씩 증가합니다. 

그리고 getMoeny 를 누르면 아버지에게 받은돈 moeny 와 아들이 번돈 earning 이 합쳐져서 아들의 재산을 보여준답니다. 

 

그래서 전체 코드는 이렇답니다. 

 

// SPDX-License-Identifier:GPL-30
pragma solidity >= 0.7.0 < 0.9.0;

contract Father{
    
    string public familyName = "Kim";
    string public givenName = "Jung";
    uint256 public money = 100; 
    
    constructor(string memory _givenName) public {
        givenName = _givenName;
    }
    
    
    function getFamilyName() view public  returns(string memory){
        return familyName;
    } 
    
    function getGivenName() view public  returns(string memory){
        return givenName;
    } 
    
    function getMoney() view  public virtual returns(uint256){
        return money;
    }
    
    
}

contract Son is Father("James"){
    
    
    uint256 public earning = 0;
    function work() public {
        earning += 100;
    }
    
     function getMoney() view  public override returns(uint256){
        return money+earning;
    }

}

꼭 영상을 참고 해주시기 바랍니다. 

자세히 나와 있습니다.

 

관련글 더보기