is 키워드로 상속받기
Solidity 에서 상속은 is 키워드로 선언합니다. contract 자식 is 부모 형태로 쓰면, 자식 컨트랙트가 부모의 모든 멤버(상태 변수와 함수)를 물려받습니다. is 는 "이 컨트랙트는 부모의 일종이다" 라는 관계를 컴파일러에 알려 줍니다. 선언만 해두면 부모의 코드가 자식에 통합되므로, 자식 쪽에서 부모 멤버를 다시 적을 필요가 없습니다.
contract Base {
uint256 public value = 10;
}
contract Derived is Base {
// value 를 그대로 사용할 수 있습니다.
}부모 멤버 사용하기
상속받은 함수와 변수는 마치 자식 컨트랙트가 직접 선언한 것처럼 사용됩니다. 아래 MyCounter 는 Counter 의 count 변수와 increment 함수를 자신의 코드 안에서 자유롭게 호출합니다. 부모의 함수를 호출할 때는 별도의 접두사 없이 이름만으로 부르면 됩니다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract Counter {
uint256 public count;
function increment() public {
count += 1;
}
}
contract MyCounter is Counter {
function incrementTwice() public {
increment();
increment();
}
}is 뒤에 부모 컨트랙트 이름을 정확히 적어야 합니다. 오타가 있으면 컴파일 오류가 납니다.
가시성에 따른 접근 범위
자식이 부모의 모든 멤버를 물려받는 것은 아닙니다. 부모의 public · internal 멤버는 상속되어 접근할 수 있지만, private 멤버는 애초에 자식에게 상속되지 않습니다. 자식에게는 물려주되 외부에는 숨기고 싶다면 internal 가시성을 쓰면 됩니다.
private 으로 선언한 상태 변수나 함수는 자식 컨트랙트에 상속되지 않습니다. 자식에서 그 이름을
쓰면 Undeclared identifier 컴파일 오류가 납니다. (부모의 private 상태 변수가 차지하는 스토리지
슬롯 자체는 자식 컨트랙트에도 그대로 존재하지만, 이름으로는 접근할 수 없습니다.) 자식에게 물려주고
싶다면 private 대신 internal 을 쓰세요.
다음 강의에서는 부모 함수를 자식이 바꿀 수 있게 만드는 virtual 키워드를 배웁니다.