3편 Solidity 기초 문법 정리

  • 토큰 계약을 보기 전에 알아두면 좋은 핵심 개념

블록체인에서 기능성 토큰을 만들거나 스마트 계약을 이해하려고 할 때, 가장 먼저 만나게 되는 언어가 바로 Solidity 입니다.
처음 보면 영어도 많고 낯선 코드 구조 때문에 어렵게 느껴질 수 있지만, 실제로는 몇 가지 핵심 문법만 이해해도 전체 흐름이 훨씬 쉽게 보입니다.

이번 글에서는 토큰 계약을 보기 전에 꼭 알아두면 좋은 Solidity의 기본 개념을 정리해보겠습니다.
특히 초보자가 자주 보게 되는 pragma, contract, constructor, function, mapping, event, public / private, require를 중심으로 쉽게 설명하겠습니다.

Solidity 란 무엇인가?

Solidity는 이더리움(Ethereum) 계열 블록체인에서 스마트 계약을 만들 때 사용하는 프로그래밍 언어입니다.
쉽게 말하면, 블록체인 위에서 자동으로 실행되는 약속을 코드로 작성하는 언어라고 볼 수 있습니다.

예를 들어 다음과 같은 기능을 Solidity 로 만들 수 있습니다.

  • 토큰 발행
  • 토큰 전송
  • 스테이킹 보상 지급
  • 특정 조건에서만 실행되는 관리자 기능
  • 거래 기록이나 이벤트 알림

즉, 단순히 숫자를 저장하는 수준이 아니라 서비스의 규칙을 코드로 고정하는 역할을 합니다.


왜 기초 문법을 먼저 알아야 할까?

토큰 계약 예제를 처음 보면 생각보다 코드가 길지 않습니다.
그런데 길이보다 더 중요한 것은 코드 안에 들어 있는 구조를 이해하는 것입니다.

예를 들어 이런 질문이 생길 수 있습니다.

  • 이 계약은 어디서 시작되는 걸까?
  • 누가 관리자인가?
  • 토큰 수량은 어디에 저장될까?
  • 함수는 누가 호출할 수 있을까?
  • 어떤 상황에서 실행이 막힐까?

이런 부분을 이해하려면 Solidity 의 기본 문법을 먼저 알아두는 것이 좋습니다.
기초가 잡히면 ERC-20 토큰 계약도 훨씬 쉽게 읽을 수 있습니다.


1. pragma란 무엇인가?

pragma이 코드가 어떤 Solidity 버전을 기준으로 작성되었는지 알려주는 선언문입니다.

예를 들면 이런 형태입니다.

pragma solidity ^0.8.20;

이 문장은 “이 코드는 Solidity 0.8.20 버전을 기준으로 작성되었고, 그와 호환되는 버전에서 컴파일하라”는 뜻입니다.

왜 이게 중요할까요?

Solidity 는 버전에 따라 문법이나 동작 방식이 조금씩 달라질 수 있습니다.
그래서 코드 맨 위에서 버전을 먼저 정해 두어야, 컴파일할 때 예상하지 못한 오류를 줄일 수 있습니다.

초보자 입장에서는 pragma“이 코드의 사용 설명서 첫 줄” 정도로 이해하면 됩니다.


2. contract란 무엇인가?

contract는 스마트 계약의 본체입니다.
자바나 자바스크립트에서 클래스(class)를 정의하듯, Solidity 에서는 계약의 틀을 contract로 만듭니다.

예시는 아래처럼 생깁니다.

contract MyToken {
}

이 안에 토큰 이름, 발행량, 전송 기능, 관리자 기능 같은 것들이 들어갑니다.

즉, contract
**“이 스마트 계약이 어떤 데이터를 가지고 어떤 기능을 수행할지 담아두는 상자”**라고 생각하면 이해하기 쉽습니다.

토큰 계약을 공부할 때 가장 먼저 봐야 하는 것도 바로 이 contract 블록입니다.


3. constructor란 무엇인가?

constructor스마트 계약이 처음 배포될 때 단 한 번만 실행되는 특별한 함수입니다.

예를 들면 이런 식입니다.

constructor() {
owner = msg.sender;
}

이 코드는 계약을 배포한 사람의 주소를 owner에 저장하는 예시입니다.

왜 중요할까요?

스마트 계약은 한 번 배포되면 블록체인에 올라가고, 그 이후에는 초기 설정을 바꾸기 어려운 경우가 많습니다.
그래서 처음 배포되는 순간에 필요한 값들을 constructor 안에서 정해두는 경우가 많습니다.

예를 들어 constructor에서는 보통 이런 일을 합니다.

  • 관리자 주소 저장
  • 초기 토큰 발행량 설정
  • 토큰 이름과 심볼 등록
  • 중요한 초기값 세팅

