본문 바로가기
전공공부/블록체인공학

Solidity 데이터타입과 연산자(2)

by 으노으뇨 2021. 11. 5.
728x90
반응형
SMALL

데이터타입에 대해 공부해보겠다.

1. 정수

2. 소수

3. 주소


1. 정수

정의 : 정수형타입

부호가 있는 정수 : int8, int16. int24, ... int256

부호가 없는 정수 : uint8, uint16 ... uint256

8의 배수를 붙여 선언

- int, uint 사용시 int256, uint256을 선언한 것임(int, uint 에 다른것을 선언하지 않으면 기본값 256이 선언된것)

예제

pragema solidity ^0.4.18;
contract test{
function arith1() public pure returns (uint){
uint a = 1;
uint b = 2;
return a+b;
}
}

예제를 통해 스마트컨트랙트를 만들어보았다. 아리쓰1이라는 힘수를 선언했고, 리턴값으로 유인트로 만들었다

그리고 유인트 에이에 1, 비에 2를 넣어주고, 리턴 +로 리턴을 해주었더니 위의 사진처럼 유인트 256 : 3이라는 값을 얻었다.

따로 유인트뒤에 수를 입력하지않았는데도 unit256이 붙는것이다.

예제 2.

pragema solidity ^0.4.18;
contract test{
function arith1() public pure returns (uint){
uint a = 10;
uint b = 2;
return a-b;
}
}

똑같이 uint : 8 (10-2)를 얻었다

예제 3.

pragema solidity ^0.4.18;
contract test{
function arith1() public pure returns (uint){
uint a = 10;
uint b = 2;
return a*b;
}
}

예제 4.

pragema solidity ^0.4.18;
contract test{
function arith1() public pure returns (uint){
uint a = 10;
uint b = 2;
return a/b;
}
}

나누기도 리턴값이 uint256으로 받는다. 


2. 소수(실수 타입)

정의 : 소수점이 있는 수

 - 선언은 할 수 있지만 완전히 지원되지 않기 때문에 값으로 할당하지 않음

- fixed, unfixed 타입이 있음

그러나 완전한 지원이 없으니 "값"으로 할당하지않는다.

예제를 통해 알아보자

예제 1.

pragma solidity ^0.4.18;
contract test{
function arith1() public pure returns (fixed){
fixed a = 3;
fixed b = 2;
return a * b;
}
}

지금 픽스트를 해서 컴파일을 해보려했다. 그러나 컴파일이 안된다.

픽스트 포인트 타입이 지원되지 않는다고 한다.


주소

정의 : adress 사용

멤버함수

총 20바이트 사용

balance 계정 주소에 있는 이더를 wei로 리턴
transfer  계정 주소에 있는 이더 송금
send 계정 주소의 이더를 송금, 만일 송금이 실패하면 false로 리턴
call call 계정 주소의 이더를 송금, 만일 송금이 실패하면 false 리턴, gas양을 조정할 수 있음
delegatecall 다른 계약을 호출하는 메서드

내장되어있는 것으로 주소 송금을하던가 리턴값을 얻을 수 있다.

adress 주소를 이용한 예제 1.

//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.6.10;

contract Adress {

    function () payable public {
    }

    function getBalance(address _t) public view returns (uint) {
        if (_t == address(0)) {
            _t = this;
        }
        return _t.balance / 100000000000000000000;
    }

    function transfer(address _to, uint _amount) public {
        _to.transfer(_amount);
    }

    function send(address _to, uint _amount) public {
        if (!_to.send(_amount)) {
            revert();
        }
    }
}

최초 어드레스 타입 _t를 이용하며, 트랜스퍼와, 센드 메서드를 이용하는것이다.


3. 바이트

바이트

정의 : 바이트 배열 타입으로 문자열 저장에 주로 사용

