이 글은 인프런 "솔리디티 깨부수기" 강의를 수강한 후 정리한 글입니다.
constructor
생성자는, 스마트컨트랙이 생성 또는 배포, 그리고 인스턴스화 될때 초기값을 설정해주는 용도로 사용하며, 주로 변수의 값을 초기화할 때 사용한다.
스마트 컨트랙이 처음 생성될 때 배포되거나 인스턴스화 될 때 초기 변수의 파라미터 값을 고 스마트 컨트랙이 생성된다.
// SPDX-License-Identifier:GPL-30
pragma solidity >= 0.7.0 < 0.9.0;
contract A{
string public name;
uint256 public age;
constructor(string memory _name, uint256 _age){
name = _name;
age = _age;
}
}
contract B{
A instance = new A("Alice", 52);
function get() public view returns(string memory, uint256) {
return (instance.name(), instance.age());
}
위의 예제에서 A 컨트랙를 인스턴스화했는데 constructor을 정의함으로 A의 초기값을 정의할 수 있다. 즉 생성자는 어떠한 인스턴스, 컨트랙을 인스턴스화 할 때 초기값을 넣어주게 한다.
위의 예제에서는 name 과 age 변수 값을 정의하고 constructor에 두 변수를 파라미터 값으로 입력 받아온다.
그리고 B 컨트랙에서 A 컨트랙의 인스터스화를 위하여 constructor 생성자에서 받아온 파라미터 값을 넣어준다. 각각 name과 age 변수는 "Alice" ,52로 입력받게 된다.
해당 값들을 리턴하기 위해서 B 컨트랙에서 get() 함수로 name과 age 복수의 변수값을 리턴할 수 있다. 컨트랙을 배포하면 name과 age 입력된 값을 확인할 수 있다.
다음으로 name,age 값을 변경하는 실습을 진행하겠다. 함수를 통해서 값을 변경하기 위해서는 A 컨트랙에 정의한 name과 age 변수 값들 또한 변경해줘야한다. 이는 change 함수를 이용하여 생성자에서 설정한 name과 age 값을 변경할 수 있다.
// SPDX-License-Identifier:GPL-30
pragma solidity >= 0.7.0 < 0.9.0;
contract A{
string public name;
uint256 public age;
constructor(string memory _name, uint256 _age){
name = _name;
age = _age;
}
function change(string memory _name, uint256 _age) public {
name = _name;
age = _age;
}
}
contract B{
A instance = new A("Alice", 52);
function change(string memory _name, uint256 _age) public {
instance.change(_name,_age);
}
function get() public view returns(string memory, uint256) {
return (instance.name(), instance.age());
}
}
위의 예제에서 A 컨트랙에 change 함수를 정의하고 B 컨트랙에서는 A 컨트랙을 인스턴스화해서 change함수에 접근한다. 사용자에게 입력을 받고 파라미터 값들을 바꿀 수 있다.
위에는 B 컨트랙을 배포하여 A 인스턴스를 통해 name과 age 변수값을 받고 change 함수를 통해 변경할 수 있다. 그렇다면 A 컨트랙을 배포한다면 어떻게 될까?
배포를 하기 전에 constructor은 a를 쓰기 전에 먼저 지정을 해줘야 하기 때문에 값을 받는다. 값이 따로 저장된 것을 확인할 수 있는데, 이는 A와 인스턴스 A는 완전히 별개의 것이기 때문이다.
이런 식으로 B 컨트랙 안에 A 컨트랙을 인스턴스화해서 접근하는 방식은 많은 가스 비용을 유발한다. 이는 B 컨트랙에서 A컨트랙의 전부를 가져오기 때문에 인스턴스화해서 사용하는 방식은 운영하고자 하는 스마트 컨트랙이 어떻게 동작하냐에 따라 신중하게 선택할 필요가 있다.
비용적인 측면보다 블록마다 가스를 소비할 수있는 양은 제한적이며 초과하게 되는 경우 이더리움 자체에서 에러가 발생해 스마트 컨트랙 배포가 불가능하게되는 상황이 발생한다.
이러한 블록마다 가스 비용을 제한하는 것은 보안적인 측면에서 고려한 것으로 클론 팩토리 패턴을 이용해서 가스 비용을 획기적으로 줄일 수 있는 방법또한 있다.
'자기개발 > 블록체인' 카테고리의 다른 글
[솔리디티 깨부수기] overriding 오버라이딩 (0) | 2024.05.28 |
---|---|
[솔리디티 깨부수기] 상속1 - 정의 (0) | 2024.05.21 |
[솔리디티 깨부수기] instance 정의 (0) | 2024.05.10 |
[솔리디티 깨부수기] function4 - string (0) | 2024.05.10 |
[솔리디티 깨부수기] funtion3 : view와 Pure (0) | 2024.05.06 |