본문 바로가기
Programing/Solidity

[Solidity] 함수 제어자 view & pure

by AustinProd 2022. 3. 11.

함수 제어자(State Modifier) view, pure

 

함수 제어자란 컨트렉트 내에 선언된 변수의 상태를 변경시키는지 그렇지 않는지 나타낸다.

 

viewpure 두가지가 있으며, 두 함수 제어자 모두 컨트렉트를 변경시키지 않는 함수 선언에 함께 붙는다.

 

차이점은 반환하는 데이터가 함수 밖의 상태 변수(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)

 

 

 

댓글