솔리디티에서 'super' 키워드는 어떻게 사용하나요?
_____A: `super` 키워드는 상속받은 부모 컨트랙트의 함수나 생성자를 호출할 때 사용됩니다. 다중 상속 상황에서 부모 컨트랙트의 특정 함수에 접근할 때 주로 활용됩니다.
Q: `super` 키워드를 사용하는 기본 문법은 어떻게 되나요?
A: `super.함수명()` 형태로 부모 컨트랙트에서 해당 함수가 호출됩니다. 예를 들어, `super.foo()`는 부모 컨트랙트의 `foo` 함수를 호출합니다.
Q: 생성자에서 `super`를 어떻게 사용하나요?
A: 자식 컨트랙트 생성자에서 부모 생성자를 호출할 때 `super`를 이용할 수 있습니다. 예:
```solidity
constructor() public super() {
// 추가 코드
}
```
다만, 솔리디티 버전에 따라 부모 생성자 호출 문법이 다르므로 주의가 필요합니다.
Q: 다중 상속 시 `super` 호출은 어떻게 동작하나요?
A: 다중 상속에서 `super` 호출은 ‘선형화된 상속 순서(MRO, Method Resolution Order)’를 기준으로 가장 가까운 부모 컨트랙트의 함수를 호출합니다. 따라서 다중 상속 구조에서 `super` 호출은 각 상속 체인에서 다음 함수가 호출되는 방식으로 동작합니다.
Q: `super`를 호출할 때 주의할 점이 있나요?
A:
- `super` 호출은 직접 부모가 아닌 상속 순서상의 다음 함수가 호출되므로 다중 상속에서 호출 위치를 잘 이해해야 합니다.
- 부모 컨트랙트 함수가 `virtual`로 지정되어 있어야 `super`로 호출할 수 있습니다.
- 생성자 호출에서 `super` 대신 명시적으로 각 부모 생성자를 지정하는 것이 더 권장됩니다.
```solidity
contract A {
function foo() public virtual returns(string memory) {
return "A";
}
}
contract B is A {
function foo() public virtual override returns(string memory) {
return string(abi.encodePacked("B -> ", super.foo()));
}
}
contract C is B {
function foo() public override returns(string memory) {
return string(abi.encodePacked("C -> ", super.foo()));
}
}
```
위 코드에서 `C.foo()` 호출 시 `super.foo()`는 `B.foo()`를 호출하고, `B.foo()` 내 `super.foo()`는 `A.foo()`를 호출합니다.
---
요약하면, Solidity의 `super` 키워드는 상속받은 부모 컨트랙트의 함수(또는 생성자)를 호출할 때 사용하는 특수 키워드로, 다중 상속 시 상속 선형화 순서에 따라 함수 호출 흐름을 제어하는 데 매우 유용합니다.
Solidity는 객체 지향 프로그래밍 언어로, 계약(Contract) 간의 상속을 지원합니다.
이 기능을 통해 코드의 재사용성을 높이고, 더 복잡한 계약 구조를 쉽게 관리할 수 있습니다.
상속의 기본 개념 Solidity에서 계약은 다른 계약을 상속받을 수 있습니다.
상속을 통해 자식 계약은 부모 계약의 상태 변수와 함수를 사용할 수 있습니다.
예를 들어, 다음과 같은 기본적인 계약 구조를 생각해 볼 수 있습니다: ```solidity pragma solidity ^0.8.0; contract Parent { function greet() public pure returns (string memory) { return "Hello from Parent!"; } } contract Child is Parent { function greet() public pure returns (string memory) { return "Hello from Child!"; } } ``` 위의 예제에서 `Child` 계약은 `Parent` 계약을 상속받습니다.
`Child` 계약은 `greet` 함수를 오버라이드하여 자신만의 구현을 제공합니다.
`super` 키워드의 사용 `super` 키워드는 자식 계약에서 부모 계약의 함수를 호출할 때 사용됩니다.
이를 통해 자식 계약에서 부모 계약의 기능을 확장하거나 수정할 수 있습니다.
다음은 `super` 키워드를 사용하는 예제입니다: ```solidity pragma solidity ^0.8.0; contract Parent { function greet() public pure virtual returns (string memory) { return "Hello from Parent!"; } } contract Child is Parent { function greet() public pure override returns (string memory) { return string(abi.encodePacked(super.greet(), " And Hello from Child!")); } } ``` 위의 예제에서 `Child` 계약은 `greet` 함수를 오버라이드하면서 `super.greet()`를 호출하여 부모 계약의 `greet` 함수에서 반환된 문자열을 포함합니다.
이 경우, `Child` 계약의 `greet` 함수는 "Hello from Parent! And Hello from Child!"를 반환합니다.
`super` 키워드의 장점 1. 코드 재사용성 : `super`를 사용하면 부모 계약의 기능을 쉽게 재사용할 수 있습니다.
이는 코드 중복을 줄이고, 유지보수를 용이하게 합니다.
2. 확장성 : 계약의 기능을 확장할 때, 부모 계약의 기존 로직을 그대로 사용할 수 있어 새로운 기능을 추가하는 것이 간편해집니다.
3. 명확한 구조 : 상속 관계가 명확해지므로, 계약의 구조를 이해하기 쉬워집니다.
`super`를 사용하면 어떤 부모 계약의 함수를 호출하는지 명확하게 알 수 있습니다.
주의사항 - `super` 키워드는 오직 상속 관계에서만 사용할 수 있습니다.
즉, 부모 계약의 함수가 자식 계약에서 오버라이드된 경우에만 사용할 수 있습니다.
- Solidity의 다중 상속을 사용할 때, `super`는 호출 순서를 결정하는 데 중요한 역할을 합니다.
Solidity는 C3 선형화 알고리즘을 사용하여 상속 순서를 결정하므로, 다중 상속을 사용할 때는 주의가 필요합니다.
결론 Solidity에서 `super` 키워드는 상속 관계에서 부모 계약의 함수를 호출하는 데 매우 유용한 도구입니다.
이를 통해 계약의 기능을 확장하고, 코드의 재사용성을 높이며, 명확한 구조를 유지할 수 있습니다.
상속과 `super` 키워드를 적절히 활용하면 더 효율적이고 관리하기 쉬운 스마트 계약을 작성할 수 있습니다.
작성자:
이현서 [비회원]
| 작성일자: 1년 전
2024-11-22 19:32:08
조회수: 174 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 174 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.