블록체인 학습
0 XP

생성자 (constructor)

생성자(constructor) 는 컨트랙트가 배포(deploy)될 때 단 한 번만 실행되는 특수 함수입니다. 초기 상태를 설정하거나, 컨트랙트의 소유자(owner)를 기록하거나, 변경 불가능한 값을 한 번 정하는 데 사용합니다. 배포가 끝난 뒤에는 다시 호출할 수 없으며, 배포된 컨트랙트 코드에도 포함되지 않습니다.

선언 문법

생성자는 일반 함수와 달리 function 키워드 없이 constructor 키워드로 선언합니다. 이름도, 반환 타입도 없습니다. 매개변수는 배포 시점에 인자로 전달합니다.

contract Example {
    uint256 public value;
 
    constructor(uint256 _value) {
        value = _value; // 배포 시점에 한 번 설정
    }
}

생성자는 선택 사항입니다. 생성자를 작성하지 않으면 매개변수가 없는 빈 생성자가 자동으로 만들어집니다.

초기 소유자 설정 패턴

가장 흔한 용도는 "배포한 사람"을 소유자로 기록하는 것입니다. msg.sender 는 그 함수를 호출한 주소이며, 생성자 안에서는 곧 배포자의 주소를 가리킵니다. 이렇게 기록한 owner 는 나중에 권한 검사(접근 제어)의 기준으로 자주 쓰입니다.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
 
contract Ownable {
    address public owner;
 
    constructor() {
        owner = msg.sender; // 배포자를 소유자로 기록
    }
}

immutable 값 할당

immutable 변수는 배포 시점에 단 한 번만 값이 정해지고 이후에는 바꿀 수 없습니다. constant 와 달리 컴파일 시점이 아니라 배포 시점에 동적으로 값을 정할 수 있습니다. 그러면서도 읽을 때 드는 가스는 일반 상태 변수보다 적습니다.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
 
contract Token {
    address public immutable creator;
    uint256 public immutable createdAt;
 
    constructor() {
        creator = msg.sender;
        createdAt = block.timestamp; // 배포된 시각을 한 번 기록
    }
}

소유자, 토큰 발행자, 배포 시각처럼 배포된 뒤로 바뀔 일이 없는 값이 immutable 을 쓰기 좋은 자리입니다.

아래 에디터에서 생성자가 있는 컨트랙트를 직접 컴파일해보세요. Run 을 누르면 됩니다.

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

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