시작하며
지난 글에서 가시성 지정자에 대해 다루며 변수에 대해 가시성 지정자를 지정하였을 때 어떤 차이가 있는지
간단하게 알아보았다. 함수에도 가시성 지정자가 붙는데, 이를 포함해 전체적으로 컨트랙트 안에서
함수는 어떻게 정의하고, modifier가 무엇인지 알아보자. 여기서 modifier는 function modifier에 대한 개념이다.
함수 작성법 및 function modifier
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
contract funcTest{
uint public a;
function emptyFunc() public pure{
//return이 없으면 returns 적을 필요 없음
}
function func1() public pure returns(uint){ // pure로 선언해 외부변수 접근 불가
uint b = 10;
//b = a; 외부변수 a를 사용하므로 불가
return b;
}
function func2() public view returns(uint){ // view는 외부 변수 읽기 가능
uint b = a;
//a = 1; view는 외부변수 읽기만 가능, 쓰기 불가
return b;
}
function func3() public returns(uint){ // 아무것도 지정하지 않으면 외부변수 읽기 및 쓰기 가능
uint b = a;
a = 1;
return b;
}
}
1. 가장 먼저 아무것도 기능하지 않는 emptyFunc()로 함수의 구조를 보면 function 키워드, 함수이름, 매개변수 (), 가시성 지정자, modifier로 지정할 수 있다. return이 있다면 returns(uint) 와같이 리턴할 값의 자료형을 넣어주어야 하며, ","로 여러개를 리턴할 수 있다.
2. func1을 보면 pure로 modifier가 지정되어있다. 이는 함수 외부 변수에 접근을 아예하지않고 함수 내부 정의된 변수와 매개변수만 사용한다는 의미이다. 따라서 외부변수 a를 단순히 읽기만 해도 에러가 뜬다.
3. func2는 view 속성을 이용해 a의 값을 읽을 수 있게 되었다. 쉽게 이용할 수 있게되었다라고 표현하면 맞을 것 같다. 그러나 view는 읽기만 가능하고 쓰기는 불가해 a의 값을 func2에서 바꿀 수는 없다.
4. func3처럼 아무런 지정도 하지 않을 경우, 외부변수에 대한 읽기 및 쓰기가 가능해진다.
위 함수들을 보면 함수 return을 returns를 이용해 어떻게 반환하는지도 알 수 있다.
그렇다면 편하게 같은 컨트랙트에 있는 변수는 다 갖다 쓸 수 있게 하면 좋을 것 같은데 왜 굳이 지정할까?
어찌되었건 외부에 있는 변수를 함수내부에서 수정하고 읽고 하는 것은 지역변수를 쓰는 것보다 비용이 더 많이 든다.
또한 실제 이더리움 블록체인에 스마트 컨트랙트를 deploy하는 것은 실제로 gas fee가 발생한다. 즉 돈이 든다.
최대한 블록체인에 스마트 컨트랙트를 싸게 올리는 것이 이득일 것이다. pure를 사용할 경우 예상하듯 gas fee가 적게 든다.
즉 적절한 function modifier를 적용하여 최대한 gas fee를 줄일 수 있는 습관을 길러야 할 것이다.
마치며
오늘은 함수 modifier에 대해서 알아보았다. 위에서 말한대로 최대한 가스비를 줄이기 위해 적절한 modifier를 사용할 수 있어야 한다.
다행히 remix에 경우 조금 비효율적인 modifier를 지정할 경우 컴파일 전에 알려준다. 많이 쓰다보면 함수를 설계할 때 자연스럽게 적절한 modifier를 지정할 수 있을 것이다.
참고자료
https://www.yes24.com/Product/Goods/111099912
솔리디티 프로그래밍 완벽 가이드 - YES24
개발 경험이 없어도 쉽게 블록체인과 솔리디티를 이해할 수 있습니다!솔리디티는 스마트 컨트랙트를 구현하는 언어이며, 스마트 컨트랙트는 블록체인에서 작동하는 프로그램이다. 『솔리디티
www.yes24.com
'Blockchain > Solidity' 카테고리의 다른 글
Solidity : 배열 다루기 (0) | 2023.06.04 |
---|---|
Solidity : memory와 storage, 그리고 문자열 비교하기 (0) | 2023.06.01 |
Solidity : 가시성 지정자 (0) | 2023.05.31 |
Solidity 자료형에 대해서 알아보자 (0) | 2023.05.31 |
Solidity에 대해 간단한 코드로 알아보기(GPL과 MIT) (0) | 2023.05.31 |