[TIL] 2023-05-10

Melon Coder·2023년 5월 10일
0

TIL

목록 보기
31/50
post-thumbnail

Today I Learned


[Solidity]

오늘은 if문과 논리연산자, 열거형(enum)boolean 에 대해 배웠다.


if문

솔리디티에서 if문은 다른 프로그래밍 언어에서 if문과 비슷하다.
그래서 오늘 배운 내용은 어렵진 않았지만 struct와 응용하여 if문을 작성한 내용에 대해 정리해볼까한다.

먼저 struct student를 선언한 후 student형 변수 a, b, c와 student형 배열 Students를 각각 선언한다.

contract IF {
   struct student {
      uint number;
      string name;
      uint score;
      string credit;
   }

   student a;
   student b;
   student c;

   student[] Students;

그리고 a 학생 정보를 넣는 함수를 작성해준다.
이때 number, name, score를 입력받아서 입력받은 score를 조건문을 통해 credit에 학점을 자동으로 넣어준다.
그리고 credit 변수는 함수 내 지역변수로 선언해주는데 그 이유는 함수 내에서 조건문으로 돌려야 하기 때문이다.
그리고 a 변수에 student형 변수들을 넣어주면 된다.

   // 점수가 90점 이상이면 A, 80점 이상이면 B, 70점 이상이면 C, 나머지는 F
   function setA(uint _number, string memory _name, uint _score) public {
      string memory _credit;
      if(_score>=90) {
         _credit = 'A';
      } else if(_score >=80) {
         _credit = 'B';
      } else if(_score >=70) {
         _credit = 'C';
      } else {
         _credit = 'F';
      }

      a = student(_number, _name, _score, _credit);
   }

상태변수로 선언해준 학생 a, b, c가 아닌 새로운 학생정보를 입력하여 배열에 넣어주는 함수를 작성한다.

   function pushStudent(uint _number, string memory _name, uint _score) public {
      string memory _credit;
      if(_score>=90) {
         _credit = 'A';
      } else if(_score >=80) {
         _credit = 'B';
      } else if(_score >=70) {
         _credit = 'C';
      } else {
         _credit = 'F';
      }
      Students.push(student(_number, _name, _score, _credit));
   }

아래는 함수 내에서 조건문을 통해 학점을 입력하는 방법이 아닌 새로운(조건문을 통해 학점을 반환받는) 함수를 작성하여 사용하는 방법이다.

   function setA(uint _number, string memory _name, uint _score) public {
      a = student(_number, _name, _score, setGrade(_score));
   }
   
   function pushStudent(uint _number, string memory _name, uint _score) public {
   	  Students.push(student(_number, _name, _score, setGrade(_score)));
   }
   
   function setGrade(uint _score) public pure returns(string memory) {
      if(_score>=90) {
         return 'A';
      } else if(_score >=80) {
         return 'B';
      } else if(_score >=70) {
         return 'C';
      } else {
         return 'F';
      }
   }
}

다음은 논리연산자를 사용한 조건문이다.

contract IF2 {

   function setNumber(uint _n) public pure returns(string memory) {
      if(_n>=70 || _n<=10) { // or -> || 
         return "A";
      } else if(_n>=50 && _n%3==0) {
         return "B";
      } else {
         return "C";
      }
   }
}

enum

contract ENUM {
   enum Food { //enum 변수명 {변수1, 변수2, 변수3, 변수4}
      Chicken, // - 0
      Suish,   // - 1
      Bread,   // - 2
      Coconut  // - 3
   }

   Food a; // Food형 변수 a
   Food b; // Food형 변수 b
   Food c;

   function setA() public {
      a = Food.Chicken;
   }

   function setB() public {
      b = Food.Suish;
   }

   function setC() public {
      c = Food.Bread;
   }

   function getABC() public view returns(Food, Food, Food) {
      return (a,b,c);
   }

   function getABC2() public view returns(uint8, uint8, uint8) {
      return (uint8(a),uint8(b),uint8(c));
   }
}

enum 자료형은 변수들이 uint8로 저장(0부터)되기 때문에 8비트, 즉 1바이트로 16진수 2자리까지(255까지) 저장되는데 이떄문에 정적인 타입이고 많은 값을 넣거나 할때 사용되지 않는다.
장점으로는 상태관리를 하기에 적절하고 가독성에도 장점이 있다.
그리고 새로운 값을 추가하거나 삭제할 수 없기 때문에 안정적으로 관리할 수 있다.

0개의 댓글