블록체인 TIL-9Week-59Day

디오·2023년 5월 10일
0

💻array, mapping 복습(Quiz).

contract abc {
    struct Student {
        string name;
        uint number;
        string[] classes;

    }

    Student[] Students;

    //students 안에 정보 넣기
    function setStudents(string memory _name, uint _number, string[] memory _classes) public {
        Students.push(Student(_name, _number, _classes));
    }

    //n번째 학생을 알려주는 getStudent
    function getStudents(uint _n) public view returns(Student memory) {
        return Students[_n-1];
    }

    //n번째 학생의 이름만 받기 string
    function getStudentsName(uint _n) public view returns(string memory) {
        return Students[_n-1].name;
    }

    //선생님 - 학생들 정보
    mapping(string => Student[]) Teacher_student;

    //선생님 - 학생 or 학생들 연결 정보 넣는 함수
    function setTeacher_student(string memory _Teacher, string memory _name, uint _number, string[] memory _classes) public {
        Teacher_student[_Teacher].push(Student(_name, _number, _classes));
    }

    //선생님반 안에 특정 학생의 번호를 바꾼다.(추가)
    function set2(string memory _student1, uint _n, uint _number) public {
        Teacher_student[_student1][_n-1].number = _number;
    }

    function getTeacher_student(string memory _Teacher) public view returns(Student[] memory) {
        return Teacher_student[_Teacher];
    }
}
  • array와 mapping을 사용해 학생의 정보 또는 선생님의 대리고있는 학생들의 정보를 가져올 수 있는 코드.

  • 복습은 반복뿐!!!!!






💻If문 기초.

contract IF {
   // 점수가 50점이상이면 P, 아니면 F
   function setGrade(uint _score) public pure returns(string memory) {
      if(_score >=50) { /*if(조건문), <- 이번 경우는 _score가 50보다 높을 때*/
         return "P";
      } else {
         return "F";
      }
   }

   // 점수가 70점이상이면 A, 50점 이상이면 B, 아니면 C반
   function setGrade2(uint _score) public pure returns(string memory) {
      if(_score >=70) {
         return "A";
      } else if(_score >=50) {
         return "B";
      } else {
         return "C";
      }
   }

   // 짝수면 even array에, 홀수면 odd array에 넣기
   uint[] even;
   uint[] odd;

   function evenOrOdd(uint _n) public {
      if(_n%2==0) {
         even.push(_n);      
      } else {
         odd.push(_n);
      }
   }

   function getEvenAndOdd() public view returns(uint[] memory, uint[] memory) {
      return (odd, even);
   }

   // 3으로 나누었을 때, 나머지가 1이면 A, 2이면 B, 0이면 C
   uint[] A;
   uint[] B;
   uint[] C;

   function ternary(uint _n) public {
      if(_n%3==1) {
         A.push(_n);
      } else if(_n%3==2) {
         B.push(_n);
      } else {
         C.push(_n);
      }
   }
}

  • "이 점수는 몇 학점이야" 라고 묻고싶기 때문에 input값이 있다.

  • 상태변수 없이 지역변수를 사용하기 때문에 pure를 사용한다.

  • output값은 문자형으로 보여주기 때문에 string memory를 사용한다.

  • if문을 사용해 조건을 작성하고 조건에 부합하면 "pass", 조건에 부합하지 않으면 else에 "False"이 실행되도록 한다.


  • 첫번째 조건에 부합하지 않을때 두번째 조건도 만들 수 있는데 "그게 아니고 점수가 50이상이면 이 조건을 실행해" 라고 작성할 수 있다. 이때 " else if " 를 사용하면 된다.

  • 값을 넣어주기 위해 input값이 필요.

  • pure를 사용하면 상태변수를 변화시키기 때문에 사용하지 않음.

  • 값을 넣을것이기 때문에 output값이 필요없음.

  • / 는 몫이 나오고, % 는 나머지가 나온다.


  • 위 문제와 같다.

  • default 값을 처리할때 else를 사용한다.






