블록체인 학습
0 XP

super 키워드

함수를 재정의하면서도 부모의 원래 구현을 함께 호출하고 싶을 때 super 키워드를 사용합니다. super.함수이름() 형태로 부모 버전을 실행한 뒤 자식만의 추가 로직을 더하면 됩니다. 재정의는 보통 부모의 동작을 완전히 대체하지만, super 를 쓰면 부모가 하던 일을 그대로 남긴 채 그 위에 덧붙일 수 있습니다.

contract Base {
    function setup() public virtual {
        // 부모의 기본 설정
    }
}
 
contract Child is Base {
    function setup() public override {
        super.setup(); // 부모 구현을 먼저 실행
        // 자식만의 추가 로직
    }
}

super 는 부모의 로직을 버리지 않고 확장 할 때 유용합니다. 로깅, 검증 같은 공통 단계를 재사용할 수 있습니다.

카운터에 보너스 더하기

아래 BonusCounter 는 부모의 증가 로직을 그대로 실행한 뒤 보너스를 한 번 더 더합니다. super.increase() 로 부모의 count += 1 을 재사용하고, 그 위에 자식만의 +1 을 얹는 식입니다. 부모 코드를 복사해 붙이지 않고도 동작을 안전하게 덧붙일 수 있다는 점이 핵심입니다.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
 
contract Counter {
    uint256 public count;
 
    function increase() public virtual {
        count += 1;
    }
}
 
contract BonusCounter is Counter {
    function increase() public override {
        super.increase(); // count += 1
        count += 1;       // 보너스 +1
    }
}

super 가 가리키는 부모는 누구일까?

super.increase() 는 Counter.increase() 처럼 부모 이름을 직접 적어 부르는 것과 비슷해 보이지만 차이가 있습니다. 단일 상속에서는 둘 다 부모를 가리키지만, 다중 상속에서는 super 가 C3 선형화 가 정한 순서에 따라 바로 다음 부모 를 호출합니다. 그래서 여러 부모가 같은 함수를 재정의한 경우, 각 단계에서 super 를 호출하면 선형화 순서대로 모든 부모 구현이 연쇄적으로 실행됩니다.

super.setup() 을 자식 로직보다 먼저 부를지 나중에 부를지에 따라 실행 순서가 달라집니다. 초기화나 검증은 보통 부모를 먼저 호출하는 것이 안전합니다.

Code Editor
에디터를 불러오는 중...
실행 결과

Run 버튼을 눌러 코드를 실행하세요.