visibility 는 4가지가 있다.
internal, private 는 컨트랙트 내부에서 접근 가능.
public 은 어디에서나 접근 가능.
external 은 외부에서 접근 가능.
먼저, 상태변수에 4가지 visibility 를 적용시키면..
contract visibility1 {
uint public a = 5;
uint private b = 5;
uint internal c = 5;
uint external d = 5;
}
사진과 같이 external 은 사용할 수 없다고 경고가 뜬다.
이미 컨트랙트 내부에서 선언하고 있기 때문에, external 는 사용 불가능하다.
그래서 external d 를 지우고 컨트랙트를 배포하면,
이렇게 public 으로 선언한 상태변수 a 만 뜬다.
여기서, private 한 상태변수 b.
그리고, internal 한 상태변수 c.
이 두개의 상태변수에 접근하기 위해선 어떻게 해야할까?
private, internal 하기 때문에, 컨트랙트 내부에서만 b 에 대한 접근이 가능하다.
function getB() public view returns(uint) {
return b;
}
function getC() public view returns(uint) {
return c;
}
그래서 위와 같은 함수를 컨트랙트 내에 만들어 사용하면 정상적으로 b,c 에게 접근이 가능하다.
이건 상태변수 선언뿐만 아니라, 함수에서도 적용된다.
아래와 같이 함수를 만들었다.
contract visibility1 {
uint a = 5;
function private1() private view returns(uint){
return a;
}
function public1() public view returns(uint){
return a;
}
function internal1() internal view returns(uint){
return a;
}
function external1() external view returns(uint){
return a;
}
}
그리고 이 컨트랙트를 배포해보면, internal 과 private 함수는 보이지 않는다.
이 컨트랙트를 배포한 나를 외부 취급하는 것이다.
public, internal 함수만 사용이 가능하다.
상속은 다른 컨트랙트에서 선언한 변수나 함수를 다른 컨트랙트에서 사용할 수 있도록 하는 것을 말한다.
다음과 같이 아빠, 아들 컨트랙트를 각각 하나씩 배포했다.
그리고, "상속받는 컨트랙트명 is 상속주는 컨트랙트명" 문법으로
아빠 컨트랙트를 아들 컨트랙트로 상속해왔다.
contract Father{
uint a = 5;
function getA() public view returns(uint) {
return a;
}
}
contract Son is Father{
}
그리고 아들 컨트랙트를 배포하면, 아빠 컨트랙트에 있는 상태변수와 함수를 그대로 사용할 수 있다.
그리고 아빠 컨트랙트에 컨트랙트의 주소값을 반환받는 함수를 만들었다.
function getAddress() public view returns(address) {
return address(this);
그리고 이 함수를 아빠와 아들 컨트랙트에서 각각 실행시켜 보았다.
아들이 아빠의 함수를 상속받았지만, 주소값은 다르다.
상속받으면 상속받은 코드를 그대로 내 컨트랙트에서 사용한다고 생각하면 된다.
그래서 아들은 자기 자신의 컨트랙트 주소를 반환한 것이다.
그렇다면, 상속에서의 visibility 는 어떻게 적용될까.
private : 상속 받아도 컨트랙트 내부가 아니므로 사용 불가.
internal : 상속 받은 아이가 사용 가능.
public : 어디서든 사용 가능.
external : 상속 받으면 내부이므로 외부가 아니라 사용 불가.
private , internal 의 차이점은, private 는 상속된 아들 컨트랙트에서도 접근이 불가능하다는 것.
external 역시 상속받아도, 외부가 아닌 이상 접근이 불가능.
상속받은 함수를 덮어씌워 변경해 사용할때를 overriding 이라고 한다.
사용 문법은, 오버라이딩할 함수에 overriding 상태를 선언.
오버라이딩 당하는 함수는 virtual 상태를 선언.
contract mom{
function A() public pure virtual returns(string memory){
return "mom";
}
}
contract son is mom(){
function A() pure public override returns(string memory){
return "son from mom";
}
}
엄마 컨트랙트를 상속받았고, A라는 함수를 오버라이드 한다고 선언.
그리고 return 값을 마음대로 바꾸어 사용했다.
이렇게 함수를 가져와 덮어씌워 사용하는 것을 오버라이드 라고 한다.