헷갈리는 가시성. 제대로 정리하고 넘어가보려 한다.
상태 변수 접근 제어자
- public : Getter Function 을 컴파일러가 자동으로 만들어준다는 특징이 있다. 외부에서 접근을 하게 되면
this.x
의 형식으로 가능하고, 내부에서 접근하면 직접 x
로 가능하다.
Getter Function은 external 가시성을 갖고 있기 때문에, 선언된 컨트랙트에서 this.x()
형식으로 접근해도 사용은 가능하다. 상태변수로 평가될 것이냐, 함수로 평가될 것이냐의 문제다.
- internal : 정의된 컨트랙트 내부나 상속된 컨트랙트를 통해서만 접근이 가능하다. 외부에서 접근은 불가능하다. 접근 제어자를 지정하지 않고 변수를 선언하면 되면 기본값으로 설정된다.
- private : internal 과 비슷하지만 상속된 컨트랙트에서 접근이 불가능하다.
함수 내에서 선언하는 변수에는 가시성 기능을 제공하지 않는다.
internal
과 private
은 다른 컨트랙트에서 접근이나 수정을 불가능하게 하기 위함이고, 블록체인 외부의 세계에서는 충분히 관찰 가능하니 주의해야 한다.
함수 접근 제어자
- external : 컨트랙트의 인터페이스 중 하나. 다른 컨트랙트나 트랜잭션으로부터 호출되어진다. 꼭
this.f()
의 형식으로 사용되게 된다.
- public : 컨트랙트 내부나 메시지콜을 통해서 사용될 수 있다.
- internal : 현 컨트랙트나 상속된 컨트랙트에서만 접근이 되어진다. 절대 외부에서 접근될 수 없다.
- private : internal 과 거의 비슷하지만 상속된 컨트랙트에서 접근이 불가능하다는 차이가 있다.
컨트랙트 밖에서 작성되는 함수(free function)는 internal 가시성을 갖는다.