함수 제어자(State Modifier) view, pure
함수 제어자란 컨트렉트 내에 선언된 변수의 상태를 변경시키는지 그렇지 않는지 나타낸다.
view 와 pure 두가지가 있으며, 두 함수 제어자 모두 컨트렉트를 변경시키지 않는 함수 선언에 함께 붙는다.
차이점은 반환하는 데이터가 함수 밖의 상태 변수(State Variable)인지 아닌지에 있다.
아래 예제들을 보며 살펴보자.
string greeting = "Hello";
function sayHello() public view returns (string) {
return greeting;
}
위에서 살펴 본 함수 sayHello()는 솔리디티에서 상태를 변화시키지 않는다. 즉, 어떤 값에 대한 변경이나 수정이 없다. 이 경우에는 함수를 view 함수로 선언한다. 이 선언자를 통해 개발자는 해당 함수가 데이터(State Variable)를 참조만 하고 변경하지 않음 표현한다.
function _multiply(uint a, uint b) private pure returns (uint) {
return a * b;
}
솔리디티는 pure 함수도 가지고 있는데, 이는 함수가 컨트렉트에서(혹은 앱에서) 어떤 데이터도 접근하지 않는 것을 의미한다. 이 함수는 컨트렉트에서 변수를 직접 참조하지 않고 함수에 전달된 인자값만 참조해 반환값을 지정한다.
다르게 얘기하면, 함수 밖의 데이터(State Variable)이 아닌 함수 안의 데이터(Local Variable)를 반환한다. 해당 경우에 함수를 pure로 선언할 수 있다.
참고: 함수를 view나 pure로 언제 표시할지 기억하기 어려울 수 있다. 컴파일 단계에서 어떤 제어자를 사용해야 하는지 경고 메시지를 통해 알려주니 배포 전 경고 메세지가 있는지 해보자.
예제를 코드를 하나 더 소개한다. 아래 코드에서 getDefaultChoice( ) 함수의 제어자를 입력하다면 view 나 pure 중 어떤 값이 들어가야할까?
contract enumsLearn {
enum shirtColor {RED, WHITE, BLUE}
shirtColor choice;
shirtColor constant defaultChoice = shirtColor.BLUE;
function setWhite() public {
choice = shirtColor.WHITE;
}
function getChoice() public view returns(shirtColor) {
return choice;
}
function getDefaultChoice() public [함수 제어자] returns (uint) {
return uint(defaultChoice);
}
}
올바른 표기는 `pure` 다. defaultChoice 라는 함수 밖 변수를 호출하기 때문에 view 로 생각할 수 있다. 하지만, 실제 코드 에디터에서는 경고 메세지와 함께 pure 로 표기할 것을 강제한다. 왜 그럴까?
이유는 uint 파싱에 있다. 해당 함수의 반환 타입은 정수이기 때문에, enum 타입의 값을 uint 로 변환해야 한다. 이 때, 함수 밖 변수는 함수 내부 지역 변수로 새로이 선언되며, 이 지역 변수가 반환값으로 지정되기 된다. (State Variable 참조 -> uint 변환 -> Local Variable 생성 -> Return)
'Programing > Solidity' 카테고리의 다른 글
[Solidity] fallback 함수 (0) | 2022.03.12 |
---|---|
[Solidity] 솔리디티 코드 연습 - 크립토 좀비 (1) | 2022.03.11 |
[Solidity] string memory와 bytes (0) | 2022.03.10 |
[Solidity] Scope와 Visibility (Public, Private, External, Internal) (0) | 2022.03.10 |
[Solidity] 이더리움 프로그래밍 코드 에디터 Remix IDE (0) | 2022.03.08 |
댓글