모든 솔리디티 코드는 Version Pragma로 시작해야 하는데, Version Pragma는 우리의 코드가 이용해야 하는 솔리디티 버전을 선언하는 것이다. 아래와 같은 방법으로 사용하면 된다.
pragma solidity ^사용할 버전;
솔리디티의 버전을 선언하고나면 컨트랙트를 생성해야한다. 컨트랙트란 이더리움 애플리케이션의 기본적인 구성 요소로, 모든 함수와 변수는 어느 한 컨트랙트에 속한다고 말할 수 있다. 컨트랙트는 아래와 같은 방법으로 생성한다.
contract 컨트랙트의 이름 {
...
컨트랙트의 내용
컨트랙트의 내용
컨트랙트의 내용
...
}
pragma solidity ^0.4.19;
contract HelloWorld {
}
위 예시에서 우리는 솔리디티의 0.4.19 버전을 사용할 것이라고 선언했고, HelloWorld라는 이름의 빈 컨트랙트를 선언했다. 솔리디티로 코드를 작성할 때 내가 가장 먼저 작성하는 것은 항상 위의 형식이 될 것이다.
내가 초등학교 교사라고 해보자. 나는 자리 배치 프로그램을 만들기 위해 우리 반 학생들의 이름과 키를 변수에 저장해야 한다. 나는 아래와 같은 코드를 작성했다.
string name1 = "James"
string name2 = "Chales"
string name3 = "Alice"
int tall1 = 147
int tall2 = 151
int tall3 = 142
이렇게 코드를 작성했더니 각 학생의 이름과 키를 따로 관리해야했고 나는 상당한 번거로움을 느꼈다. 이를 해결하기 위해 웹서핑을 하던 나는 구조체를 알게 되었고, 코드를 아래와 같이 개선했다.
struct student {
string name;
uint tall;
}
student James = ("James", 147);
student Chales = ("Chales", 151);
student Alice = ("Alice", 142);
구조체 "student"에 학생들의 이름과 키를 한 번에 저장하니 이후에 변수를 관리하는 것이 아주 편리했다. 이와 같이 구조체는 연관이 있는 다양한 자료형의 여러 변수들을 하나로 묶어서 관리할 수 있게 만들어주는 기능이다. "여러개의 자료형을 하나로 묶어 만든 새로운 자료형"이라고 이해해도 될 것 같다.
구조체는 다음과 같은 방법으로 사용한다.
struct 구조체의 이름 {
자료형 변수이름;
자료형 변수이름;
...
}
구조체에 데이터를 저장할 때는 아래와 같이 한다.
구조체의이름 변수이름 = 구조체의이름(변수, 변수, ...);
struct friend {
string name;
int tall;
}
friend Kim = friend("KimBeomSu", 173);
friend Park1 = friend("ParkMoEon", 172);
friend Park2 = friend("ParkJeongGen", 165);
어떤 것의 모임이 필요할 때, 우리는 배열을 사용할 수 있다. 솔리디티에는 두 가지 종류의 배열이 존재한다.
배열은 아래와 같은 방법으로 사용한다.
자료형[원소의 개수] 배열의 이름;
정적 배열을 선언하려면 [ ] 안에 원소의 개수를 넣어주면 되고, 동적 배열을 선언하려면 [ ] 안을 비워두면 된다. 또한, 자료형 자리에 구조체의 이름을 적어주면 구조체 자체의 배열을 만들 수도 있다.
배열을 만들었으면 배열에 아래와 같은 방법으로 원소를 추가할 수 있다.
배열의 이름.push(원소);
int[5] numbers; // 정수를 최대 5개까지 담을 수 있는 numbers라는 이름의 정적 배열
string[] Hello; // 문자열을 원하는만큼 담을 수 있는 Hello라는 이름의 동적 배열
student[] students; // 위에서 만든 student 구조체를 원하는만큼 담을 수 있는 students라는 이름의 동적 배열
numbers.push(3);
numbers.push(10);
numbers.push(15);
numbers.push(1);
// numbers 배열은 [3, 10, 15, 1]이 되었다.
Hello.push("I LOVE YOU");
students.push(James); // 위에서 생성한 구조체 James를 배열에 추가했다.
students.push(student("Emma", 145)); // 이렇게 student 구조체를 생성함과 동시에 배열에 추가할 수도 있다.
솔리디티에서 함수 선언은 아래와 같은 방법으로 한다.
function 함수의 이름(자료형 _인자명, 자료형 _인자명, ... ) {
}
함수 인자명 앞에 언더바를 넣는 건 전역 변수와 구분하기 위한 관례일 뿐 필수적인 것은 아니다.
function addIntegers(uint _a, uint _b) {
uint result = _a + _b;
}
// addIntegers라는 함수를 선언했다. 이 함수는 두 개의 정수 a,b를 인자로 전달받는다.
addIntegers(3, 5); // 위 함수를 이렇게 호출할 수 있다.
함수에서 어떤 값을 반환받으려면 함수를 아래와 같이 선언한다.
function 함수의 이름(자료형 _인자명, ...) returns (자료형) {
return 변수명;
}
솔리디티에는 함수 제어자가 있다. 함수 제어자를 사용해 함수를 선언할 때는 아래와 같은 방법을 사용한다.
function 함수의 이름(자로형 _인자명, ...) 함수 제어자 {
}
레슨 1에서 배우는 함수 제어자에는 두 가지 종류가 있다.
아래 방법으로 접근 제어자를 사용해 함수를 선언할 수 있다. 따로 접근 제어자를 설정하지 않을 경우에, 함수는 기본적으로 public으로 선언된다.
function 함수의 이름(자로형 _인자명, ...) 접근 제어자 {
}
레슨 1에서 배우는 접근 제어자에는 두 가지 종류가 있다.
이더리움은 keccak256을 내장 해시 함수로 가지고 있다.
keccak256 함수는 전달받은 문자열을 랜덤 256비트 16진수로 매핑한다. 스트링에 작은 변화만 있어도 해시 값은 크게 달라진다.
keccak256("aaaab");
//6e91ec6b618bb462a4a6ee5aa2cb0e9cf30f7a052bb467b0ba58b8748c00d2e5
(무슨 말인지 잘 모르겠네요. 향후 더 공부해서 추가할 예정입니다.)
이 내용은 정보를 공유하기 위함이 아닌 저의 개인적인 공부 기록을 남기기 위함입니다. 따라서 틀린 정보가 있을 수 있으니 유의해서 봐주시면 감사하겠습니다.