데이터타입에 대해 공부해보겠다.
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 키워드 사용하여 선언, 외부 계정에서 접근 가능
'전공공부 > 블록체인공학' 카테고리의 다른 글
Solidity 함수의 입력 매개변수와 반환값 (0) | 2021.11.11 |
---|---|
Solidity 데이터타입과 연산자(3) (0) | 2021.11.05 |
Solidity 데이터타입과 연산자 (0) | 2021.11.04 |
Solidity개발(2) (0) | 2021.10.31 |
이더리움 - solidity개발 (0) | 2021.10.28 |
댓글