블록체인 학습
0 XP

문자열: string

string 은 UTF-8 로 인코딩된 텍스트를 저장하는 타입입니다. 사용자 이름, 토큰 심볼, 설명 메시지처럼 사람이 읽는 문자를 담을 때 사용합니다. 한글·이모지 같은 멀티바이트 문자도 그대로 저장할 수 있습니다. 초기화하지 않은 string 의 기본값은 빈 문자열 "" 입니다.

다만 한글·이모지처럼 ASCII 가 아닌 문자를 리터럴로 직접 적을 때는 일반 "..." 가 아니라 unicode"..." 를 써야 합니다. string public greeting = "안녕하세요"; 라고 쓰면 Invalid character in string 컴파일 오류가 납니다. 타입이 담지 못하는 것이 아니라, 리터럴 문법의 제약입니다.

문자열은 참조 타입

uint·bool 같은 값 타입과 달리, string 은 길이가 가변적인 참조 타입(reference type) 입니다. 그래서 함수의 매개변수나 반환값으로 쓸 때 memory·calldata 같은 데이터 위치를 명시해야 합니다. 아래 예시에서 반환 타입이 string memory 인 이유가 바로 이것입니다.

문자열 다루기

문자열 리터럴은 큰따옴표로 감쌉니다. 여러 문자열을 이어 붙일 때는 string.concat 을 사용합니다. 두 문자열이 같은지 비교하려면 직접 == 를 쓸 수 없고, 보통 해시를 비교합니다. 즉 keccak256(bytes(a)) == keccak256(bytes(b)) 형태를 사용합니다.

이처럼 Solidity 에서 문자열을 비교하거나 길이를 구하는 연산은 번거롭고 가스도 많이 듭니다. 꼭 필요할 때만 사용하세요.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
 
contract StringExample {
    string public name = "Alice";
    string public greeting = unicode"안녕하세요"; // 비-ASCII 는 unicode 접두사 필요
 
    function fullGreeting() public view returns (string memory) {
        return string.concat(greeting, ", ", name);
    }
 
    function isSame(string memory a, string memory b) public pure returns (bool) {
        return keccak256(bytes(a)) == keccak256(bytes(b));
    }
}

저장할 텍스트가 32바이트 이하로 짧고 고정적이라면 다음 수업에서 배울 bytes32 가 string 보다 훨씬 가스 효율이 좋습니다. 사람이 읽는 가변 텍스트가 아니라면 string 을 꼭 고집할 필요는 없습니다.

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

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