💡솔리디티 기본 문법 - 변수
✓ 데이터 저장 위치
보통의 프로그래밍 언어라면 변수는 스택, 힙 등 메모리에 저장되는 것이 기본이다. 하지만 솔리디티 변수를 메모리뿐만이 아니라 하드 디스크 등과 같은 스토리지에 저장하기도 한다. 또한, calldata 라는 영역에 저장하기도 하는데, 여기에는 함수 인자가 저장된다. calldata 역시 메모리처럼 동작하지만 수정 불가능하고 비영구적인 영역이다.
* 솔리디티의 제이터 저장 위치
1) 메모리
2) 스토리지
3) calldata
* 강제 데이터 위치
1) 외부 함수의 매개변수(반한 값 포함) : 메모리
2) 상태 변수 : 스토리지
* 기본 데이터 위치
1) 함수의 매개변수(반환 값 포함) : 메모리
2) 모든 지역 변수: 스토리지
✓ 변수의 종류
솔리디티에서 변수는 크게 상태변수, 지역변수, 전역변수로 나누어진다. 상태변수와 지역변수는 일반적인 프로그래밍언어에서의 변수를 생각하면 된다. 이들의 선언 및 초기화 방식은 아래와 같다.
{데이터타입} {변수명}; // 변수명으로 선언
{데이터타입} {변수명} = {초기화할 값}; // 선언 및 초기화
전역변수는 우리가 일반적으로 아는 다른 언어의 전역변수와는 다르다. 솔리디티만의 특수한 변수 (또는 함수)로써 주로 블록체인에 관한 정보를 제공한다. 전역변수는 따로 선언이나 초기화 없이 불러와서 사용한다.
✓ 상태 변수
상태변수란 컨트랙트 저장소(이더리움 블록체인)에 영구적으로 저장되는 변수를 말한다. 즉, 항상 스토리에 저장된다. 보통 컨트랙트 최상단 위에 선언한다.
pragma solidity ^0.8.14;
contract SimpleStorage {
uint storedData; // 상태변수 선언
uint storedData2 = 20; // 상태변수 선언 및 초기화
}
✓ 상태 변수 접근 수준
컨트랙트 내의 상태(state) 변수를 선언할 때는 지정할 수 있는 접근 수준을 함께 표기한다. 접근 수준은 public, internal, private, constant/immutable 네 가지로 나뉜다.
internal (default)
- 상태 변수에 기본적으로 사용
- 컨트랙트 및 해당 컨트랙트를 상속받은 컨트랙트만 접근 가능
- 외부에서 액세스 불가능
public :
- 컴파일러가 자동으로 getter 함수를 생성해줌
- 컨트랙트 내에서 직접 퍼블릭 상태 변수를 사용 가능
- 외부 컨트랙트나 클라이언트 코드에서도 getter 함수를 통해 퍼블릭 상태 변수에 접근 간으
private :
- 동일한 컨트랙트 멤버만 프라이빗 상태 변수에 접근 가능
constant / immutable :
- 선언될 때 값을 할당해야 함
- 상수화 = 변경 불가능
✓ 전역변수
전역변수란 글로벌한 블록체인 안에 있는 특수 변수를 말한다. 블록체인 및 트랜잭션에 대한 속성을 가지고 올 수 있다.
function f(uint start, uint daysAfter) public {
if (block.timestamp >= start + daysAfter * 1 days) {
// 여기서 block.timestamp는 전역변수
}
}
blcok: 블록에 대한 정보를 가지고 있다.
msg: 컨트랙트를 시작한 트랜잭션 콜이나 메시지 콜에 대한 정보를 가지고 있다.
tx: 트랜잭션 데이터를 가지고 있다.
This: 현재 컨트랙트를 참조한다. 현재 컨트랙트 주소로 암시적으로 변환이 된다.
전역변수 | 데이터 형식 | 설명 |
blockhash(unit blockNumber) | byte32 | 주어진 블록의 해시를 반환. bytes32 형식. |
block.basefee | unit | 현재 블록의 기본 수수료. unit 형식. |
block.chainid | unit | 현재 블록의 체인 ID. unit 형식. |
block.coinbase | address payable | 현재 블록의 채굴자 주소. address 형식. |
block.difficulty | unit | 현재 블록의 난이도. unit 형식. |
block.gaslimit | unit | 현재 블록의 가스 한도. unit 형식. |
block.number | unit | 현재 블록의 번호. unit 형식. |
block.timestamp | unit | 현재 블록의 유닉스 타임스탬프. unit 형식. |
gasleft() | unit256 | 남아있는 가스의 양을 반환. unit256 형식. |
msg.data | bytes calldata | 전체 콜데이터 본문. bytes 형식. |
msg.sender | address | 현재 호출을 수행하고 있는 메시지 발신자. address 형식. |
msg.sig | bytes4 | 호출 데이터의 첫 4바이트(함수 식별자). bytes4 형식. |
msg.value | unit | 메시지와 함께 보낸 이더(Wei) 금액. unit 형식 |
tx.gasprice | unit | 트랜잭션 가스 비용. unit 형식 |
tx.origin | address | 트랜잭션 발신자. address 형식. |
'블록체인 > WEB3 개발' 카테고리의 다른 글
솔리디티 기본 문법 - 함수 제어자 (0) | 2022.07.08 |
---|---|
솔리디티 기본 문법 - 함수 (0) | 2022.07.08 |
솔리디티 기본 문법 - 연산자 (0) | 2022.07.08 |
솔리디티 기본문법 - 자료형 (0) | 2022.07.08 |
솔리디티란? (0) | 2022.07.08 |
댓글