function use_public_example_a()viewpublic returns (uint256) {
//...
}
라는 function 을 보셨을거예요.
그리고 view 라는 키워드를 처음 보셨을거 구요.
저 키워드의 자리는 pulbc 과 같은 접근 제한자 앞 이나 뒤 어디든 붙이면 되요.
function use_public_example_a()viewpublic returns (uint256)
function use_public_example_a()public view returns (uint256)
저곳에는 view 와 pure 가 들어 간답니다.
1.view : storage state 를 읽을 수 있지만, 그 state 값을 변경할 수 없다.
이 문장만 읽으면 잘이해가 안가니, 예시와 같이 볼게요.
pragma solidity >=0.7.0 <0.9.0;
contract View_example{
uint256 public a = 1;
function read_a() public view returns(uint256){
return a+2;
}
}
function 의 밖에 있는 것들은 storate에 저장이됩니다.
그러니 이 예제에서는 a 가 storage state 이 겠죠.
저희는 read_a() 라는 간단히 a 값을 리턴하는 함수를 만들었어요.
그러나, a 를 리턴하니, 당연히 storage state를 읽었다고 할 수 있겠죠?
그렇기 때문에 view 를 넣어야 합니다.
그렇다면, 만야에 read_a()에서 storage state의 값을 바꾼다면 어떻게 해야할까요?
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
contract View_example{
uint256 public a = 1;
function read_a() public returns(uint256){
a = 3;
return a+2;
}
}
이런식으로 아무것도 안써주면 되요.
2.pure : storage state 를 읽으면 안되고, 그 state값을 변경할 수 도 없다.
view 부분을 알았으니, pure는 어느정도 짐작이 갔으리나 생각됩니다.
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
contract Pure_example{
function read_a() pure public returns(uint256){
uint256 a = 3;
return a+2;
}
}
pure는 storage state를 읽지 못하고, 변경도 불가하니 당연히, 함수 밖의 외부의 값을 가져올 수 없죠?
그러니 함수 내에 정의된 로컬변수들과 논답니다.
위에서 로컬변수 a 는 3 을 대입받고, 2를 더해서 마지막에는 5로 리턴한답니다.
정리하지면:
view : function 밖의 변수들을 읽을수 있으나 변경 불가능
pure : function 밖의 변수들을 읽지 못하고, 변경도 불가능
viwe 와 pure 둘다 명시 안할때: function 밖의 변수들을 읽어서, 변경을 해야함.