2026년 상식닷컴 선정 식당 & 카페 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요

솔리디티에서 'storage', 'memory', 'calldata'의 차이는 무엇인가요?

_____
Q1: 솔리디티에서 `storage`, `memory`, `calldata`란 무엇인가요?
- storage : 스마트 컨트랙트의 영속적(퍼시스턴트) 저장 공간입니다. 컨트랙트 상태 변수들이 저장되고, 블록체인에 영구적으로 기록됩니다.
- memory : 함수 호출 동안만 존재하는 휘발성 메모리로, 임시 데이터를 저장하는 데 사용됩니다. 함수 실행이 끝나면 데이터가 사라집니다.
- calldata : 외부 함수 호출 시 전달되는 인자들의 읽기 전용 영역입니다. 가변 길이 데이터도 효율적으로 처리할 수 있도록 최적화되어 있습니다.

Q2: 각 데이터 위치(storage, memory, calldata)의 주요 용도는 무엇인가요?
- storage : 상태 변수를 선언할 때 기본 저장 위치이며, 데이터를 영구적으로 기록할 필요 있을 때 사용합니다.
- memory : 함수 내부에서 임시 복사본이 필요한 데이터(특히 복잡한 타입 배열, 구조체 등)를 저장할 때 사용합니다.
- calldata : 외부로부터 전달받은 함수 인자를 수정 없이 읽을 때 사용합니다. 가변 길이 배열이나 문자열 인자를 받을 때 주로 쓰입니다.

Q3: `memory`와 `calldata`는 어떻게 다른가요?
- 수정 가능성 : `memory`는 읽기 및 쓰기가 가능하지만, `calldata`는 읽기 전용입니다.
- 생명주기 : 둘 다 휘발성이라 함수 실행이 끝나면 사라지지만, `calldata`는 함수 호출 시 자동으로 제공되는 입력 데이터 영역입니다.
- 사용 위치 : `memory`는 내부 함수(또는 내부 처리용)에서 임시 데이터 저장용, `calldata`는 외부 함수 파라미터 입력에 최적화되어 있습니다.

Q4: 왜 `calldata`를 사용해야 하나요?
- `calldata`는 읽기 전용이기 때문에 가스 비용이 상대적으로 싼 편입니다. 특히 외부 함수 호출 시 복사하는 대신 직접 참조하기 때문에 효율성이 높습니다.
- 가변 길이 데이터를 외부에서 받을 때 비용 절감에 유리합니다.
Q5: `storage` 변수를 `memory`나 `calldata` 변수에 할당하면 어떻게 되나요?
- `storage` 변수를 `memory`에 할당하면 해당 데이터의 복사본이 `memory`에 생성됩니다. 이후 수정은 `memory` 복사본에만 영향을 미칩니다.
- `calldata`에서 `memory`로 복사할 때도 데이터가 복사되지만, 읽기 전용 `calldata`에서 직접 읽기는 가능합니다.

Q6: 예를 들어 배열을 인자로 받을 때 각각 어디에 저장되나요?
```solidity
function foo(uint[] calldata arr) external { ... }
function bar(uint[] memory arr) internal { ... }
```
- `arr`이 외부 함수에 전달되면 기본적으로 `calldata`에 저장되며, 함수 내에서 수정이 필요하면 `memory`로 복사하여 사용합니다.
- 내부 함수처럼 호출 시 복사본이 필요하면 `memory`에 배열이 존재합니다.

Q7: 요약하자면, 언제 어떤 저장 위치를 사용해야 하나요?
- 상태 변수 선언 시 → storage
- 임시 데이터, 함수 내부 복사본 필요 시 → memory
- 외부 함수의 인자 읽기 전용 처리 시 → calldata

참고
- `storage` 가스 비용 > `memory` 가스 비용 > `calldata` 가스 비용
- 복잡한 데이터 타입(배열, 구조체)을 다룰 때 설정을 명확히 해야 가스 최적화와 코드 안정성이 좋아집니다.
솔리디티(Solidity)에서 `storage`, `memory`, `calldata`는 데이터가 저장되는 위치와 그 특성에 따라 구분되는 세 가지 주요 데이터 위치입니다.

