블록체인 학습
0 XP

library 개념 소개

라이브러리(library) 는 여러 컨트랙트에서 재사용할 수 있는 함수들을 모아둔 특별한 컨트랙트입니다. 주로 상태를 저장하지 않는 순수 유틸리티 함수(수학 계산, 배열 처리, 문자열 변환 등)를 담습니다. 같은 로직을 여러 컨트랙트에 복사·붙여넣기 하는 대신, 한 곳에 모아 두고 가져다 씁니다.

라이브러리는 일반적으로 상태 변수를 가질 수 없고, Ether 를 보유할 수 없으며, 상속되거나 상속받을 수도 없습니다. 코드 재사용과 가스 절약이 핵심 목적입니다.

컨트랙트 안에 복사되는 internal 라이브러리

internal 함수로만 이루어진 라이브러리는 별도로 배포되지 않습니다. 컴파일 시 그 코드가 호출하는 컨트랙트 안에 인라인(inline)으로 복사되어 들어갑니다. 즉 라이브러리 함수를 호출해도 외부 컨트랙트 호출이 발생하지 않고, 마치 내 컨트랙트에 직접 작성한 코드처럼 동작합니다. 가장 흔하고 가벼운 사용 방식입니다.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
 
// 재사용 가능한 수학 유틸리티 라이브러리
library Math {
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }
 
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a <= b ? a : b;
    }
}
 
contract Calculator {
    // 라이브러리이름.함수 형태로 호출한다.
    function larger(uint256 x, uint256 y) public pure returns (uint256) {
        return Math.max(x, y);
    }
}

따로 배포해 공유하는 external 라이브러리

반대로 external(또는 public) 함수를 가진 라이브러리는 독립적으로 한 번 배포되고, 이를 사용하는 컨트랙트들은 delegatecall 로 그 라이브러리 코드를 호출합니다. 코드가 복사되지 않으므로 여러 컨트랙트가 같은 배포본을 공유해 전체 배포 크기를 줄일 수 있습니다. 다만 delegatecall 호출 비용이 추가됩니다.

internal 라이브러리는 코드가 인라인으로 임베드되어 외부 호출이 없고, external 라이브러리는 별도로 배포된 뒤 delegatecall 로 호출됩니다. 대부분의 유틸리티는 internal 로 충분합니다.

Code Editor
에디터를 불러오는 중...
실행 결과

Run 버튼을 눌러 코드를 실행하세요.