dukDukz

[블록체인] 솔리디티 언어 연습 (좀비) 본문

웹 개발/블록체인

[블록체인] 솔리디티 언어 연습 (좀비)

헤일리_HJ 2021. 10. 11. 09:50

솔리디티 언어는 OOP 개념인데 이것을 배울 수 있는 사이트는

크립토 좀비 - https://cryptozombies.io/ko/

10분 고민하고 안되면 next



크립토 좀비

pragma solidity ^0.4.19;

contract ZombieFactory {
    uint dnaDigits = 16;
    uint dnaModulus = 10 ** dnaDigits;
}

 

1. 버전

pragma solidity ^0.4.19;

-> 버전을 적는 공간

왜 필요할까? 

버전 업이 되면서 실행이 안되는 경우를 방지하기 위해서. 

특정 버전으로 빌드하는 것. 선언해준다.

 

 

2. 메인 함수 (OOP 의 특징)

contract ZombieFactory { }

OOP 객체지향언어 에서 메인함수라고 보면 된다.



3. 변수 선언

uint dnaDigits = 16;

 

부호 없는 정수: uint

uint 자료형은 부호 없는 정수로, 값이 음수가 아니어야 한다는 의미네. 부호 있는 정수를 위한 int 자료형도 있네.

 

js 에서 let 의 의미는? 그냥 변수 선언할때 사용한것... 사용 영역만 정해준거임 (const 안바뀌는 let 바뀌는 값)

 

여기서는 자료형이 정해져 있는거임

uint 는 양수값...이라고 생각하면 된다.

 

그래서 타입 잘못쓰면 빨간줄 뜬다.

 

여기서는 세미콜론 무조건!!!!!!! 써줘야함 C 랑 동일하다고 봐야할듯..




4. 연산자

다른건 동일한데 n제곱 (n승) 은 약간 다름

uint x = 5 ** 2; 

// 즉, 5^2 = 25

 

 



 

5. 구조체

OOP 에서의 구조체

struct Zombie {
    string name;
    uint dna;
}

 

 

js 는 객체라는게 존재한다.

 

let zombie = {
    name : 'zombie',
    dna : 123456789,
}

zombies = []

zombies.push(zombie)

 

만약 여기서 name 을 바꿔서 넣고 싶다면..?

잘 떠오르지 않음...

class를 쓰는 수 밖에

 

class zombie{
    constructor(_name,_dna){
        this.name = _name,
        this.dna = _dna
    }
}

zombie1 = new zombie("hello",1234456789123)
zombie2 = new zombie("hello",1234456333333)

zombies=[]

zombies.push(zombie1)
zombies.push(zombie2)

 

 

그래서 구조체도 그 형태를 찍어내기 위해서 구조체를 만든다고 할 수 있다.

OOP 라서 맨처음에 data type을 줄 수 있다.



 

6. 배열

js 에서는 

let a = [] 하면 되었다.

 

하지만 여기서는 선언을 해줘야하고

배열에는 항상 같은 데이터 타입만 넣어줘야 한다.

 

* 선언방식

데이터타입[] 변수명;

 

string[] newArr;

uint[] newArr;

 

동적배열과 정적배열..

정적 배열 - 배열 원소의 개수를 정해줌

동적 배열 - 정해주지 않음

 

데이터타입 뒤에 오는 [] 안에 숫자가 있냐 없냐에 따라서 정해진다. 

비어있다면 동적 숫자가 채워져있다면 정적이다.



7. 접근자

oop

코드블럭안에서만 작성이 가능하다.

 

{
    let a = 10  
    // 이 변수를 이 코드블럭에서만 사용할지 아님 다른 코드블럭에서도 사용할지. public private
}

{
    console.log(a)
}

js 라고 하더라도 이렇게는 안된다.

그럴때 사용하는게 접근자이다.



솔리디티에서는

 

데이터타입 접근자 변수명;

        public / private

 

struct Zombie {
    string name;
    uint dna;
}

Zombie[] public zombies;

 

저 구조체를 담을 배열을 만들건데 다른데서도 사용할 수 있게 할거고 그 변수 명은 zombies 로 할 것 이다.

 

 

8. 함수 선언

 

function eatHamburgers(string _name, uint _amount) { 

}

// 앞에 언더바 _ 붙이는 이유는 지역변수라서.. 이건 그냥 관례?



function eatHamburgers(_name,_amount) { 

}



js 에서 

function ab(a,b){
    return a+b
}

ab("hello","world")
// helloworld 가 나옴.

ab(1,2)
// 3 이 나옴

ab("hello",1)
// 1을 string 으로 인식해서 hello1 이 될 것이다.



let a = "1"     // 실수로 데이터타입을 string 으로 넣게 됨
ab(a,1)
// 결과 11 이 됨

 

js 에서는 다 된다.

 

이게 script 언어의 단점.. 실행시키기 전까지는 모름

 

하지만 선언시 데이터 타입을 넣는다면?

 

oop 에서,

function ab(string a, string b){
    return a+b
}

ab(1,2)

하면 실행하기도 전에 빨간줄이 그어진다.

 

 

9. 구조체와 배열 활용하기

구조체를 가지고 객체를 만드는 방법은....

요 구문이 함수가 된다고 생각해보자

struct Zombie {
    string name;
    uint dna;
}