솔리디티에서 'override' 키워드는 무엇인가요?
_____1. `override` 키워드란 무엇인가요?
- `override`는 자식 컨트랙트가 부모 컨트랙트의 함수를 재정의(override)할 때 컴파일러에게 그 의도를 명시적으로 알려주는 키워드입니다.
- Solidity 0.6.0 버전부터 다중 상속 및 함수 충돌 방지를 위해 도입되었습니다.
2. 왜 `override`를 사용해야 하나요?
- 다이아몬드 상속이나 여러 부모로부터 동일한 함수명을 상속받았을 때, 어떤 구현을 따를지 명확히 지정해야 안전한 코드가 됩니다.
- 컴파일러가 의도를 검증하여 예기치 못한 동작이나 보안 취약점을 줄여줍니다.
3. `override`를 사용하지 않으면 어떤 문제가 발생하나요?
- 컴파일 에러: “Derived contract must override function ….”
- 함수 충돌로 인해 잘못된 로직이 실행되거나, 의도치 않은 부모 함수가 호출될 수 있습니다.
4. `override`는 언제 어떻게 사용하나요?
- 부모 함수에 `virtual` 키워드가 붙어 있을 때만 재정의가 가능합니다.
- 자식 컨트랙트에서 함수 선언 시 다음과 같이 명시합니다.
function foo() public override returns (uint) {
…
}
- 다중 상속 시 어떤 부모의 함수를 재정의했는지 구체적으로 명시해야 합니다.
function foo() public override(ParentA, ParentB) returns (uint) {
…
}
5. `virtual`과 `override`의 관계는 무엇인가요?
- 부모 함수에 `virtual`을 선언해야 자식에서 `override`할 수 있습니다.
- 자식에서 `override`된 함수도 추가 상속 관계에서 다시 `virtual`로 열어줄 수 있습니다.
6. 다중 상속 시 `override` 사용 예시
contract A {
function foo() public virtual returns (string memory) { return "A"; }
}
contract B {
function foo() public virtual returns (string memory) { return "B"; }
}
contract C is A, B {
// A와 B의 foo를 명시적으로 재정의
function foo() public override(A, B) returns (string memory) {
// 부모별 foo 호출 가능
return string(abi.encodePacked(A.foo(), B.foo()));
}
}
7. `super`와 함께 쓰면 어떻게 되나요?
- 재정의한 함수 내부에서 `super.foo()`를 호출하면 상속 순서(C3 linearization)에 따라 다음 우선순위 부모의 `foo`가 실행됩니다.
- 다이아몬드 형태 상속에서도 예상 가능한 순서로 작동하도록 해줍니다.
8. 컴파일러 에러 해결 팁
- “TypeError: Derived contract must specify override” → 함수에 `override`를 추가하세요.
- “TypeError: Missing “virtual” keyword” → 부모 함수에 `virtual`을 선언하세요.
- 다중 상속 시 “Override for … is missing” → `override(부모1, 부모2, …)` 형태로 명시하세요.
9. 요약
- 부모 함수에 virtual, 자식 함수에 override를 사용하여 안전한 다중 상속 구현
- override 없이 상속 함수 재정의 불가(컴파일 에러)
- 여러 부모의 같은 함수명을 명시적으로 관리 가능
끝.
Solidity는 객체 지향 프로그래밍 언어로, 스마트 계약을 작성하는 데 사용됩니다.
이 언어는 클래스와 유사한 개념인 계약(Contract)을 지원하며, 계약 간의 상속을 통해 코드의 재사용성과 구조적 설계를 가능하게 합니다.
상속과 함수 재정의 Solidity에서 계약은 다른 계약을 상속받을 수 있습니다.
상속을 통해 부모 계약의 속성과 메소드를 자식 계약에서 사용할 수 있습니다.
그러나 때때로 자식 계약에서 부모 계약의 특정 메소드를 변경하거나 확장하고 싶을 수 있습니다.
이때 `override` 키워드를 사용하여 부모 계약의 메소드를 재정의할 수 있습니다.
사용 예시 다음은 `override` 키워드를 사용하는 간단한 예시입니다.
```solidity // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract Parent { function greet() public virtual pure returns (string memory) { return "Hello from Parent!"; } } contract Child is Parent { function greet() public override pure returns (string memory) { return "Hello from Child!"; } } ``` 위의 예시에서 `Parent` 계약은 `greet`라는 함수를 정의하고 있습니다.
이 함수는 `virtual` 키워드로 표시되어 있어, 자식 계약에서 재정의할 수 있음을 나타냅니다.
`Child` 계약은 `Parent` 계약을 상속받고 있으며, `greet` 함수를 `override` 키워드를 사용하여 재정의합니다.
이 경우, `Child` 계약의 `greet` 함수는 "Hello from Child!"라는 문자열을 반환합니다.
`virtual`과 `override`의 관계 `override` 키워드를 사용하기 위해서는 먼저 부모 계약의 메소드에 `virtual` 키워드를 사용하여 해당 메소드가 재정의 가능하다는 것을 명시해야 합니다.
만약 부모 계약의 메소드에 `virtual` 키워드가 없다면, 자식 계약에서 해당 메소드를 `override` 하려고 할 때 컴파일 오류가 발생합니다.
다중 상속과 `override` Solidity는 다중 상속을 지원합니다.
이 경우, 여러 부모 계약에서 동일한 함수가 정의되어 있을 수 있습니다.
이럴 때는 `override` 키워드를 사용하여 어떤 부모 계약의 메소드를 재정의할 것인지 명확히 지정해야 합니다.
예를 들어: ```solidity contract A { function foo() public virtual pure returns (string memory) { return "A"; } } contract B { function foo() public virtual pure returns (string memory) { return "B"; } } contract C is A, B { function foo() public override(A, B) pure returns (string memory) { return "C"; } } ``` 위의 예시에서 `C` 계약은 `A`와 `B` 두 계약을 상속받고 있습니다.
`foo` 함수는 두 부모 계약에서 모두 정의되어 있으므로, `C` 계약에서 `foo`를 재정의할 때 `override(A, B)`를 사용하여 어떤 부모 계약의 메소드를 재정의할 것인지 명시해야 합니다.
결론 `override` 키워드는 Solidity에서 상속된 함수의 구현을 재정의할 때 필수적인 요소입니다.
이를 통해 개발자는 코드의 재사용성을 높이고, 계약의 동작을 유연하게 조정할 수 있습니다.
`virtual`과 `override`의 조합은 Solidity의 상속 구조에서 중요한 역할을 하며, 다중 상속 시에도 명확한 메소드 재정의를 가능하게 합니다.
이러한 기능들은 스마트 계약의 복잡한 로직을 구현하는 데 매우 유용합니다.
작성자:
이주원 [비회원]
| 작성일자: 1년 전
2024-11-22 19:32:08
조회수: 145 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 145 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.