상태변수는 이더리움 블록체인에 기록되는 변수로 컨트랙트 저장소에 영구적으로 저장됩니다.
다른 프로그래밍 언어의 변수 선언과 비슷합니다.
여기서는 간단하게 uint, int에 대해 배워보겠습니다.
contract HelloWorld{
uint variable = 100;
}
uint 자료형은 부호 없는 정수로, 저장되는 값이 음수가 사용되지 않을 때 사용합니다.
u : unsigned
contract HelloWorld{
int variable = -100;
}
int 자료형은 부호 있는 정수로, 저장되는 값이 음수도 사용될 경우 사용합니다.
또한 모든 변수는 모두 기본값이 있습니다.
그리하여 JavaScript나 다른 언어에서 만나볼 수 있는 null, undefined 값을 만나볼 수 없습니다.
ex)
contract Temp{
uint256 public temp; // 기본 값은 0 입니다.
}
솔리디티에는 uint, int 뒤에 숫자를 명시하여 더 적은 비트로 선언할 수도 있습니다.
uint256 : 256비트 부호 없는 정수
uint32 : 32비트 부호 없는 정수
uint16 : 16비트 부호 없는 정수
uint8 : 8비트 부호 없는 정수
기본적으로 uint 이외에 기본 하위 타입들을 쓰는 것은 아무런 이득이 없습니다. 솔리디티에서는 uint의 크기에 상관없이 256비트의 저장 공간을 미리 잡아두기 때문입니다.
하지만 구조체(struct)에서는 이야기가 다릅니다.
솔리디티는 구조체내에서 더 적은 공간을 차지하도록 압축합니다. 이런 이유로 구조체 안에서는 가능한 작은 크기의 정수 타입을 쓰는 것이 좋습니다.
또한 동일한 데이터 타입은 타입별로 하나로 묶어두는 것이 좋습니다.
구조체에서 서로 옆에 있도록 선언하면 솔리디티에서 사용하는 저장공간을 최소화합니다.
예를 들어 아래 구조체를
uint a;
uint32 b;
uint32 c;
이런 식으로 작성한다면 가스를 더 소비합니다.
uint32 a;
uint b;
uint32 c;
위 예시의 경우 uint32 구조체끼리 묶여있기 때문에 저장 공간을 낭비하지 않습니다.