contract BasicToken is ERC20Interface{
    using SafeMath for uint256;
    //using A for B : B 자료형에 A 라이브러리 함수를 붙여라.
    //dot(.)으로 호출 할수 있게됨.
    //ex) using SafeMath for uint256 이면 uint256자료형에 SafeMath 라이브러리 함수를 .을 이용해 사용가능하다는 뜻 => a.add(1) ,b.sub(2)를 사용가능하게 함.

    mapping (address => uint256) balances;


    uint totalSupply_;

// 토큰의 총 발행량을 구하는 함수.
  function totalSupply() public view returns (uint){
    return totalSupply_;
  }

  function transfer(address _to, uint _value) public returns (bool){
    require (_to != address(0));
    // address(0)은 값이 없다는 것.
    // require란 참이면 실행하는 것.
    require (_value <= balances[msg.sender]);
    // 함수를 호출한 '나'의 토큰 잔고가 보내는 토큰의 개수보다 크거나 같을때 실행.

    balances[msg.sender] = balances[msg.sender].sub(_value);
    //sub는 뺄셈. , 보낸 토큰개수만큼 뺀다.
    balances[_to] = balances[_to].add(_value);
    //add는 덧셈. , 받은 토큰개수 만큼 더한다.

    emit Transfer(msg.sender,_to,_value);
    // Transfer라는 이벤트를 실행하여 이더리움 블록체인상에 거래내역을 기록한다. 물론, 등록됬으므로 검색 가능.
    return true; //모든것이 실행되면 참을 출력.

  }

  function balanceOf(address _owner) public view returns(uint balance){
    return balances[_owner];
  }

}
//해당 컨트랙트는 인터페이스에서 선언한 함수들의 기능을 구현해준다.
function totalSupply() public view returns (uint){
  return totalSupply_;
}

// 토큰의 총 발행량을 구하는 함수.