이 글은 아래 코트스테이츠의 내용을 정리한 것입니다.
참고 링크
brew update
brew tap ethereum/ethereum // tap: 추가적인 Homebrew repo 저장소 사용자 시스템에 등록 tap <사용자명/저장소명>
brew install solidity
solc --version 명령어로 설치 확인// 1. SPDX 라이센스 식별자
// SPDX-License-Identifier: GPL-3.0
// 2. Version Pragma
pragma solidity >= 0.7.0 < 0.9.0;
// 3. 배포할 컨트랙트
contract Ex1 {
// code
}


다음과 같이 코드 입력
// SPDX-License-Identifier: GPL-3.0
pragma solidity >= 0.7.0 < 0.9.0;
contract Ex1 {
// 코드 입력
}
컴파일러 누르고 Ex.1 파일 컴파일




// 자료형/변수/대입 연산자/값
uint a = 5;
솔리디티 3가지 변수 타입
영속성 가짐가시성 지정자에 따라 변수 접근 범위가 달라짐// SPDX-License-Identifier: GPL-3.0
pragma solidity >= 0.7.0 < 0.9.0;
contract Ex1 {
// 상태 변수
string public a = "Hello World";
uint public b = 1;
function getEx() view public {
// 지역 변수
uint c = 2;
// 전역 변수
uint d = block.timestamp;
address e = msg.sender;
}
}
참과 거짓으로 이루어진 자료형
솔리디티에서는 bool 로 표기
특정 조건에 발생하는 행동 통제에 쓰임
주로 비교 연산자, 논리 연산자와 함께 사용
uint 와 정수형 int 이며 둘의 차이점은 음수 포함 여부UTF-8로 인코딩된 배열매핑은 JS의 Object와 같이 키와 값의 형태로 저장
mapping(key type ⇒ value type) 가시성 지정자 매핑명) 으로 정의됨
key type
value type
대표적인 예시 - 각 유저 토큰 잔액을 나타내는 것을 매핑으로 구현 가능
// SPDX-License-Identifier: GPL-3.0
pragma solidity >= 0.7.0 < 0.9.0;
contract Ex1 {
// mapping(key type ⇒ value type)/가시성 지정자/매핑명)
mapping(address => uint) public myAddr;
}
매핑에 키와 값 추가 가능
// SPDX-License-Identifier: GPL-3.0
pragma solidity >= 0.7.0 < 0.9.0;
contract Ex1 {
// key: address type, value: uint type
mapping(address => uint) public myAddr;
function addM(address _key, uint _val) public {
myAddr[_key] = _val;
}
function getM(address _key) public view returns(uint) {
return myAddr[_key];
}
}
myAddr 매핑 키는 address 자료형이고 값의 자료형은 uintaddM 함수는 myAddr 매핑에 데이터 저장하는 함수위 코드를 실행해보자



getM 을 실행하여 올바른 값이 나오는 지 확인
매핑에서 키와 값을 삭제할 수도 있음
function deleteM(address _key) public {
delete(myAddr[_key]);
}
function deleteM2(address _key) public {
// mapping의 value가 uint 자료형일 경우만 가능
myAddr[_key] = 0;
}

0배열: 어떤 것의 모음집
한 개의 배열에 여러 개의 값을 순차적으로 저장
값을 순차적으로 저장하기에 배열의 길이 지원
타입[] 가시성 지정자 배열명으로 정의
// 자료형/배열/가시성 지정자/배열명
uint [] public arr;
솔리디티에서 배열은 정적/동적 배열로 사용 가능
동적 배열 (dynamic)
uint[] public arr;
정적 배열 (static)
string[10] public arr2 = ["apple", "banana", "tomato"];
배열의 인덱스에 대응하는 값 구할 수 있음
getArrleng getArr2leng 은 배열 길이 반환하는 함수
// SPDX-License-Identifier: GPL-3.0
pragma solidity >= 0.7.0 < 0.9.0;
contract Ex1 {
uint[] public arr;
// 3개 값 저장된 상태, 나머지 인덱스는 공백으로 남겨져 있을 것
string[10] public arr2 = ["apple", "banana", "tomato"];
function getArrLeng() public view returns(uint) {
return arr.length;
}
function getArr2Lneg() public view returns(uint) {
return arr2.length;
}
function getArr(uint _index) public view returns(uint) {
return arr[_index];
}
function getArr2(uint _index) public view returns(string memory) {
return arr2[_index];
}
}

arr 크기가 0이며 값을 저장할 수 있는 공간이 존재하지 않기 때문에 발생
arr2 또한 인덱스 값으로 10 이상 넣으면 동일 오류 발생할 것, 크기가 10으로 지정되어 있기 때문
배열 값 추가
function plusArr(uint _value) public {
arr.push(_value);
}
// arr2는 크기가 10으로 고정되어 있기 때문에 push method 사용 시 에러
function plusArr2(string memory _value) public {
arr2.push(_value);
}

