728x90
솔리디티로 스크립트를 작성할 때, 아래와 같이 contract 정의를 할 때 view<<<<를 많이 보았을 것이다.
대체 얘가 무엇인지 알아보자.
아래 코드는 내 블로그에서 가져온 일부 코드이다.
contract Counter{
uint256 private _count;
event Count(uint256 count);
function current() public view returns(uint256){
return _count;
}
function increment() public{
_count += 1;
emit Count(_count);
}
function decrement() public{
_count -= 1;
emit Count(_count);
}
}
view의 위치는 접근제한자(public, private등) 앞, 뒤 어디든 붙여도 상관이없다.
function current() public view returns(uint256){
return _count;
}
function current() view public returns(uint256){
return _count;
}
둘다 가능하며, 저 위치에는 view말고도 pure 또한 들어갈 수 있다.
자, 이제 어떤 경우에 view가 들어가고, pure가 들어가는지 알아보자.(안 들어가는 경우도 있음. 아래에서 따로 설명하겠다.)
1. View
storage state 를 읽을 수 있지만, 그 state 값을 변경할 수 없다.
이 설명을 처음 봤을 때 내가 가장 먼저 했던 생각은 이게 무슨 소리지?였다.
쉽게 설명하자면, function 밖의 것들은 storage state에 저장이 된다는 말이다.
아래의 코드를 보자.
contract Counter{
uint256 private _count;
event Count(uint256 count);
function current() public view returns(uint256){
return _count;
}
}
function 밖에 있는 _count는 storage state에 저장한다는 얘기이다.
그런데 함수 안에서는 storage state 값을 읽어, _count를 return해야하니 view를 붙여야하는 것이다.
만약, _count 값을 바꾸고 싶다면 어떻게 해야할까?
function increment() public{
_count += 1;
emit Count(_count);
}
위처럼 그냥 아무것도(view, pure 둘다 x) 안 써주면 된다.
2. pure : storage state 를 읽으면 안되고, 그 state값을 변경할 수 도 없다.
pure는 storage state를 읽지 못하고, 변경도 불가하니 당연히, 함수 밖의 외부의 값을 가져올 수 없다.
그러니 함수 내에 정의된 로컬변수들과 논다.
예시 코드이다.
contract Pure_example{
function read_a() pure public returns(uint256){
uint256 a2 = 3;
return a+2;
}
}
함수 안에 정의된 변수들과 놀고 있다.
정리
view : function 밖의 변수들을 읽을수 있으나 변경 불가능
pure : function 밖의 변수들을 읽지 못하고, 변경도 불가능
viwe 와 pure 둘다 명시 안할때: function 밖의 변수들을 읽어서, 변경을 해야함.
728x90