공부 내용 정리

솔리디티 문법에 대해 배워보자!

blockchoin 2025. 6. 20. 16:52

전 시간에 공부한 솔리디티와 Hardhat에 이어서, 새로운 문법들을 공부해 보겠습니다. C 나 파이썬등의 언어에서 사용되는 것과 비슷하기에 익숙하게 공부할 수 있을 겁니다.

1. 변수 선언 및 가시성

(1) 변수 선언 방식

자료형을 먼저 적어주고 그 사이에 가시성을 명시 해줍니다. 그 뒤에 변수에 어울리는 이름을 정해주시면 됩니다.

  • uint public age = 30; // 외부에서 접근 가능
  • string private name = "Tom"; // 외부에서 접근 불가

(2) 가시성 종류

public 외부 및 내부에서 접근 가능. 자동 getter 생성됨
private 오직 현재 컨트랙트 내에서만 접근 가능
internal 현재 컨트랙트와 상속받은 컨트랙트에서 사용 가능
external 함수에만 사용. 외부에서만 호출 가능 

(3) 상수와 불변 변수

  • constant 를 변수명 앞에 선언하면, 수정 불가능하게 되어, 읽기만 되는 변수가 됩니다. 주로, 바뀌지 않는 특정 수학적 값이나, 지갑주소 등을 선언 할때 사용합니다. 가스 비용을 절약 할 수 있습니다.
  • immutable 을 변수명 앞에 선언하면, 배포 하면 값이 변경되지 않습니다.

 


2. 함수

(1)  예시

function 이라고 함수를 만든다고 선언해 주시고, 함수명 정해주고, 그 뒤 괄호를 넣어주시면 됩니다. 괄호 안에는 파라미터 (매개변수)가 쓰이는 만큼 넣어주시면 됩니다. 없으면 안 넣어도 됩니다. 그리고 가시성과 리턴 타입을 적어주시면 됩니다. 가시성은 필수는 아니지만 적어주시는 게 가독성에 좋습니다. 

 

(2) 상태 변경자

상태 변경자는 함수가 스마트 컨트랙트의 상태 변수에 어떤 영향을 미치는지를 정의합니다.

상태 변경자 설명
view 상태 변수의 읽기만 허용 (가스 비용 없음)
pure 상태 변수의 읽기 및 쓰기 모두 금지 (가스 비용 없음)
payable 이더리움을 받을 수 있는 함수 (특정한 금액을 받기 위한 함수)

 

3. 조건문 및 반복문

(1) 예시

 

Solidity에서도 if, else, for, while 등을 사용할 수 있습니다. 

 

(2) 주의 사항

  • 반복문은 실행 횟수에 비례하여 가스 비용이 크게 증가하기에 주의가 필요합니다.
  • 혹시 무한 루프 발생 시, 트랜잭션이 실패하고 모든 가스가 소모됨으로 더욱 조심해야 합니다.
  • 반복문 대신 매핑(mapping)이나 이벤트(event)를 활용해 가스 비용 절감 가능합니다.

4. 이벤트 

(1) 예시

이벤트는 블록체인 로그 기록을 위한 것으로, emit 키워드로 발생시키며 프론트엔드에서 로그 조회 가능합니다. 이벤트 로그는 인덱스(indexed) 를 사용해 검색할 수 있습니다.

 

(2) 특징

  • 이벤트는 가스 비용이 낮아, 상태 변수에 데이터를 저장하는 것보다 효율적입니다!

5. 접근 제어자

(1) 예시 

 

Modifier는 함수 실행 전에 조건을 검사하거나 필터 역할을 합니다. 특히, 어떤 행동을 할 권한을 판별하는데 기능으로 보안을 위한 기능으로 주로 쓰입니다.

 

(2) 장점

  • 반복되는 조건문을 Modifier로 정의해 중복 코드 제거하고, 가스 비용 까지 절감 됩니다.
  • 조건을 한눈에 쉽게 파악할 수 있어 가시성이 좋습니다.
  • 접근 제어나 상태 검증 등을 명확하게 설정 가능하여 더 안전합니다.

6. 에러 처리 

(1) 예시

 

보통 require() 가 가장 많이 쓰입니다. 가장 간단하고 직관적이게 사용할수 있고, 실패시 가스도 환불 되며, 모든 함수 처음에 사용가능합니다. 반대로 assert()는 가장 덜 쓰입니다. 환불이 안되어 비싸서 보통은 개발자가 내부용으로 사용합니다.

(2) 키워드 정리

 

문법 주용도 가스 환불 여부 사용 예시
require() 사용자 입력, 외부 조건 체크 입출금, 접근 제한 등
revert() 명시적 에러 처리, 분기 로직 중단 if-else 내 조건 처리
assert() 코드 내부 불변 조건 검증 절대 실패하면 안 되는 논리 검사
try/catch 외부 컨트랙트 호출 실패 감지 external call, 생성자 호출 실패 등

 

7. 이더 송금 

(1) 예시

 

스마트 컨트랙트는 이더를 받고, 보내는 기능을 가질 수 있습니다. 특히 receive() 함수는 이더를 직접 보낼 때(send, transfer, call) 호출됩니다. 여기에 쓰인 payable 키워드는 함수가 이더를 사용할려면 꼭 붙여합니다.

(2) 송금 3가지 방법 

  • transfer() → 안전한 이더 송금 (가스 제한: 2300)
  • send() → 실패 시 반환값으로 성공 여부 확인
  • call() → 가장 유연하지만 주의가 필요한 송금 방법

(3) 수신 2가지 방법

  • receive() → 순수 이더 전송시 호출됩니다.
  • fallback() → 리시브 함수가 없거나, 호출할 함수가 없는 경우 호출 됩니다.

(4) 이더 잔액 확인

address.balance 를 사용하면 해당 주소의 잔액을 알려줍니다. 단위는 Wei 입니다.

 

8. 마무리

 

 위 내용을 바탕으로 Solidity의 핵심 문법을 익혔다면, 이제 간단한 스마트 컨트랙트를 직접 작성해 보며 실력을 쌓아보세요. 다음 글에서는 배열, 매핑, 구조체(struct)와 같은 고급 자료형도 함께 다룰 예정입니다.