블록체인 학습
0 XP

modifier란?

modifier(제어자)는 함수 실행 전후에 공통 조건이나 로직을 끼워 넣는 재사용 가능한 코드 블록입니다. 같은 검사 코드를 여러 함수에 복사하지 않고, modifier 하나로 묶어 깔끔하게 적용할 수 있습니다. "권한 검사", "상태 확인", "재진입 방지" 같은 반복되는 가드(guard) 로직을 한 곳에 모으는 도구입니다.

_; 의 의미

modifier 안의 _;(언더스코어 세미콜론)는 "여기서 원래 함수의 본문이 실행된다" 는 자리표시자입니다. _; 앞의 코드는 함수 실행 전에, 뒤의 코드는 함수 실행 후에 동작합니다. _; 를 빼먹으면 함수 본문이 아예 실행되지 않으니 반드시 넣어야 합니다.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
 
contract Counter {
    address public owner;
    uint256 public count;
 
    constructor() {
        owner = msg.sender;
    }
 
    // owner만 통과시키는 modifier
    modifier onlyOwner() {
        require(msg.sender == owner, "owner only");
        _; // 검사를 통과하면 함수 본문 실행
    }
 
    function increment() public onlyOwner {
        count += 1;
    }
}

전·후 처리와 다중 적용

_; 뒤에 코드를 두면 함수가 끝난 뒤 후처리를 할 수 있습니다. 예를 들어 재진입 방지 패턴은 _; 앞에서 잠금을 걸고 _; 뒤에서 잠금을 풉니다.

하나의 함수에 여러 modifier 를 붙일 수도 있습니다. function f() public onlyOwner whenActive { ... } 처럼 나열하면 왼쪽에서 오른쪽 순서로 차례차례 적용됩니다.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
 
contract Guarded {
    bool private locked;
 
    modifier noReentrant() {
        require(!locked, "reentrant call");
        locked = true; // _; 앞: 함수 실행 전 잠금
        _;
        locked = false; // _; 뒤: 함수 실행 후 잠금 해제
    }
 
    function safeAction() public noReentrant {
        // 보호된 로직
    }
}

modifier 는 가독성과 보안을 동시에 높입니다. onlyOwner 라는 이름만 봐도 "이 함수는 소유자 전용"이라는 의도가 한눈에 드러나기 때문입니다.

modifier 는 접근 제어(onlyOwner), 상태 검사, 재진입 방지 등 다양한 곳에 쓰이는 핵심 도구입니다.

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

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