지난 강의에서 function을 정의 하는 법을 배워봤습니다.
function 이름 () public { // (public, private, internal, external) 변경가능.
// 내용
}
function의 접근제어자는 public, private, internal, external 이 있어요.
사실 접근제어자는 변수 앞에도 쓰이기도 한답니다.
1강에서 hi 라는 변수를 정의할때 도 쓰였답니다.
string public hi = "Hello solidity";
1. public : 어디서든 접근이 가능하다.
contract Lec5 {
uint256 public a = 3;
}
아주 간단하게, 변수에 public을 넣어 봤어요.
Lec5라는 스마트 컨트랙을 배포하니, a 라는 변수가 생기며, 클릭하니 값이 나오는걸 확일 할 수 있습니다.
반면에, public 과 반대되는 private을 한번 넣어 볼게요.
private이니 외부에서 접근이 힘들겠죠.
contract Lec5 {
uint256 private a = 3;
}
배포를 해보니 public 과는 다르게 a 라는 변수조차 접근 하기 힘듭니다.
즉 public을 정의 해줌으로써, 어디서든 접근이 가능한 getter 함수를 자동으로 만들어 주었습니다.
그러면 좀 더 나아가서, 두개의 스마트 컨트랙을 사용해서 public 예제를 볼게요.
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
contract Public_example {
uint256 public a = 3;
function changeA(uint256 _value) public {
a =_value;
}
function get_a() view public returns (uint256) {
return a;
}
}
contract Public_example_2 {
Public_example instance = new Public_example();
function changeA_2(uint256 _value) public{
instance.changeA(_value);
}
function use_public_example_a() view public returns (uint256) {
return instance.get_a();
}
}
Public_example 과 Public_example_2 라는 두개의 스마트 컨트랙이 있습니다.
저희는 Public_example_2 를 사용하요 Public_example 에 접근 할 것입니다.
Public_example_2 에 도드라지게 눈에 뛰이는 Public_example instance = new Public_example(); 인스턴스가 보일것입니다.
저희는 이 인스턴스를 통해서 Public_example 컨트랙에 접근이 가능하답니다.
즉, 인스턴스는 Public_example 의 분신이라고 간단하게 일단 생각하시면 됩니다.
( 나중 강의에서 인스턴스에 대해 설명할게요)
Public_example 컨트랙은 당연히 모든 부분이 public 이니 쉽게 접근이 가능하답니다.
한가지더,
function use_public_example_a() view public returns (uint256) 에서 view 라는 키워드를 처음 보셨을거예요.
이 키워드에 대해서는 다음 강의에 설명드릴께요
2. private: 오직 private이 정의된 스마트 컨트랙에서만 접근가능
contract Lec5 {
uint256 private a = 3;
}
위에 예제에서 보셨듯이, 이 스마트 컨트랙을 배포를 하면 a 라는 변수가 리믹스 상에서 보여지지가 않아요.
왜냐하면, 접근을 하려면 오직 Lec5안에서만 가능하기 때문이죠.
이와같이, Lec5_2처럼 instance 를 만들어서도 접근이 불가능하답니다.
contract private_example {
uint256 private a = 3;
function get_a() view public returns (uint256) {
return a;
}
}
위에 private_example을 배포를 하면, a 변수는 보이지 않고 get_a의 function 만 보입니다.
물론 get_a는 public이니 보이는거고 a는 private이니 보이지 않아요.
그러나, private 특성으로 저희는 private_example라는 같은 스마트 컨트랙에 있는 get_a function 을 통해서
private a 변수를 접근 해서 값을 불러 왔답니다.
이런식으로 private을 사용하면, 본 변수 값은 은닉화 시킬 수 있답니다.
3. external : 오직 밖에서만 접근 가능.
external 은 public과 성향이 비슷한데요, 한가지만 다르답니다.
external이기에, external이 정의된 스마트 컨트랙 내에서는 사용이 불가능 하답니다(private과 반대되죠)
contract external_example {
uint256 private a = 3;
function get_a() view external returns (uint256) {
return a;
}
}
contract external_example_2 {
external_example instance = new external_example();
function external_example_get_a() view public returns (uint256) {
return instance.get_a();
}
}
external_examle 의 get_a 는 external 로 정의 되어 있기에, external_examle 내에서는 접근이 불가능해요.
그러나, external_examle _2는 전혀 별개의 스마트 컨트랙이기에 가능하답니다.
4. internal : 오직 internal이 정의된 스마트 컨트랙 내에서, 상속받은 자식 스마트 컨트랙에서 접근 가능.
internal 은 private 과 비슷해요, private에서 한가지 기능(상속받은 자식 접근 가능)이 더 추가 되었다고 생각하시면 됩니다.
상속 부분 강의할때 자세하게 다루어 볼게요
public: 모든곳에서 접근 가능
external: public 처럼 모든곳에서 접근 가능하나, external이 정의된 자기자신 컨트랙 내에서 접근 불가
private: 오직 private이 정의된 자기 컨트랙에서만 가능( private이 정의된 컨트랙을 상속 받은 자식도 불가능)
internal: private 처럼 오직 internal 이 정의된 자기 컨트랙에서만 가능하고, internal이 정의된 컨트랙을 상속받은 자식들도 접근이 가능
비디오 꼭 참고 하셔야 합니다.