💻If문 응용(깔끔버전 포함).

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

   student a;
   student b;
   student c;

   student[] Students;
   /*
   1. 1, Alice, 90 -> setA()
   2. 2, Bob, 75 -> setB()
   3. 3. Charlie, 85 -> setC()
   */

   // 학생 정보 중 번호, 이름, 점수만 입력하면 학점은 자동 계산해 주는 함수
   // 점수가 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);
   }

   function setB(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';
      }

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

   function setC(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';
      }

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

   function getStudentsABC() public view returns(student memory, student memory, student memory) {
      return (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 getStudents2(uint _number, string memory _name, uint _score) public {
      Students.push(student(_number, _name, _score, setGrade(_score)));
   }

   function getStudents() public view returns(student[] memory) {
      return Students;
   }

   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';
      }
   }
}

  • 인풋값 4개가 필요한데 3개만 넣고 나머지 하나는 자동으로 만들어지도록 하는 코드를 만들어 보려고 함.

  • 썼다가 날릴것이기 때문에 string memory _creadit;을 지역변수 밖에 작성해준다.

  • output값이 없기 때문에 return을 쓰지않고, _creadit을 써준다.

  • 마찬가지로 setB, setC도 만들어준다.


  • student Array에 학생 정보를 넣어주기 위해 push를 사용해 준다.

  • 위 코드처럼 작성하면 보다 깔끔하게 정리할 수 있다.
    • 다른 함수(setGrade(_score)) 를 변수들과 섞어서 쓸 수 있는것을 알 수 있다.
    • 중요한거 변수들과 섞은 함수 안에 input값을 잘 적어야 한다.
    • 이렇게 정리하면 위에 setA,B,C의 내용을 싹 다 없앨 수 있다.

  • 위 코드에 변수들과 섞이면서 사용이 가능하다.






💻If문 응용2(or, and).

//조건이 2개인 경우의 If문.
contract IF2 {

   // 50 이상이거나 10보다 작으면 -> or
   // 50 이상이고, 3의 배수이면 -> and ("3의배수는 3으로 나눴을때 0이다." 로 표현하면됨)
   
   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";
      }
   }
}
  • or = 둘 중 하나만 성립해도 된다.(이거 또는 이거)

    • 또는 " || " 이렇게 표현.
  • and = 둘 다 성립해야 된다.(이거 그리고 이거)

    • 그리고 " && " 이렇게 표현.
  • "_n%3==0 "= 3의배수는 3으로 나눴을때 0이다.라고 표현하면 된다.

  • 여기서 기존 코드에 아쉬운 부분이 있었는데 if문 첫번째 부분에 _n>=50 으로 작성되어 있었음.

    • B가 나오지 못하는 조건으로 되어있는데 그 이유는 50이상이면 3의 배수여도 A가 나오게 되기 때문이다.
    • 범위가 겹치면 뒤에 오는 부분이 뭉그러지기 때문에 이렇게 작성을 하면 안되어 첫번째 if문의 조건을 70으로 변경.






💻ENUM(기초, 형변환).

// ENUM = 열거형 
contract ENUM {
    // enum 변수명 안에 새로운 상태를 넣는것은 힘듦.
   enum Food { //enum 변수명 {변수1, 변수2, 변수3, 변수4}
      Chicken, 
      Suish, 
      Bread, 
      Coconut
   }

   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);
   }

   //uint8과 형변환 가능
   function getABC2() public view returns(uint8, uint8, uint8) {
      return (uint8(a),uint8(b),uint8(c));
   }
}
  • 자동차로 ENUM에 대한 강사님의 비유.

    • 시동이 꺼져있는 상태.
    • 시동은 켜져있는데 정지한 상태.
    • 시동이 켜져있고 운전중인 상태.
  • 위 내용을 바탕으로 나중에 펀딩 관련 프로젝트를 만들게 된다고 가정했을 때

    • 등록된 상태.
    • 투표중인 상태.
    • 안건이 통과된 상태.
    • 안건이 거절된 상태.
    • 자료형의 상태가 지속적으로 변화할 때, 그리고 그 상태를 알아봐야 할 때.
      이런 상황에 ENUM형을 사용한다.
  • 또 다른 예시로 게임케릭터가 있다고 가정했을 때 케릭터가 무기나 장신구를 착용할 수 있다고 하면 상황에 따라 무기나 장신구를 바꿀 수 있는데 바뀌는 과정을 참고할 수 있도록 할 때 ENUM형 사용.

  • 변수 안에 값을 넣어주고 싶을때 " 변수명.변수; " 를 입력해준다.

    • 예시) a = Food.Chicken;
  • uint8은 16진수 기준 2자리.

    • 16진수 2자리이기 때문에 0~255까지 사용가능함. 그래서 ENUM 같은 경우, 총 256가지 상황을 부여할 수 있음.
    • 원칙적으로 상수의 세트이기 때문에 상태값을 반환받았을 때 Deploy에 uint8 형태로 나오게 됨.
    • 필요에 따라 uint8로 형변환하여 사용도 가능.
  • ENUM은 문자가 들어가서 숫자로 나온다.

    • 이 말은 우리가 변수를 관리하는데 있어서 편하다.