bytes1, bytes2, ... bytes32 까지 사용 가능
byte 선언 시 bytes1 선언과 같음, 기본값은 1이니, 더 큰것을 원하면 크기를 선언해주면 된다.
bytes, string 으로 동적 크기의 바이트 배열 선언 가능

예제

//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.6.10;

contract Bytetype {

//bytes8는 8파이트
    function tmp() public pure returns (bytes8) {
        bytes8  b= "hi";
        return b;
    }

//bytes는 동적 크기의 바이트 배열
    function tmp2() public pure returns (bytes) {
        bytes memory a = 'hi';
        return a;
    }
}

첫번째는 리턴값을 선언해주었다. 바이트8이라고, 그런데 바이트메모리에 a = 'hi'를 해주었고, 리턴되는 타입이 서로 다르다.

b는 문자열 hi로 지정한것이고, a는 메모리에 저장될 수 있도록 (휘발성으로 저장하도록) 저장시켰다.

그래서 컴파일을 했더니

값을 얻었다. 똑같은 hi값이여도 서로 다른 바이트가 나온다. 정도까지만 알면된다.

 


논리

정의 : 논리 타입의 true와 false의 값 저장

bool 사용 

&& : 논리적 AND

|| : 논리적 OR

! : 논리적 NOT (반하다)

예제

//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.6.10;

contract Logic {
    address payable creator;

    constructor () public {
        creator = msg.sender;
    }

    // TODO Add functions
    function kill() public {
        if (msg.sender == creator) {
            selfdestruct(creator);
        }
    }

    function tmp1() public pure returns(bool) {
        bool a = true;
        bool b = false;
        return a || b;
    }

    // a가 false이므로 b의 값과 상관없이 false를 리턴한다.
    function tmp3() public pure returns (bool) {
        bool a = false;
        bool b = true;
        return a && b;
    }

}

tmp함수는 public = 외부계정에서 접근가능 

퓨어니까 지역변수만 사용가능

리턴값은 논리값

지역번수 선언 2개하고

반환값의 논리를 통해 해당 결과를 반환하는 식이다. (true , false 값)


열거

정의 : 사용자가 정의함, 타입을 만드는 방법이다.

enum을 사용한다.

리턴값은 uint8 / uint16으로 자동 저장됨 =  정수로 저장됨

예제

//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.6.10;

contract Enum {
    address payable creator;

    constructor () public {
        creator = msg.sender;
    }

    // TODO Add functions
    function kill() public {
        if (msg.sender == creator) {
            selfdestruct(creator);
        }
    }

    enum F {
        apple,
        orange,
        mango,
        pear
    }
    F f;
    F constant defalutF =F.apple;

    function setF() public {
        f = F.mango;
    }

    function getF() public view returns(F) {
        return f;
    }

    function getF2() public pure returns (uint) {
        return uint(defalutF);
    }
}

F라는 이넘을 생성했고, 이넘 타입 defaultF에 F.apple 를 넣어주었다.

그리고 setF()에는 망고를 넣었다.

이제 컴파일을 할때 setF주황버튼을 눌러 해당 메서드가 작동하게된다음 getF값을 불러오면 2를 얻는다.

getF함수에서 리턴f를 했을때, setF() 를 통해 f엔 F.mango 값이 들어갔으니 출력은 망고가있는 위치인 2가 출력된다.

그런데 getF2()는 F.apple값이 들어간 defaultF를 출력하기에 0을 출력한다.


함수

정의 : 처리할 내용을 모듈단위로 함수 처리가능

- 정말중요한 내용인것이, 산수의 연산 뿐만아니라 스마트컨트랙트를 이용해서 기본적으로 거래 성사를 시키려고 한다면 함수가 반드시 필요하기 때문이다!!

내부함수 타입과 외부함수 타입으로 구분

내부함수 : internal 키워드 사용하여 선언

외부함수 : public 키워드 사용하여 선언, 외부 계정에서 접근 가능

 

728x90
반응형
LIST

댓글