이전글
[솔리디티] 2. 리믹스 IDE
이전글 [솔리디티] 1. 솔리디티와 EVM 이전글 [솔리디티] 0. 들어가기 전에 앞으로 이어지는 솔리디티 글은 다음과 같은 내용이 미리 선행되어야 합니다. 1. 프로그래밍 기초: 기초적인 수준의 프로
kwjdnjs.tistory.com
자료형, 배열, 상수, 상태 변수
이번 글에서는 솔리디티에서 사용되는 기본적인 자료형, 배열, 상수 그리고 상태 변수의 의미에 대해 알아보겠습니다.
1. 자료형
솔리디티에서 사용되는 변수의 기본 자료형에는 크게 bool, int, uint, address, bytes, string 등이 있습니다.
bool은 boolean 자료형입니다. true와 false를 저장할 수 있습니다. 예시 코드는 다음과 같습니다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Hello {
bool a = true;
bool b = false;
}
int는 일반적인 정수형입니다. 일반적으로 솔리디티에서는 int를 사용할 때 int 뒤에 비트 단위의 크기를 붙입니다.
예를 들어 int8은 8비트 즉, 1바이트 크기의 정수형입니다. 8비트 단위로 자료형이 존재하며, 가장 큰 크기의 자료형은 32바이트 크기의 int256입니다.
uint는 unsigned int의 약자로, 0부터 양의 정수만을 갖는 정수형입니다. int와 마찬가지로 uint도 비트 단위의 크기를 붙여 사용합니다. 최대 크기는 32바이트 크기의 uint256입니다.
int와 uint모두 비트 단위의 크기를 붙이지 않을 경우 int256과 uint256으로 취급합니다.
예시 코드는 다음과 같습니다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Hello {
int8 a = -32;
uint16 b = 1000;
int c = -100000; //int256
uint d = 100000; //uint256
}
address는 20바이트 크기의 이더리움 주소를 저장할 수 있는 자료형입니다. 예시 코드는 다음과 같습니다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Hello {
address a = 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4;
}
실수형의 경우 현재 버전 솔리디티에서 지원하지 않습니다. 따라서 다른 프로그래밍 언어들과는 다르게 솔리디티에서는 일반적인 방식으로는 실수를 사용할 수 없습니다.
2. 배열
bytes와 string 자료형에 대해 알아보기 전에 먼저 배열에 대해 알아보겠습니다. 두 타입 모두 배열 형태의 자료형이기 때문입니다.
솔리디티에서 배열은 다음과 같이 선언할 수 있습니다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Hello {
uint8[] a = [1, 2];
uint8[2] b = [1, 2];
uint8 c = a[0];
}
빈 '[]'의 경우 동적 크기의 배열을 나타냅니다. 정해진 길이의 정적 배열을 선언할 경우 '[2]'처럼 배열의 크기를 입력합니다.
a[0] 처럼 index를 이용해 배열에 접근할 수 있습니다.
bytes 자료형은 bytes 크기의 명시 여부에 따라서 정적이나 동적으로 사용할 수 있습니다. bytes 뒤에 숫자를 붙이면 해당 크기의 bytes 값을 저장할 수 있습니다. 이 경우 크기가 정해진 정적 변수가 됩니다. 예를 들어 bytes2는 2바이트 크기의 값을 저장할 수 있는 자료형입니다.
예시 코드는 다음과 같습니다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Hello {
bytes1 a = 0x10;
bytes2 b = 0x1020;
bytes1 c = b[0];
}
정해지지 않은 크기의 바이트 값을 저장하려면 크기 명시 없이 bytes 만을 사용합니다. 예시 코드는 다음과 같습니다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Hello {
bytes a = "101020";
}
string은 문자열을 저장하기 위해 사용됩니다. 예시 코드는 다음과 같습니다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Hello {
string a = "aaaaaa";
}
bytes와 string 모두 문자열을 저장할 수 있습니다. 다만 bytes의 경우 bytes[0]처럼 인덱스로 접근할 수 있고, string의 경우 인덱스로 접근할 수 없습니다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Hello {
bytes a = "aaaaaa";
bytes1 b = a[0]; // 가능
string c = "aaaaaa";
string d = c[0]; // 불가능
}
3. 상수
다음과 같이 자료형 뒤에 constant를 붙이면 상수로 선언됩니다. 추가적으로 배열은 상수로 선언할 수 없습니다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Hello {
bytes constant A = "Hello";
string constant B = "Hello";
uint8 constant C = 32;
}
4. 상태 변수와 스토리지
지금까지 여러 종류의 자료형을 이용해 변수를 선언해봤습니다. 선언된 모든 변수는 함수 외부에 위치하여 선언되었습니다. 이렇게 함수 외부에서 선언되는 변수를 상태 변수라고 합니다.
모든 상태 변수는 블록체인 스토리지에 저장됩니다. 즉, 키-값 형태로 블록체인 스토리지에 영구적으로 저장됩니다.
아래 글에서 보다 자세한 내용을 확인할 수 있습니다.
[이더리움과 월드 컴퓨터] 2-4. 컨트랙트 계정
이전글 [이더리움과 월드 컴퓨터] 2-3. EVM 이전글 [이더리움과 월드 컴퓨터] 2-2. EOA 이전글 [이더리움과 월드 컴퓨터] 2-1. 주소 이전글 [이더리움과 월드 컴퓨터] 1-4. 스마트 컨트랙트와 댑(DApp) 이
kwjdnjs.tistory.com
5. 가시성과 게터(Getter)
마지막으로 가시성과 게터에 대해 알아보겠습니다. 솔리디티에서는 상태 변수에 가시성 지정자를 사용할 수 있습니다. 솔리디티에서 사용되는 상태 변수 가시성 지정자는 다음과 같습니다.
- public: 상태 변수를 내외부 모두에서 사용할 수 있습니다.
- internal: 현재 컨트랙트나 상속된 컨트랙트에서만 상태 변수를 사용할 수 있습니다.
- private: 현재 컨트랙트에서만 사용할 수 있습니다.
자료형 뒤에 가시성 지정자를 붙여 사용할 수 있습니다. 예시 코드는 다음과 같습니다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Hello {
string public a = "Hello World";
uint8 internal b = 32;
uint[] private c = [1, 2];
}
public으로 선언된 상태변수의 경우 자동적으로 게터 함수가 생성된다는 특징이 있습니다. 생성된 게터 함수를 이용하면 컨트랙트 외부에서도 해당 값을 쉽게 볼 수 있습니다. 아래와 같이 컨트랙트 배포 이후 Deployed Contracts에서 배포된 컨트랙트를 클릭하면 public으로 지정된 변수 a의 게터 함수 버튼이 활성화된 것을 확인할 수 있습니다. 해당 버튼을 클릭하면 변수 a에 현재 저장된 값을 볼 수 있습니다.
터미널에서도 결과를 확인할 수 있습니다.
추가적으로 게터 함수의 생성으로 ABI값이 더 이상 비어있지 않은 것을 확인할 수 있습니다.
[
{
"inputs": [],
"name": "a",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
}
]
지금까지 솔리디티에서 사용되는 자료형, 배열, 상수 그리고 상태 변수의 의미에 대해 알아봤습니다. 감사합니다.
다음글
[솔리디티] 4. 생성자, 매개변수, 값 타입과 참조 타입, immutable
이전글 [솔리디티] 3. 자료형, 배열, 상수, 상태 변수 이전글 [솔리디티] 2. 리믹스 IDE 이전글 [솔리디티] 1. 솔리디티와 EVM 이전글 [솔리디티] 0. 들어가기 전에 앞으로 이어지는 솔리디티 글은 다음
kwjdnjs.tistory.com
'이더리움 > 솔리디티' 카테고리의 다른 글
[솔리디티] 5. 연산자, 전역 변수, 단위 (0) | 2023.07.13 |
---|---|
[솔리디티] 4. 생성자, 매개변수, 값 타입과 참조 타입, immutable (0) | 2023.07.10 |
[솔리디티] 2. 리믹스 IDE (0) | 2023.07.06 |
[솔리디티] 1. 솔리디티와 EVM (0) | 2023.07.04 |
[솔리디티] 0. 들어가기 전에 (0) | 2023.07.04 |