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

솔리디티에서 'public', 'private', 'internal', 'external'의 차이는 무엇인가요?

_____
Q1: 솔리디티에서 'public' 함수나 변수는 무엇인가요?
A1: 'public'으로 지정된 함수나 변수는 컨트랙트 내부, 상속받은 컨트랙트, 그리고 외부에서 모두 접근할 수 있습니다. 즉, 누구나 호출하거나 읽을 수 있으며, 자동으로 getter 함수가 생성됩니다(변수의 경우).

Q2: 'private' 함수나 변수는 무엇을 의미하나요?
A2: 'private'으로 선언된 함수나 변수는 해당 컨트랙트 내에서만 접근이 가능합니다. 상속받은 컨트랙트나 외부에서는 전혀 접근할 수 없습니다. 완전 은닉된 상태로 관리됩니다.

Q3: 'internal' 키워드는 어떻게 다릅니까?
A3: 'internal'은 해당 컨트랙트와 이를 상속한 자식 컨트랙트 내부에서는 접근 가능하지만, 외부에서는 접근이 불가능합니다. 즉, private와 public의 중간 정도이며, 상속 포함 내부 접근용입니다.

Q4: 'external' 함수란 무엇인가요?
A4: 'external'로 선언된 함수는 컨트랙트 외부에서만 호출 가능하며, 내부에서 바로 호출할 경우 오류가 발생합니다. 다만 내부에서 호출하려면 this.func() 형식으로 외부 호출로 우회할 수 있습니다. 변수에는 적용하지 않습니다.

Q5: 각각의 접근 제한자는 변수와 함수 선언에 어떻게 적용되나요?
A5:
- 변수: 기본적으로 'internal'입니다. 'public'을 선언하면 자동 getter가 생성됩니다. 'private'과 'internal' 변수는 직접 접근 불가하며, 함수 내에서만 접근 가능하므로 숨김이 됩니다.
- 함수: 네 가지 모두 사용 가능하며, 호출 가능 범위가 위 설명과 같습니다.

Q6: 언제 어떤 접근 제한자를 사용해야 하나요?
A6:
- 외부와 상호작용하는 함수는 'public' 또는 'external'로 구현합니다.
- 내부 로직에서만 사용되는 함수나 변수는 'internal' 또는 'private'으로 감춥니다.
- 상속을 고려하면 'private'보다 'internal'이 더 유연합니다.
- 외부에서 호출만 가능한 함수는 최적화 차원에서 'external'을 사용하는 것이 좋습니다.

Q7: 접근 제한자 간 호출 비용에 차이가 있나요?
A7: 'external' 함수는 calldata에서 직접 매개변수를 받아 gas 비용이 상대적으로 낮은 편입니다. 'public' 함수는 내부 호출 시마다 메모리를 거쳐야 해 약간 더 비용이 듭니다. 따라서 외부 호출 전용 함수는 'external' 사용하는 게 효율적입니다.

---

요약표:

| 접근 제한자 | 어디서 접근 가능? | 변수 허용 여부 | 기타 특징 |
|--------------|----------------------------------------|---------------|-------------------------------|
| public | 내부, 상속, 외부 모두 가능 | 가능 | 변수에 자동 getter 생성 |
| private | 선언한 컨트랙트 내에서만 | 가능 | 상속이나 외부 접근 불가 |
| internal | 선언 컨트랙트 + 상속 컨트랙트 | 가능 | 외부 접근 불가, 상속용 |
| external | 외부에서만 (내부 직접 호출 불가) | 불가 | 외부 호출 전용 함수에 적합 |
솔리디티(Solidity)는 이더리움 블록체인에서 스마트 계약을 작성하기 위한 프로그래밍 언어입니다.

이 언어에서 함수와 상태 변수의 가시성(visibility)을 정의하는 것은 매우 중요합니다.

가시성은 특정 함수나 변수가 다른 계약이나 외부에서 어떻게 접근될 수 있는지를 결정합니다.

솔리디티에서 제공하는 네 가지 주요 가시성 키워드는 `public`, `private`, `internal`, `external`입니다.

각 키워드의 차이점과 사용 방법에 대해 자세히 설명하겠습니다.

1. Public - 정의 : `public`으로 선언된 함수나 변수는 계약 외부와 내부 모두에서 접근할 수 있습니다.

- 특징 : - 모든 계약과 외부 사용자(EOA, Externally Owned Accounts)에서 호출할 수 있습니다.

- 상태 변수가 `public`으로 선언되면, 솔리디티는 자동으로 getter 함수를 생성하여 외부에서 해당 변수를 읽을 수 있게 합니다.

- 사용 예 : ```solidity contract Example { uint public value; function setValue(uint _value) public { value = _value; } } ``` 위의 예에서 `setValue` 함수는 외부에서 호출할 수 있으며, `value` 변수는 자동으로 getter가 생성되어 외부에서 접근 가능합니다.



2. Private - 정의 : `private`으로 선언된 함수나 변수는 해당 계약 내에서만 접근할 수 있으며, 상속받은 계약에서도 접근할 수 없습니다.

- 특징 : - 보안이 중요한 데이터나 로직을 숨기고 싶을 때 사용합니다.

- 상속받은 계약에서는 접근할 수 없기 때문에, 계약의 내부 구현을 보호하는 데 유용합니다.

- 사용 예 : ```solidity contract Example { uint private secretValue; function setSecretValue(uint _value) public { secretValue = _value; } function getSecretValue() private view returns (uint) { return secretValue; } } ``` 위의 예에서 `secretValue`는 `private`로 선언되어 외부 계약이나 사용자에게는 노출되지 않습니다.



3. Internal - 정의 : `internal`로 선언된 함수나 변수는 해당 계약 및 상속받은 계약에서 접근할 수 있습니다.

- 특징 : - 계약의 내부 로직을 공유하고 싶지만, 외부에서는 접근할 수 없도록 하고 싶을 때 사용합니다.

- 상속 관계에서 자주 사용되며, 코드 재사용성을 높이는 데 기여합니다.

- 사용 예 : ```solidity contract Base { uint internal baseValue; function setBaseValue(uint _value) internal { baseValue = _value; } } contract Derived is Base { function updateBaseValue(uint _value) public { setBaseValue(_value); } } ``` 위의 예에서 `setBaseValue` 함수는 `internal`로 선언되어 `Derived` 계약에서 호출할 수 있습니다.



4. External - 정의 : `external`로 선언된 함수는 계약 외부에서만 호출할 수 있으며, 계약 내부에서는 호출할 수 없습니다.

- 특징 : - 외부에서 호출될 목적으로 설계된 함수에 적합합니다.

- `external` 함수는 인자를 전달할 때 가스 비용이 더 적게 들 수 있습니다.

- 사용 예 : ```solidity contract Example { function externalFunction(uint _value) external { // 외부에서 호출되는 함수 } function internalCall() internal { externalFunction(

10); // 내부에서 호출할 수 없음 } } ``` 위의 예에서 `externalFunction`은 외부에서만 호출할 수 있으며, 내부에서는 직접 호출할 수 없습니다.

결론 솔리디티에서의 가시성 키워드는 계약의 보안과 구조를 설계하는 데 중요한 역할을 합니다.

각 키워드는 특정 상황에 맞게 사용되며, 개발자는 계약의 요구 사항에 따라 적절한 가시성을 선택해야 합니다.

`public`, `private`, `internal`, `external`의 차이를 이해하고 활용함으로써 더 안전하고 효율적인 스마트 계약을 작성할 수 있습니다.

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