생성자 (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 을 누르면 됩니다.