본문 바로가기
개발하자/Solidity

solidity - 1. 데이터 타입

by ulqaef 2022. 11. 19.
728x90

solidity는 컴파일 시에 데이터 타입이 결정돼야 하는 정적타입의 언어이다.

(다른 정적타입언어에는 c, c++, java 같은 것들이 있으며 동적타입언어에는 python, javascript, ruby와 같은 것들이 있다.)

그리고 solidity에는 "undefined", "null"과 같은 개념은 존재하지 않고 데이터 타입에 따라 기본값으로 초기화가 된다고 한다.

The concept of “undefined” or “null” values does not exist in Solidity, but newly declared variables always have a default value dependent on its type. 
[참고] solidity 공식 문서 (https://docs.soliditylang.org/en/v0.8.17/types.html)

데이터 타입은 Value Type, Refernce Type, Mapping Type이 있다.

 Value Type

- value type은 변수가 전달될 때 값(value)가 전달되기 때문에 value type이라고도 불린다.
- 해당 변수가 인자로 넘어갈 때는 값(value)이 복사된다.

  1. Booleans
    - true / false 
    - 논리연산자 
    1) NOT : !
    2) AND: && 
    3) OR: ||
    4) 같음: ==
    5) 같지 않음: !=
    * &&(and), ||(or)에는 short-circuiting rules이 적용된다. a || b 연산 시 a 가 true인 경우 b의 값을 확인하지 않고 이에 따른 부작용이 발생할 수 있음을 의미.

  2. 정수
    - int(부호가 있는 정수): int8 ~ int256
    - uint(부호가 없는 정수) : uint8 ~ uint256
    - 두 종류 모두 8~256까지 8비트 단위로 키워드가 존재한다.(int, uint는 int256, uint256의 alias)
    - 비교연산(<=, <, ==, !=, >=, >)
    - 비트연산(&, |, ^, ~)
    - 산술연산(+, -, ++, --, +-*/, **, <<, >>) 모두 가능

  3. Address
    - 20bytes 사이즈의 이더리움 address를 저장.
    - transfer함수를 통해 address 변수에 저장된 주소로 ether를 전송할 수 있음.

  4. 고정크기 Bytes
    - bytes1, bytes2, bytes3, ... bytes32의 총 32개 키워드가 존재.
    - 바이트 변수의 사이즈를 미리 결정하여 값을 할당할 수 있다.

  5. 동적크기 Bytes
    - bytes: 임의 길이의 바이트 데이터의 경우 사용, 
    만약 데이터의 길이를 특정 바이트만큼 제한할 수 있다면 고정크기 bytes 값을 사용하는 것을 권장한다
    (공간을 더 절약할 수 있음, 스마트컨트랙트에서 공간절약은 비용절약으로 이어진다)

  6.  문자열
    - 작은따옴표(') 또는 큰따옴표(")로 작성 (ex. "hello solidity", 'hi.') 
    - escape character지원
    1) \n: 줄바꿈
    2) \\ : 백슬래시
    3) \' : 작은 따옴표
    4) \" : 큰 따옴표
    5) \t : 탭

 Reference Type

- 레퍼런스 타입의 변수를 복사하는 것은 비용이 많이 소모된다. 그렇기 때문에 메모리와 스토리지 중 어디에 저장해야 하는지 신중히 결정해야 한다.

1. 데이터 위치(Data Location)

- 변수를 어느 공간에 저장할지를 지정해주어야 한다.

1) Memory
- 함수의 매개변수, 리턴값의 기본값은 메모리이다.
2) Storage
- 모든 지역변수의 기본값은 스토리지에 저장되며 상태변수의 위치는 스토리지로 강제되어 있다.

pragma solidity >= 0.8.0;

contract Example {

	uint256 public a; // STORAGE data
    
	// parameter and return value of function is located MEMORY
	function speak(string memory sents) public returns(string memory) {
		// something to speak
	}
}

2. 배열(Array)

- 배열은 컴파일 시에 고정된 크기를 가질 수도 있고 동적인 크기를 가질 수도 있다.
- 타입을 지정해주고 그 크기를 미리 고정할 수 있다.(ex, uint256[5] arr;)
- 멤버함수 length, push, pop, delete 가능

pragma solidity >= 0.8.0;
contract Ex {
	// 아래와 같이 배열의 크기를 고정할 수 있다
	uint256[3] public arr; 
	uint256[] public fixedArr = ["South Korea", "USA", "Japan"];
    
	// 컴파일 시에 배열의 크기를 결정하는 것이 아니라 런타임 시에 동적으로 크기를 결정
	uint256[] public country; 
	function push_to_arr(uint256 ) puvarblic {
		country.push(var);     // push를 통해서 country 배열에 값을 넣어준다.
        country.pop();         // pop을 통해서 가장 마지막 인덱스의 값을 꺼낸다, 배열의 길이도 하나 줄어든다.
        delete country[_index] // delete를 통해 원하는 인덱스의 값을 지울 수 있다, pop과는 다르게 길이는 줄지 않고 기존 값을 비워만 둔다. 
	}
}

( string과 bytes의 length는 현재 지원하지 않음 )
- 리믹스에서 아래와 같이 에러가 나는 것을 확인하였다.

bytes변수의 길이를 구하려 하자 TypeError 발생
문자열의 길이를 구하려 하자 Type Error 발생.

3. 구조체(Struct)

구조체를 통해 새로운 타입을 정의할 수 있다.

pragma solidity >= 0.8.0;

contract Ex {
	struct Character {
		string name;
		uint256 age;
		string job;
	}
    
	mapping (uint256 => Character) public characters;
    
	function newCharacter(string memory _name, uint256 _age, string memory _job) public returns (Character memory) {
		return Character(_name, _age, _job);
	}
    
	function createCharacter(uint256 _key, string memory _name, uint256 _age, string memory _job) public {
		characters[_key] = newCharacter(_name, _age, _job);
	}
    
    ...
}

- 구조체는 매핑과 배열 내에서 사용될 수 있다
위의 코드에서 mapping 타입으로 선언된 characters라는 변수에는 uint256타입의 키와 Character라는 구조체변수의 값이 들어가고 있다.

4. 매핑(Mapping) 

- mapping (keyType => valueType) someMapping; 형태로 선언.

- keyType에는 매핑, 동적크기배열, 컨트랙트, 열거, 구조체를 제외한 거의 모든 타입 지정 가능

- valueType에는 매핑 타입을 포함하여 모든 타입 지정 가능

- 매핑은 길이의 개념이 없으므로 length 멤버함수 또한 없음.

pragma solidity >= 0.8.0;

contract Ex {

	// uint256 타입의 키와 string 타입의 값을 가지는 매핑변수 선언 
	mapping(uint256 => string) public country;

	// 매핑변수의 키의 타입인 uint256타입의 _key라는 변수를 파라미터로 받고 
	// 해당 키값과 매핑되어 있는 값을 반환한다.
	// 이때 반환하는 값의 타입은 string이다.
	function getCountry(uint256 _key) public returns(string memory) {
		country[_key];	
	}
}

 

728x90
반응형

'개발하자 > Solidity' 카테고리의 다른 글

solidity 0 - 시작하며  (0) 2022.11.19

댓글


`