이 글은 인프런 "솔리디티 깨부수기" 강의를 수강한 후 정리한 글입니다.
상속
상속이란, 윗 사람이 죽으면, 그 죽은 사람의 재산 이나 권리를 아랫 사람에게 주는것으로 스마트 컨트랙 내에서도 상속이 이루어진다.
스마트 컨트랙 사이의 상속은 재산이나 권리를 주는것이 아닌, 변수와 함수들을 상속 해준다.
예제 코드를 작성하자면, 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, money 3개의 변수를 정의한다.
성은 kim 이름은 Jung 이며 money는 아버지의 재산이라고 가정하고, 100 이라는 값을 입력한다.
나머지 3 개의 함수들은 각각 3개의 변수 성 familyName, 이름 givenName, 재산 money 를 리턴한다.
이후 아들 컨트랙에서 아버지 컨트랙에서 정의한 3개의 변수와 함수를 상속 받아서, 해당 함수들과 변수들을 접근하려고 한다.
// 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{
}
상속하는 방법은 간단하다. 상속해야할 입장의 컨트랙에서 상속해야할 컨트랙을 작성하면 된다.
상속 받을 컨트랙 is 상속 주는 스마트 컨트랙 {
//....
}
위의 예제와 같이 코드를 작성하면 아들 컨트랙을 배포했을 때, 아버지 컨트랙의 함수들과 변수들에 접근할 수 있다.
그렇다면 아버지 컨트랙에 constructor가 있다면 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;
}
}
위의 예제에서 아버지 컨트랙을 보면 constructor 가 정의되었으며, givenName을 변경할 수 있다.
이는 아들이 아버지의 것을 상속받는다했을 때, 성은 동일하지만 이름은 다르기 때문에 constructor을 통해서 이름을 다르게 지정할 수 있도록 할 수 있다.
// 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"){
}
위에 예제와 같이 파라미터 값으로 아들의 이름을 입력 받을 수 있다.
아들 컨트랙을 배포하면 givenName이 아버지의 이름 Jung 이 아닌 James임 을 알수가 있다.
'자기개발 > 블록체인' 카테고리의 다른 글
[솔리디티 깨부수기] 두 개 이상 상속하기 (0) | 2024.05.28 |
---|---|
[솔리디티 깨부수기] overriding 오버라이딩 (0) | 2024.05.28 |
[솔리디티 깨부수기] Instance - constructor (0) | 2024.05.21 |
[솔리디티 깨부수기] instance 정의 (0) | 2024.05.10 |
[솔리디티 깨부수기] function4 - string (0) | 2024.05.10 |