이들은 각각의 용도와 성능 특성이 다르기 때문에, 스마트 계약을 작성할 때 적절한 데이터 위치를 선택하는 것이 중요합니다.

아래에서 각 데이터 위치의 특징과 차이점을 자세히 설명하겠습니다.

1. Storage - 정의 : `storage`는 스마트 계약의 상태 변수를 저장하는 영구적인 저장소입니다.

블록체인에 저장되며, 계약이 배포된 후에도 데이터가 유지됩니다.

- 특징 : - 영구성 : `storage`에 저장된 데이터는 블록체인에 영구적으로 기록되며, 계약이 삭제되지 않는 한 데이터는 계속 존재합니다.

- 비용 : `storage`에 데이터를 저장하거나 수정할 때는 가스 비용이 발생합니다.

이는 블록체인에 데이터를 추가하는 것이기 때문에 비용이 많이 듭니다.

- 가변성 : `storage`에 저장된 데이터는 언제든지 수정할 수 있습니다.

- 사용 예 : 계약의 상태를 유지해야 하는 변수들, 예를 들어 사용자 잔액, 계약의 소유자 주소 등이 `storage`에 저장됩니다.



2. Memory - 정의 : `memory`는 임시 데이터 저장소로, 함수 호출 중에만 존재하며, 함수가 종료되면 데이터가 사라집니다.

- 특징 : - 일시성 : `memory`에 저장된 데이터는 함수 실행이 끝나면 사라지므로, 영구적인 저장소가 필요 없는 경우에 사용됩니다.

- 비용 : `memory`에 데이터를 저장하는 것은 `storage`보다 가스 비용이 적게 듭니다.

그러나 여전히 비용이 발생하므로, 대량의 데이터를 처리할 때는 주의가 필요합니다.

- 가변성 : `memory`에 저장된 데이터는 함수 내에서 자유롭게 수정할 수 있습니다.

- 사용 예 : 함수의 매개변수나 반환값, 또는 중간 계산 결과를 저장할 때 `memory`를 사용합니다.



3. Calldata - 정의 : `calldata`는 외부 호출에서 전달된 데이터의 읽기 전용 저장소입니다.

주로 함수의 매개변수로 사용됩니다.

- 특징 : - 읽기 전용 : `calldata`에 저장된 데이터는 읽기 전용이며, 수정할 수 없습니다.

이는 데이터의 무결성을 보장하는 데 도움이 됩니다.

- 비용 : `calldata`는 `memory`보다 가스 비용이 적게 들며, 외부 호출에서 전달된 데이터를 효율적으로 처리할 수 있습니다.

- 영속성 : `calldata`는 함수 호출이 끝나면 사라지며, 영구적으로 저장되지 않습니다.

- 사용 예 : 외부에서 호출된 함수의 매개변수로 전달된 배열이나 구조체를 `calldata`로 정의할 수 있습니다.

예를 들어, 대량의 데이터를 함수에 전달할 때 `calldata`를 사용하면 가스 비용을 절감할 수 있습니다.

요약 - Storage : 영구적이고 수정 가능한 데이터 저장소. 가스 비용이 비쌈. - Memory : 임시적이고 수정 가능한 데이터 저장소. 함수 호출 중에만 존재하며, 가스 비용이 상대적으로 낮음. - Calldata : 읽기 전용 데이터 저장소. 외부 호출에서 전달된 데이터에 사용되며, 가스 비용이 가장 낮음. 이러한 데이터 위치의 차이를 이해하고 적절히 활용하는 것은 스마트 계약의 성능과 비용 효율성을 높이는 데 매우 중요합니다.

각 데이터 위치의 특성을 고려하여, 필요한 경우에 맞는 데이터 위치를 선택하는 것이 스마트 계약 개발의 핵심입니다.

작성자: 박시연 [비회원] | 작성일자: 1년 전 2024-11-22 19:32:07
조회수: 143 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.