---
# System prepended metadata

title: 크립토 좀비 요약 (Basic 1~6)

---

# 크립토 좀비 요약 (Basic 1~6)


# Lesson 1 ~ 3

Storage 와 Memory
---
- Storage 는 블록체인에 영구적으로 저장되는 공간임. 상태 변수는 default 로 storage 로 선언됨. 
- Memory 는 임시적으로 저장되는 변수로, scope 를 벗어나면 자동으로 메모리 해제가 됨. 함수 안에 정의된 변수들은 default 로 memory 로 선언됨. 
- 함수 안에서의 memory 사용은 동적 할당은 안되고 정적 할당만 되기 때문에 배열 크기를 줘야 한다. uint[] memory arr = new uint[](); → 에러 

Contract: Solidity 의 가장 기초적인 단위
---
- 상태 변수
    - Contract 의 상태 변수를 가짐. contract 내부, 함수 외부에서 설정.
    - 상태 변수는 EVM 의 Storage 공간에 저장이 됨.
    - Contract 외부에서 볼 수 있도록 설정할 수 있거나, 보지 못하도록 설정할 수 있음.
    - public: 아무것도 안쓰면 기본적으로 주어지는 상태
    - private: Contract 외부에서 볼 수 없도록 만든 상태
    - uint private a; // 선언하는 방법
[심화: 상태 변수의 레이아웃]( https://docs.soliditylang.org/en/v0.8.11/internals/layout_in_storage.html)

함수
---
- Contract 의 동작을 정의함. 외부에서 호출하도록 허용할 수 있고, 호출하지 못하도록 제어할 수 있음.
- Visibility에 따른 함수 제어자 (function modifier) 라고 하는데 public, private, internal, external 이 있음.
    - public: Contract 내외부 모두 접근 가능
    - private: Contract 외부에서는 접근 불가능. (상속한 Contract 도 접근 불가능)
    - internal: Contract 내부에서만 가능 / 외부에서는 접근 불가능 (상속한 Contract 에서는 접근 가능) 
    - external: Contract 외부에서만 가능 / 내부에서는 접근 불가능
- 목적에 따른 함수 제어자도 있는데, pure 와 view 가 있음.
    - view: 상태 변수에 write 을 하지 않고 read only 만 함.
    - pure: 상태 변수를 read only 도 하지 않고, 주어진 인자로만 처리함.
- 반환값이 있다면 미리 함수 정의에서 반환 타입을 정해줘야 함
    - 함수의 제일 마지막에 returns (타입)  을 적어주면 됨.

이벤트
---
- web.js 와 같은 app level 로 이벤트가 발생했음을 알려주는 역할. Contract 내에서 로그를 찍어볼 방법은 없기 때문에 외부로 이벤트를 emit 하는 역할을 함. 

자료구조
---
- 배열
    - uint[크기] a; // 정적 배열 선언하는 방법
    - uint[] a = new uint [] (크기); // 동적 배열 선언하는 방법
- 구조체
    - 변수 타입이 같은 것끼리 모아서 선언해야지 스토리지 공간을 적게 쓸 수 있다. (이는 메모리 할당 방식과 관련있다 - C++ 에서도 구조체를 선언할 때 이 점을 유의해서 선언한다)
- 맵핑
    - mapping (key type => value type) // mapping 선언하는 방법

특별한 전역 변수
---
- msg.sender: Contract 를 호출한 주소를 가져옴. 

상속
---
- 코드의 간결성과 모듈화를 위해서 상속을 사용
- is // 상속하는 방법

인터페이스
---
- 외부의 Contract 와 상호작용을 하기 위해서 사용
- 외부의 Contract 의 함수를 정의하는데, 이 때 구현은 하지 않고 반환값까지만 선언해줌.
- 인터페이스를 변수로 선언하고 객체를 생성하게 되면, 이 변수는 외부 Contract 를 가리키는 포인터 변수와 같은 역할을 하게 됨. 

Contract 의 불변성
---
- 특정 address 로 배포된 Contract 는 다시는 수정될 수 없음. 만약에 수정하고 싶다면 새로운 Contract 를 배포하고 address 도 변경될 것임. 
- 이러한 점은 내 Contract 가 외부 Contract 를 사용할 때, 만약 외부 Contract 가 수정되었다고 하면 나의 Contract 도 수정이 되어야 하는 문제를 야기시킴.
- 이러한 문제를 해결하기 위해서 외부 Contract 주소를 hard coding 하는 것이 아니라 외부에서 수정할 수 있도록 할 수 있음.
- 이렇게 외부에서 수정할 수 있도록 하면 external 로 설정해야되는데, 이러한 경우 owner 만 수정할 수 있도록 설정할 수 있음.
- 이러한 기능은 Open Zeppelin 에서 Ownable 이라는 Contract 를 제공하고, 이 Contract 를 상속하고 특정 기능에 대해서 onlyOwner 라는 제어자를 붙이면 owner 만 호출할 수 있도록 제어할 수 있음. 
- 함수 제어자는  인자도 별도로 받을 수 있음. 

Solidity 의 시간 키워드
---
- seconds, minutes, hours, days, weeks, years, now 를 제공. now 는 uint256 을 반환하고, uint32 연산이랑 맞추기 위해서는 type casting 을 해야함. 

인자를 포인터로 전달 (Call by Reference)
---
- storage 라는 키워드를 쓰면 구조체 등을 포인터를 통해 인자로 넘길 수 있음.

View 제어자
---
- 가스를 소모하지 않는다
- 가능한 대부분의 함수에서 external view 를 쓰면 가스 소모를 절약할 수 있음. 

# Lesson 4 ~ 6

- Payable
    - Solidity 함수를 사용하기 위해서 지불해야하는 수수료를 정의할 수 있음. 
    - 이렇게 지불된 수수료는 Smart Contract 안에 갇혀있기 때문에 이 금액을 특정 요청에 의해서 withdraw 하는 로직도 만들 수 있음. 주의할 것은 이 withdraw 함수는 Smart contract 의 owner에 의해서만 수행되어야 함. 
- ERC-721
    - NFT를 발행하는 표준으로, 이 Smart Contract를 상속하여 함수를 overriding 을 하면 됨
    - 자세한 것은 NFT 관련 스마트 컨트랜트를 개발하면서 자세히 다뤄보자 
- SafeMath
    - 수의 오버플로우 또는 언더플로우를 막기위해서 SafeMath 라는 라이브러리를 사용해야 함. 
