상세 컨텐츠

본문 제목

솔리디티 강좌 10강 상속1 - 정의

솔리디티 깨부수기 - 기본

by D_One 2021. 9. 5. 20:13

본문

 

안녕하세요 

오늘은 간단하게 상속을 하는 법을 배워 보겠습니다.

 

상속 이란? 

모두다 알다시피, 윗 사람이 죽으면, 그 죽은 사람의 재산 이나 권리를 아랫 사람에게 주는것이죠.

이와 같이, 스마트 컨트랙 내에서도, 상속이라는 것이 이루어집니다.

스마트 컨트랙 사이의 상속은 재산이나 권리를 주는것이 아닌, 변수와 함수들을 상속 해줍니다.

 

쉽게 예를 들어서, 

 

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

contract Father{

}

contract Son{
    
}

Father 과 Son 두개의 부자(父子) 관계 컨트랙이 있습니다.

 

저희는 Father 스마트 컨트랙에 기능을 구현후 아들이 아버지의 기능을 상속받도록 구현 해볼게요.

 

contract Father{
    string public familyName = "Kim";
    string public givenName = "Jung";
    uint256 public money = 100; 
    
    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;
    }
    

}

현재 아버지 컨트랙에는 3개의 변수 3개의 함수가 있습니다.

familyName 과 givenName 은 각각 성과 이름을 나타냅다.

성은 kim 이름은 Jung 입니다.

그리고 money는 아버지의 재산이라고 가정하고,  100 이라는 값을 나타 냅니다.

100은 100만원이라 가정하겠습니다. 

 

나머지 3 개의 함수들은 각각 3개의 변수 성 familyName, 이름 givenName, 재산 money 를 리턴 합니다. 

 

자 인제 이 3개의 변수와 함수를 Son 스마트 컨트랙에서 그대로 상속 받아서, 이 함수들과 변수들을 접근 해볼것입니다.

// 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; 
    
    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{
    
}

위에 보시는 바와 같이 Son 스마트 컨트랙은 Father 스마트 컨트랙을 아주 쉽게 했음을 알 수있습니다. 

상속 받을 컨트랙 is 상속 주는 스마트 컨트랙 {

       //....

}

라는걸 알 수 가있습니다.

 

 

인제 Son 스마트 컨트랙이 상속을 받았으니 컴파일후 배포를 한다면, Father의 스마트 컨트랙 변수 와 함수들을 모두 받아서 사용가능함을 볼 수가 있습니다. 

 

만약에 지난번 강의처럼 Father에 constructor가 있다면 어떻게 될까요?

 

 

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;
    }
    

}

위의 예시를 보면 Father 보면 constructor 가 나옴을 알 수 있죠.

이 생성자는 givenName을 변경시켜 줍니다.

 

아무리 아들이 아버지의 것을 상속 받는다 하여도, 이름은 다르겠죠? 

그렇기 때문에, 저희는 이 생성자를 통해서, 아들의 이름을 아버지와 다르게,  따로 유니크 하게 지정 할 수 있답니다.

 

// 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"){
    
  

}

위에 예제와 같이

상속 받을 컨트랙 is 상속 주는 스마트 컨트랙 (파라메터 쓰기) {

       //....

}

 

이런식으로 파라메터를 넣어 줌으로써, 이름을 변경할 수 있답니다.

 

 

son을 컴파일 후 배포를 한다면,

 

이런식으로  givenName이 아버지의 이름 Jung 이 아닌 James임 을 알수가 있습니다.

 

비디오는 꼭 참고하셔야 도움이되요

관련글 더보기