- `plusArr` 실행 후 `getArrLeng` 실행
배열 값 변경
function changeArr(uint _index, uint _value) public {
arr[_index] = _value;
}
function changeArr2(uint _index, string memory _value) public {
arr2[_index] = _value;
}

배열 값 삭제
// SPDX-License-Identifier: GPL-3.0
pragma solidity >= 0.7.0 < 0.9.0;
contract Ex1 {
uint[] public arr = [1, 2, 3];
function getLeng() public view returns(uint) {
return arr.length;
}
function removeArr() public {
arr.pop();
}
function deleteArr(uint _index) public {
delete arr[_index];
}
}

removeArr (pop) 실행 → 배열 길이 2로 변경
deleteArr(0) 실행
* 배열의 길이가 줄지는 않았지만, arr[0] 이 0으로 변경
imported 역시 가능struct Human {
uint age;
string name;
string job;
}
// SPDX-License-Identifier: GPL-3.0
pragma solidity >= 0.7.0 < 0.9.0;
contract Ex1 {
struct Human {
uint age;
string name;
string job;
}
Human public human1 = Human(22, "sol", "dr");
Human public human2;
function getH1() public view returns (Human memory) {
return human1;
}
function getH2() public view returns (Human memory) {
return human2;
}
}

human2에 human 자료형 값을 대입하는 함수를 작성해보자
function newH2(uint _age, string memory _name, string memory _job) public {
human2 = Human(_age, _name, _job);
}

human1의 직업을 바꿔보자
function changeH1Job(string memory _job) public {
human1.job = _job;
}

function 키워드가시성 지정자란, 변수나 함수의 공개 범위를 제한하는 것function 키워드, 함수 이름, 가시성 지정자 순으로 작성하여 함수 정의 가능function functionName() public {
// logic
}
function functionName(매개변수) public returns (반환값 자료형) {
// logic
}
// SPDX-License-Identifier: GPL-3.0
pragma solidity >= 0.7.0 < 0.9.0;
contract Ex1 {
function plusNum(uint a, uint b) public pure returns (uint) {
return a + b;
}
}

솔리디티에는 다음과 같이 네 가지 영역이 존재
매개변수 혹은 반환값으로 참조 타입 사용 시, 이 네 개 영역 중 알맞은 하나의 저장 영역을 명시해 줘야 함
스토리지
메모리
콜데이터
스택
사용 예시
// SPDX-License-Identifier: GPL-3.0
pragma solidity >= 0.7.0 < 0.9.0;
contract Ex1 {
function getValue(uint a) public pure returns (uint) {
return a;
}
function getReference(string memory a) public pure returns (string memory) {
return a;
}
}


pure 라는 키워드를 확인할 수 있음모디파이어의 한 종류대입 연산자
=// SPDX-License-Identifier: GPL-3.0
pragma solidity >= 0.7.0 < 0.9.0;
contract Ex1 {
string a = "Hello World!"
}
산술 연산자
// SPDX-License-Identifier: GPL-3.0
pragma solidity >= 0.7.0 < 0.9.0;
contract Ex1 {
uint a = 1 + 2;
uint b = 2 - 1;
uint c = 3 * 2;
uint d = 5 / 5;
uint e = 5 % 2;
uint f = 2 ** 2;
function getResult() public view returns(uint, uint, uint, uint, uint, uint) {
return (a, b, c, d, e, f);
}
}

할당 연산자
// SPDX-License-Identifier: GPL-3.0
pragma solidity >= 0.7.0 < 0.9.0;
contract Ex1 {
uint a = 10;
uint b = 10;
uint c = 10;
uint d = 10;
uint e = 10;
function getResult() public returns(uint, uint, uint, uint, uint) {
a += 2;
b -= 2;
c *= 2;
d /= 2;
e %= 2;
return (a, b, c, d, e);
}
}

비교 연산자
true, false 로 결과값 반환// SPDX-License-Identifier: GPL-3.0
pragma solidity >= 0.7.0 < 0.9.0;
contract Ex1 {
bool a = 1 > 3;
bool b = 1 < 3;
bool c = 10 >= 2;
bool d = 3 <= 3;
bool e = 1 == 2;
bool f = 1 != 2;
function getResult() public view returns (bool, bool, bool, bool, bool, bool) {
return (a, b, c, d, e, f);
}
}

논리 연산자
AND, OR, NOT 등의 논리 연산을 수행하여 bool 타입 반환// SPDX-License-Identifier: GPL-3.0
pragma solidity >= 0.7.0 < 0.9.0;
contract Ex1 {
bool a = true && true;
bool b = true && false;
bool c = false && false;
bool d = true || true;
bool e = true || false;
bool f = false || false;
bool g = !false;
function getResult() public view returns(bool, bool, bool, bool, bool, bool, bool) {
return(a, b, c, d, e, f, g);
}
}