TIL) Solidity 기본 문법: 변수 및 데이터 타입, 함수
#변수의 종류
- 상태변수: 컨트랙트 저장소에 영구적으로 저장되는 변수. 보통 컨트랙트 최상위 단에 선언
- 지역변수: 함수가 실행될 때까지만 존재하는 변수. 기본적으로 스토리지에 저장되지만, 레퍼런스 타입일 경우 재정의 가능
- 전역변수: 블록체인 안에서 모두 접근가능하며, 미리 정의되어 있는 특수 변수. block, msg, tx, this 등
#데이터 타입
- value type: bool, uint, int, address, byte, enum
- reference type: struct, arrays, string, mapping
#value type - 주소(address)
- address와 address payable로 나뉨
- address payable: address에 추가 멤버인 transfer, send를 가짐. 0.8버전부터 address는 송금이 불가능하기 때문에 address payable 형식으로 바꿔줘야 함
address payable p_addr1 = payable(addr1)
#value type - 바이트(byte)
- 고정크기 배열
byte3 alphabets = 'abc'
alphabets[0] // 'a'
#value type - 열거형(enum)
- 특정 값들의 집합형으로 각 집합의 데이터는 0부터 1씩 올라가는 정수
enum evalLevel { bad, soso, great}
evalLevel.bad // 0
#참조형 데이터 타입(reference type, 참조형 변수)
- 배열처럼 연속되어 저장되는 값의 첫번째 메모리 주소를 값으로 가지는 변수 타입
#참조형 데이터 타입 - 매핑(mapping)
- 스토리지 데이터 영역에 키-값 구조로 데이터를 저장할 때 사용
mapping(키 형식 => 값 형식) 변수명
mapping(address => int) public userAddress;
#데이터 저장 영역
- 메모리: 프로그램이 동작하는 동안에만 값을 기억하고 종료되면 값을 잃는 데이터 영역
- 스토리지: 블록체인에 기록되어 영구적으로 값이 유지되는 데이터 영역
- calldata: 메모리와 비슷하지만 수정 불가능하고 비영구적인 데이터 영역
*상태변수는 무조건 스토리지에 저장되며, 참조형 변수를 선언할 때는 메모리/스토리지 중 어디에 저장할지 명시해야 함.
#함수의 형태
function () {internal | external | public | private} [pure | constant | view | payable] [(modifiers)] [returns ()]</return types></parameter types>
- Visibility Keyword (internal, external, public, private)
1) internal: 계약서의 내부에서만 사용하는 함수라는 것을 표시합니다. 상태변수(state variable)는 internal이 기본값입니다. 아무것도 적용하지 않았다면 자동적으로 internal입니다. 계약서 자신과 상속받은 계약서만 사용 할 수 있습니다.
2) external: external: external은 Smart contract의 interface로 공개한다 입니다. 계약서(Contract)의 해당 내용을 공개한다는 의미이며, 계약서의 외부에서 사용하는 함수라는 것을 표시합니다. 상태변수(state variable)는 external일수 없습니다. 계약서 내부에서 사용할 경우 this를 사용해서 접근해야 합니다.
3) public: 공개 기능은 계약 인터페이스의 일부이며 내부적으로 또는 메시지를 통해 호출할 수 있습니다. 공개 상태 변수의 경우 자동 getter 함수가 생성됩니다.
4) private: 비공개함수는 계약서 내부에서도 자신만 사용하는 함수라는것을 표시합니다. 상태변수와 함수 모두 파생된 계약이 아닌 정의된 계약에서만 볼 수 있습니다. 상속받은 계약에서도 사용할 수 없음.
- 함수의 동작과 관련된 키워드
1) pure: storage에서 변수를 읽어오거나 쓰지 않는 함수임
2) constant, view: 상태를 변경하지 않는 함수임을 명시
3) payable: 입금을 받을 수 있는 함수