쉽게 말하면 constructor계약의 첫 세팅을 담당하는 시작 버튼입니다.


4. function이란 무엇인가?

function은 스마트 계약 안에서 실행할 수 있는 기능입니다.
우리가 앱에서 버튼을 누르면 어떤 동작이 실행되듯, 스마트 계약에서는 함수를 호출해서 기능을 수행합니다.

예를 들면 아래와 같습니다.

function hello() public pure returns (string memory) {
return "Hello";
}

함수는 토큰 계약에서 매우 중요합니다.
왜냐하면 거의 모든 핵심 기능이 함수로 이루어져 있기 때문입니다.

예를 들어 토큰 계약에는 이런 함수들이 들어갈 수 있습니다.

  • 토큰 전송
  • 잔액 확인
  • 민팅
  • 소각
  • 관리자 변경
  • 보상 계산

즉, function계약이 실제로 일을 하는 부분입니다.


5. mapping이란 무엇인가?

mapping데이터를 짝지어서 저장하는 구조입니다.
가장 자주 쓰이는 예시는 “주소 → 잔액”입니다.

예를 들면:

mapping(address => uint256) public balances;

이 코드는 각 지갑 주소마다 숫자 하나를 연결해 저장한다는 뜻입니다.
토큰에서는 이 숫자가 보통 그 주소가 가진 토큰 수량이 됩니다.

쉽게 이해하면:

  • A 주소 → 100
  • B 주소 → 50
  • C 주소 → 1000

이런 식으로 각각의 주소에 값을 연결해 저장하는 구조입니다.

토큰 계약에서는 mapping이 거의 필수입니다.
왜냐하면 누가 몇 개의 토큰을 가지고 있는지 저장해야 하기 때문입니다.

초보자에게는 mapping을 **“주소별 보관함”**처럼 생각하면 쉽습니다.


6. event란 무엇인가?

event계약에서 어떤 일이 발생했는지 외부에 알리는 기록 장치입니다.

예를 들면:

event Transfer(address indexed from, address indexed to, uint256 value);

이벤트는 블록체인에 로그처럼 남습니다.
토큰이 이동했을 때, 민팅이 발생했을 때, 소각이 발생했을 때 등 중요한 동작을 기록하는 데 사용됩니다.

왜 중요할까요?

스마트 계약 안의 값은 저장되지만,
어떤 일이 언제 발생했는지 보기 쉽게 남기려면 이벤트가 필요합니다.

예를 들어 지갑이나 블록 탐색기에서 토큰 전송 내역이 보이는 것도 이런 이벤트 덕분인 경우가 많습니다.

즉, event
“이 계약에서 이런 일이 일어났습니다”라고 블록체인에 남기는 알림 기록이라고 보면 됩니다.


7. public과 private는 무엇인가?

Solidity에서는 변수나 함수에 접근 범위를 지정할 수 있습니다.
그중 자주 보게 되는 것이 publicprivate입니다.

public

public은 바깥에서도 볼 수 있고 접근할 수 있다는 뜻입니다.

예를 들어:

uint256 public totalSupply;

이렇게 쓰면 totalSupply 값을 외부에서도 확인할 수 있습니다.

private

private는 해당 계약 내부에서만 직접 접근할 수 있다는 뜻입니다.

예를 들어:

uint256 private secretValue;

이 값은 계약 밖에서 바로 읽기 어렵습니다.

다만 초보자가 하나 알아둘 점이 있습니다.
블록체인은 기본적으로 공개된 환경이기 때문에, private라고 해서 완전히 비밀이 되는 것은 아닙니다.
여기서의 private는 **“코드 차원의 직접 접근 제한”**에 가깝습니다.

즉:

  • public = 외부에서 사용하거나 확인하기 쉬움
  • private = 코드 내부 전용으로 관리

이렇게 이해하면 충분합니다.


8. require란 무엇인가?

require조건 검사문입니다.
특정 조건이 맞을 때만 실행하고, 아니면 중단시키는 역할을 합니다.

예를 들면:

require(msg.sender == owner, "Not owner");

이 뜻은 “이 함수를 호출한 사람이 owner가 아니면 실행하지 말고 중단하라”입니다.

또 다른 예시는 이런 식입니다.

require(balance >= amount, "Insufficient balance");

이 경우에는 잔액이 부족하면 전송을 막습니다.

왜 require가 중요할까요?

스마트 계약은 돈이나 자산과 연결되는 경우가 많기 때문에,
아무나 실행하면 안 되는 기능이 많습니다.
또 잘못된 입력이나 위험한 상황도 미리 막아야 합니다.

