[Ethereum] Solidity 문법 이해(2)

구조체

  • 함수 외부에서 구조체 메소드 명시: 스토리지 저장
  • 함수 내부에서 구조체 메소드 명시: 메모리 저장
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
contract sample {
struct myStruct {
bool myBool;
string myString;
}
// s1은 메모리에 있다. (구조체 메소드 명시 x)
myString s1;

// 스토리지에 인스턴스 저장
myStruct s2 = myStruct(true, "");
function sample(bool initBool, stirng initString) {
// 메모리에 인스턴스 저장
s1 = myStruct(initBool, initString);
mySturct memory s3 = myStruct(initBool, initString);
}
}

열거형

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
contract sample {
enum OS { windows, Linux, OSX, UNIX }

OS choice;

function sample(OS chosen) {
choice = chosen;
}

function setLinuxOS() {
choice OS.Linux;
}

function getChoice() returns (OS chosenOS) {
return choice;
}
}

매핑

스토리지에만 사용할 수 있기 때문에 오직 상태 변수로만 선언된다. 매핑은 키-값의 쌍으로 이루어진 해시 테이블이다. 키는 실제로 저장되지 않고, 키의 keccak256 해시 값이 검색에 사용된다. 매핑은 길이를 가지지 않으며, 다른 매핑에 할당될 수 없다.

1
2
3
4
5
6
7
8
9
10
contract sample {
mapping (int => string) myMap;

function sample(int key, string value) {
myMap[key] = value;

// myMap2는 myMap의 참조다
mapping(int => string) myMap2 = myMap;
}
}

delete 연산자

delete는 어떤 변수라도 기본값으로 재설정하기 위해 사용될 수 있다.

동적 배열에 delete를 적용하면 모든 요소가 지워지고 길이가 0이 된다. 정적 배열에 적용하면 모든 인덱스가 재설정된다. 물론 특정 인덱스에만 적용하는 것도 가능하다.

맵에 delete를 적용하면 아무 일도 발생하지 않지만, 맵의 key에 delete를 적용하면 키와 연관된 값이 삭제된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
contract sample {
struct Struct {
mapping (int => string) myMap;
int myNumber;
}

int[] myArray;
Struct myStruct;

// 생성자
function sample(int key, int value, int number, int[] array) {
myStruct = Struct(number);
myStruct.myMap[key] = value;
myArray = array;
}

function reset() {
delete myArray;
// myNumber는 0이나 myMap은 그대로
delete myStruct;
}

function deleteKey(int key) {
// 여기에서 myMap의 key 삭제
delete myStruct.myMap[key];
}
}


이 포스트의 모든 내용은 이더리움을 활용한 블록체인 프로젝트 구축(에이콘) 책을 참고하여 작성되었습니다.


Share