함수란?
입력된 값이 작성된 함수의 내용을 통하여 결과 값을 출력하는 것입니다. 이를 통하여 반복되는 코드를 함수 호출로 인하여 코드를 짧고 가독성 좋게 작성이 가능합니다. 잘 짜인 함수는 재사용성이 향상됩니다.
함수의 구조는 아래와 같습니다.
function name (x,y,z...) option returns (a,b,c..){
함수의 내용
}
name는 함수의 이름이고 (x, y, z..)는 입력 매개 변수(Parameter), option은 접근 제어자, (a, b, c..)는 출력 매개 변수(Return 값)입니다.
함수에 따라 Parameter와 Return값이 존재하지 않을 수도 있는데 그 예시는 아래와 같습니다.
1. Parameter와 Return값이 없는 경우
uint public a=1;
function inputA () public {
a=5;
}
inputA의 함수를 사용하면 1이었던 a의 값이 5로 저장됩니다.
2. Parameter는 있고 Return값이 없는 경우
uint public a = 1;
function inputB(uint _value) public{
a=_value;
}
inputB의 함수를 사용하면 uint형의 입력을 받고 1이었던 a의 값으로 저장됩니다.
3. Parameter도 있고 Return값이 있는 경우
uint public a=1;
function inputC(uint _value1, uint _value2) public returns(uint){
a=(_value1*_value2);
return a;
}
inputC의 함수를 사용하면 uint형의 입력을 받고 함수의 내용에 따라 입력받은 _value1과 _value2를 곱한 값이 a에 저장됩니다.
접근제어자
- external/internal/public/private
외부 컨트랙트에서 이 함수에 접근할 수 있는지 설정하는 접근제어자입니다. 이를 가시성이라고 하는데 external과 public은 컨트랙트 밖에서도 접근이 가능하도록 해 주고 internal은 내부와 상속된 컨트랙트에서 접근이 가능하고 private은 내부에서만 접근이 가능합니다.
function input(uint _value1, uint _value2) private returns(uint){
uint a;
a=_value1*_value2;
return a;
}
function get() constant public returns (uint){
return a;
}
위의 예시의 경우 input 함수가 private으로 선언이 되었으므로 get함수에서 a에 접근하지 못하여 오류가 발생합니다.
상속의 경우는 추후에 배우도록 하겠습니다.
- constant
constant가 명시된 함수는 호출이 되는 경우 상태 변수의 값을 변경하지 않겠다는 함수입니다.
uint public a=2;
function up() constant public returns (uint){
a = a*5;
return a;
}
위의 up함수의 경우 constant 함수로써 a의 값을 변경하지 않고 가져오기만 하게 됩니다. 따라서 함수 발생 시 a의 값을 읽어와 출력은 10이 되고 a의 값은 여전히 2를 유지합니다.
- payalbe
payable을 작성한 함수만이 함수를 통하여 다른 지갑이나 컨트랙트에서 이더를 송금받을 수 있습니다.
아래와 같이 조건에 따라 이더의 송금을 결정하는 함수를 작성할 때 사용됩니다.
function becomeRichest() public payable returns (bool) {
if (msg.value > mostSent) {
richest.transfer(msg.value);
richest = msg.sender;
mostSent = msg.value;
return true;
} else {
return false;
}
}