그래서 require는 사실상 스마트 계약의 안전장치 역할을 합니다.

초보자는 require를
**“조건이 맞아야 통과하는 검사문”**이라고 기억하면 됩니다.

Solidity 기초 문법을 한 번에 보는 간단 예제

아래는 지금까지 설명한 요소가 일부 들어간 아주 간단한 예제입니다.

pragma solidity ^0.8.20;

contract SimpleStorage {
address public owner;
uint256 public number;
mapping(address => uint256) public userValues;

event NumberChanged(address indexed user, uint256 newNumber);

constructor() {
    owner = msg.sender;
}

function setNumber(uint256 _number) public {
    number = _number;
    userValues[msg.sender] = _number;
    emit NumberChanged(msg.sender, _number);
}

function onlyOwnerReset() public {
    require(msg.sender == owner, "Not owner");
    number = 0;
}

이 예제 안에는 다음 개념이 들어 있습니다.

  • pragma : Solidity 버전 지정
  • contract : 계약 본체
  • constructor : 배포 시 1회 실행
  • function : 기능 실행
  • mapping : 주소별 값 저장
  • event : 변경 기록
  • public : 외부 조회 가능
  • require : 조건 검사

이 정도 구조를 이해하면, 앞으로 나오는 토큰 계약도 훨씬 덜 낯설게 보이게 됩니다.


토큰 계약을 보기 전에 꼭 알아둘 점

Solidity 문법을 처음 배울 때 많은 분들이 “전부 외워야 하나?” 하고 부담을 느낍니다.
하지만 처음부터 완벽하게 외울 필요는 없습니다.

중요한 것은 다음 두 가지입니다.

첫째, 코드의 역할을 읽을 수 있어야 합니다.
예를 들어 이 함수가 토큰을 보내는 것인지, 관리자만 실행할 수 있는 것인지 정도를 구분할 수 있으면 충분히 큰 진전입니다.

둘째, 위험한 부분을 감지할 수 있어야 합니다.
예를 들어 아무나 민팅할 수 있는 구조인지, 관리자 권한이 너무 강한지, 조건 검사가 빠져 있는지 등을 보는 눈이 중요합니다.

즉, Solidity 문법은 단순히 코딩을 위한 지식이 아니라
토큰 계약을 이해하고 점검하는 기본 언어라고 볼 수 있습니다.


초보자가 자주 헷갈리는 부분

처음 Solidity 를 접하면 아래 부분에서 자주 헷갈립니다.

1) function만 보면 끝이라고 생각하는 경우

실제로는 변수, 접근 제한자, require 조건까지 함께 봐야 함수의 의미를 제대로 이해할 수 있습니다.

2) private면 완전 비밀이라고 생각하는 경우

블록체인 환경에서는 완전한 비밀 저장소가 아닙니다.
private는 접근 제한이지, 절대적인 숨김 기능은 아닙니다.

3) constructor를 일반 함수처럼 생각하는 경우

constructor는 배포 시 한 번만 실행되는 특별한 함수입니다.

4) mapping을 배열처럼 생각하는 경우

mapping은 순서대로 나열된 구조가 아니라, 키와 값을 연결하는 구조입니다.

5) require를 단순한 오류 문구로 보는 경우

require는 계약을 안전하게 지키는 핵심 장치입니다.

이 부분들만 구분해도 Solidity를 훨씬 안정적으로 이해할 수 있습니다.


정리

오늘은 토큰 계약을 보기 전에 꼭 알아두면 좋은 Solidity의 기본 문법을 정리했습니다.

핵심만 다시 정리하면 다음과 같습니다.

  • pragma는 Solidity 버전을 정하는 문장
  • contract는 스마트 계약의 본체
  • constructor는 배포 시 한 번 실행되는 초기 설정 함수
  • function은 계약의 기능
  • mapping은 주소와 값 같은 데이터를 연결해 저장하는 구조
  • event는 중요한 동작을 기록하는 로그
  • public / private는 접근 범위를 정하는 키워드
  • require는 잘못된 실행을 막는 안전장치

이 정도 개념만 잡혀 있어도 다음 단계인 토큰 계약 구조를 훨씬 쉽게 볼 수 있습니다.

Solidity 공식 문서 바로가기

4편 ERC-20 토큰 기능성 토큰의 기본 구조


다음 글 예고

다음 글에서는 ERC-20 토큰이란 무엇인지, 그리고 기능성 토큰이 왜 이 표준을 많이 사용하는지 쉽게 정리해보겠습니다.

즉, 오늘 배운 Solidity 기초 문법이
실제 토큰 계약 안에서 어떻게 쓰이는지 본격적으로 연결해서 보게 될 것입니다.