💻ENUM(uint를 input값으로).

contract ENUM2 {
   enum color {
      red, // 0으로 저장
      yellow, //1로 저장
      green,
      blue,
      purple,
      rainbow
   }

   color c; 

   function setC() public {
     c = color.red; 
   }

   function setC2(uint _n) public {
      c = color(_n);
   }

   function getC() public view returns(color) {
      return c;
   }
}
  • ENUM은 숫자형(uint)으로 관리된다.
    • uint를 input값에 넣어 이 아이의 색상을 결정할 수 있다.
    • 번호로서도 값을 부여할 수 있다.






💻ENUM(조건문과 응용).

contract ENUM3 {
   enum Status {
      neutral,
      high,
      low
   }
   Status st;

   uint a=5;

   function higher() public {
      a++;
      setA();
   }

   function lower() public {
      a--;
      setA();
   }

   function setA() public {
      if(a >= 7) {
         st = Status.high;
      } else if(a<= 3) {
         st = Status.low;
      } else {
         st = Status.neutral;
      }
   }

   function getA() public view returns(uint) {
      return a;
   }

   function getST() public view returns(Status) {
      return st;
   }
}
  • 하나는 값을 올리고 하나는 값을 내린다는 기준으로 시작.

    • 특정한 값을 넣으면 high인 상태로 특정한 값보다 낮으면 low 상태로 만든다.

    • neutral 상태

    • high 상태

    • low 상태

  • array 같은 경우, 우리가 필요한 것들을 한곳에 모아뒀다가 해체도 시키는것이 array의 역할.
  • ENUM 같은 경우, 기존에 변하지 않는 규칙을 설정해놓고 그 규칙에 따라서 상태를 변화시켜줘야 할때 사용.






💻Bool.

contract BOOL {
    bool isFun;

    function getVar() public view returns(bool) {
        return isFun;
    } 

    function Fun() public {
        isFun = true;
    }

    function notFun() public {
        isFun = false;
    }

    function funtoNotFunToFun() public {
        isFun = !isFun;
    }

    function Fun(bool _a) public {
        isFun = _a;
    }
}
  • BOOL- 기냐 아니냐.(true or false로만 관리됨.)

  • 기본적으로 아무 값이 없을때는 false가 뜬다.

  • 둘 중 하나 뭔가 값이 들어가면 일단 true가 뜬다.






🤓 Small Talk.

  • 피드백에 대한 이야기.
      1. 휴식시간 지키기
      1. 블록체인 관련 정보 알려주시기로 하심.
  • 개인적으로 만들고싶은 프로젝트나 어플에 대해 어떻게 접근해야 하는지 알려주심.
    • 내가 어떤 주제에 대해서 하고 싶다면 가장 먼저 해야하는것은 현실세계에서 비슷한 아이디어가 무엇이 있나 생각해보고 재정의를 해보는게 중요함.
    • 비슷한 케이스가 있다면 내 아이디어와 비교해 보는게 좋다.
    • https://files.insurace.io/public/InsurAceWhitepaper_v2.4.pdf






🌜하루를 마치며..

오늘은 4시부터 새로운 아기사자를 했다. 새로운 아기사자의 멘토님은 지난번과 똑같이 은찬매니저님이 해주셨다! 내일 우리가 테스트가 있기 때문에 한시간은 서로 이런저런 이야기도 하고 한시간은 테스트를 위해 모의고사를 해주셨다. 생각보다 막상 혼자 할때랑 다르게 허둥지둥하게 되고 풀지 못하는 부분들도 있어서 많이 당황스러웠다. 역시 계속적으로 반복하는게 필요할 것 같다.

profile
개발자가 되어가는 개린이"

0개의 댓글