문자열: 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 을 꼭 고집할 필요는 없습니다.