728x90

이 글은 인프런 [따라하면서 배우는 고박사의 유니티 기초] 강의를 수강하고 정리한 글입니다.

 

[지금 무료] 따라하면서 배우는 고박사의 유니티 기초 | 고박사 - 인프런

고박사 | 유니티로 게임을 개발하고 싶은 초보자를 대상으로 하며, 유니티 설치부터 2D/3D 게임 개발에 필요한 기초 지식까지 자세하게 설명합니다. (강의에 사용되는 모든 리소스는 영상 상단의

www.inflearn.com


2D 확장 기능 : 2D-extras 개요

Tilemap 확장 기능이 들어있는 Extras는 2D 게임 개발에 유용한 스크립트 모음으로 유니티 내부가 아닌 깃허브에서 검색하여 압축파일을 다운받아서 압축을 푼다.

 

GitHub - Unity-Technologies/2d-extras: Fun 2D Stuff that we'd like to share!

Fun 2D Stuff that we'd like to share! Contribute to Unity-Technologies/2d-extras development by creating an account on GitHub.

github.com

아래의 README에서는 2D-extras에 타일맵, 브러쉬, 추가적인 타일들에 대한 정보가 기제되어 있다. 

실습자의 유니티 버전에서는 해당 파일이 컴파일 오류가 발생했기 때문에 다른 방법으로 2D-extras 설치를 진행하였다. 강의에서 진행하는 유니티 버전에서는 2D-extras가 공식 지원을 하지 않아 추가 설치를 해야했다면 이제는 공식지원이 된다.

 

Edit > Project Setting 에 들어가면 Package Manager을 선택하여 enable Pro-release Packages 를 선택한다.

 

이후 windows > project manager을 선택하면 2D Tilemap Extras를 확인할 수 있고, 설치가 되어 있지 않다면 설치 후 실습을 진행하도록 하겠다. 

 

게임월드에서는 아이템처럼 상호작용을 통해 게임월드에서 사라지거나 플레이어에게의 기능 제공 등과 같이 게임 오브젝트의 배치도 필요하다. 충돌하면 사라지는 스크립트를 작성하고 게임화면에 오브젝트를 하나 생성한다.

using UnityEngine; 

pulic class ItemCollisionCheck : MonoBehaviour
{
	private void OnTriggerEnter2D(Collider2D collision)
    {
    	Destroy(gameObject);
    }
}

생성한 오브젝트에 circle collider 2D와 스크립트를 적용한다. is trigger도 체크해준다. 

item_coin 오브젝트를 assets으로 드래그해 prefab으로 생성해준다. 이때 prefab을 드래그하여 게임 오브젝트를 생성하고 배치할 수도 있지만, 많은 오브젝트를 작업할 경우에 비효율적이다. 이때 사용하는 기능이 prefab brush 이다.


Brushes - Prefab Brush

​prefeb brush는 prefeb을 Tile Asset과 같이 Tilemap 오브젝트에 쉽게 배치할 수 있는 기능으로 project view > "+" > brush > prefab brush 에서 확인할 수 있다고 하였지만 현재 유니티 2022.3.22f1 버전에서는 제거된 기능이여서 실습을 할 수 없었다.

 

Prefab brush는 prefab 하나를 등록해서 사용하는 것으로 prefab에 하나의 prefab을 등록하면 tilemap palette 에서 브러쉬를 선택할 수 있게 된다. 

이렇게 생성된 prefab brush를 이용해서 페인트 툴로 prefab을 화면에 편하게 배치할 수 있으며, 배치된 prefab들을 타일맵의 자식으로 생성된다. 

Prefab Random brush는 brush에 여러 개의 prefab을 등록시킬 수 있는데 등록된 prefab 중 임의의 prefab이 배치된다. 

 

coin prefab에 오브젝트가 부딪치면 코인이 사라지는 것을 확인할 수 있다.


Tiles - Animated Tile

Animated Tile은 배치된 tile이 애니메이션을 재생하도록하는 Tile Asset 으로 Project View > “+” > 2D > Tiles >  Animated Tile 을 이용해 생성할 수 있다.

 

입력하는 숫자만큼 애니메이션 되는 이미지를 등록할 수 있다. 4개의 이미지를 등록하였다. 이후 window > 2D > tile palette 에 들어가서 생성한 animated tile asset을 tile palette에 등록한다.

영역들이 바뀌는 것을 확인할 수 있다.


Tiles - Pipeline Tile

동일한 Pipeline Tile을 배치했을 때 이웃한 타일의 개수에 따라 타일의 이미지가 바뀌는 Tile Asset이다.

Project View > “+” > Tiles > Pipeline Tile 으로 생성할 수 있으며, Pipeline Tile에는 5개의 이미지를 등록할 수 있다.

 

주변에 배치된 개수에 따라서 설정한 이미지대로 바뀌는 것을 확인할 수 있다. 


Tiles - Random Tile

등록한 이미지 중에 임의의 이미지가 나오게 하는 Tile Asset이다. Project View > “+” > Tiles > Random Tile 로 타일을 생성하게 된다.

어떤 이미지가 배치될 지 알 수 없다.


Tiles - Terrain Tile

Pipeline Tile과 비슷하지만 세부적으로 설정이 가능한 Tile Asset이다. Project View > “+” > 2D >  Tiles > Terrain Tile 로 생성하면 inspector view에서 확인할 수 있듯이, 다양한 케이스에 대해서 설정할 수 있는 옵션들을 볼 수 있다. 

주변 타일들의 상황에 따라서 terrain asset이 설정되는 것을 확인할 수 있다. 


Tiles - Rule Tile

본인이 원하는 조건을 직접 설정할 수 있는 Tile Asset으로 앞 Tile들의 통합 버전과 같다.

Project View > “+” > 2D > Tiles > Rule Tile 를 생성한다. 여기서 sprite뿐 아니라 game object를 등록할 수도 있으며, Tiling rules에 원하는 조건을 추가하여 만들 수 있다.

주변 오브젝트 배치에 따른 이미지를 등록하거나 게임 오브젝트를 등록할 수 있으며, output에 있는 정보를 이용해서 random이나 animation 타입으로 설정할 수 있다.

X는 주변에 오브젝트가 하나도 없을 때를 뜻하기 때문에 주변에 오브젝트가 없을 때, fourside 이미지를 설정한다. 이외에 여러 가지 룰을 추가해서 rule tile을 tile palette에 등록한다. 

 

 

실습을 진행하면서 unity 2022.3.22f1 버전에서는 prefab brush, pipeline tiles, random tiles, terrian tiles 를 유니티에서 더 이상 지원하지 않게 되어서 실습을 하지 못했던 점이 아쉽다..

728x90

이 글은 인프런 [따라하면서 배우는 고박사의 유니티 기초] 강의를 수강하고 정리한 글입니다.

 

[지금 무료] 따라하면서 배우는 고박사의 유니티 기초 | 고박사 - 인프런

고박사 | 유니티로 게임을 개발하고 싶은 초보자를 대상으로 하며, 유니티 설치부터 2D/3D 게임 개발에 필요한 기초 지식까지 자세하게 설명합니다. (강의에 사용되는 모든 리소스는 영상 상단의

www.inflearn.com


Tilemap 개요

Tilemap은 타일 형태의 리소스를 배치해 게임 월드를 표현하는 방법으로 유니티에서는 Tilemap을 쉽게 제작하기 위해 Tilemap editor을 제공하고 있다. 

유니티에서 제공하는 Tilemap editor은 Tile palette, Tile Asset, Grid 게임 오브젝트, Tilemap 게임 오브젝트가 있다. 

  • Tile palette

Tilemap 오브젝트에 배치할 Tile Asset들을 등록하는 저장소로 등록된 Tile Asset을 여러 속성에 따라 게임 월드에 배치하거나 삭제할 수 있다. 

  • Tile Asset

map에 배치할 수 있는 하나의 타일로 팔레트에 짜두는 물감과 같은 역할이다. 

  • Grid Object

자식으로 배치되는 Tilemap 오브젝트들을 관리하는 역할로 cell layout, cell swizzle 정보를 이용해 배치되는 맵의 방식을 Rectangle, Hexagon, Isometric, Isometric Z As Y 등으로 설정할 수 있다.

  • Tilemap Object

Tile Asset을 배치하는 공간으로 실제 게임에 보여지는 타일 형태의 케임 월드로 Grid object의 자식으로 여러 개의 Tilemap 오브젝트들의 등록이 가능하다. 레이어를 구분해서 진행

 


Tile Palette

Tilemap palette 생성 편집은 Tile palette view에서 할 수 있으며, window > 2D > Tile Palette 를 통해서 메뉴를 열 수 있다.

새로운 Tile palette를 생성할 때 

  • name : 팔레트의 이름
  • Grid : 타일 배치 방식으로 Rectangle, Hexagon, Isometirc, Isometric Z As Y
  • Cell size : 셀의 크기로 Automatic, Manual

항목들을 선택하고 Tile palette를 생성하게 되면 저장하는 위치를 설정하게 되는데 현재 프로젝트 내부에서 사용하는 Tile palette, Tile Asset 등과 같은 파일은 프로젝트 외부에 저장하지 않도록 유의해야한다. 


Tile Asset

Tile Asset은 유니티 2022.3.22f1 버전 기준으로 Project View > "+" > 2D > Tiles 로 생성할 수 있으며, assets에 있는 tile들을 Tile palette에 드래그 드롭으로 생성할 수 있다. Tile palette와 동일하게 프로젝트 외부에 저장하지 않도록 유의해야한다. 

 

  • sprite : 현재 Tile Asset이 보여지는 이미지
  • color : 이미지 색상
  • Collider Type : 충돌 속성 (None, Sprite, Grid)

Tile Asset 생성이 완료되었다면, Tile palette에 등록해야 한다. 


Tilemap 오브젝트

Tile Asset 배치를 위해 GameObject > 2D Object > Tilemap 생성한다. 생성하면 Grid game object와 자식으로 tilemap object가 배치된 것을 확인할 수 있다. 

Grid Game Object는 현재 자식으로 있는 타일맵 게임오브젝트들을 관리하는 역할을 하며 여러 개의 타일 맵을 자식으로 가지고 관리할 수 있다. 

타일 맵 오브젝트 경우에 게임에서 충돌이 가능하고 실제 배치되는 플랫폼 타일, 배경으로 사용되는 타일, 아이템 타일 등과 같이 여러개로 나누어 제작하게 된다. 

Tilemap object에는 Tilemap component와 Tilemap Renderer conponent가 있다.

 

  • Tilemap component

현재 타일맵 오브젝트에 대한 기본 설정으로 모든 타일의 색, 각 타일의 중심점, 방향 등을 설정하며, scene view에서 현재 타일맵 오브젝트에 표현될 타일들을 그릴 수 있다. 

  • Tilemap Renderer conponent

현재 타일맵 오브젝트가 화면에 그려지는 방법에 대해 설정할 수 있다. (meterial, 정렬 기준, 정렬 순서 등)

Tilemap의 생김새는 scene view를 통해서 확인할 수 있으며, tilemap의 생김새를 결정하는 것은 grid game object에 는 grid component이다. 셀 사이즈나 레이아웃, 스위츠 정보를 이용해서 생김새를 바꿀 수 있다. 

tilemap 기본 Rectangular 이 아닌 다른 4가지로 선택이 가능하며 Grid를 선택한 상태로 타일맵을 생성하면 생성하는 타일맵의 정보로 Grid 정보가 바뀌기 때문에 타일맵을 선택하지 않고 생성해야한다. 

 

나머지 Tilemap의 Grid 속성값은 다음과 같다.

(좌) Hexagonal Point Top tilemap   (우) Hexagonal Flat Top tilemap  
(좌) Isometric Tilemap (우)  Isometric Z As Y Tilemap 

Isometric Z As Y Tilemap은 기존의 Isometric과 동일하게 보여지지만 높이를 설정할 때 유용하게 활용할 수 있다. 


Tilemap 에 Tile Asset 배치

위에 도구들은 차례롤 왼쪽부터 다음과 같다.

 

Select an area of Grid (단축키:S)

Tile palette 나 Tilemap 오브젝트(scene view)에 있는 타일을 선택하는 기능

Move selection with active brush (단축키:M)

Tile palette 나 Tilemap 오브젝트(scene view)에 있는 선택된 타일을 이동하는 기능 (* Tile palette 내부에 있는 Tile Asset을 수정할 때는 edit 버튼을 누르고 한다.)

 

Paint with active brush(단축키:B)

Tile palette 에 선택한 타일을 Tilemap 오브젝트(scene view)에 배치하는 기능

edit를 해제한 상태로 브러쉬를 눌러 오브젝트를 선택한 후 마우스로 배치하고자하는 위치에 클릭하면 배치된다. 

 

Paint a filled box with active brush(단축키:U)

Tile palette에서 선택한 타일을 Tilemap 오브젝트(scene view)에 배치하는 기능 

사각형 형태의 드래그한 범위만틈 배치하는 기능으로 shift를 누르고 사용하는 경우 범위에 존재하는 모든 타일을 삭제하는 기능이 된다. 

 

Pick or marquess select new brush (단축키:I)

Tile palette 나 Tilemap 오브젝트(scene view)에 있는 타일을 복제해서 선택하는 기능

 

Erase with active brush (단축키:D)

Tile palette 나 Tilemap 오브젝트(scene view)에 있는 타일을 삭제하는 기능

 

Flood fill with active brush (단축키:G)

Tile palette에서 선택한 타일을 Tilemap 오브젝트(scene view)에 배치하는 기능으로 빈공간에 사용하면 빈공간을 채운다. 

이미 타일이 존재하는 곳에는 사용하면 연결되어 있는 동일한 타일들을 교체하는 기능을 한다. 

이렇게 게임 월드를 만들 수 있다.


Tilemap 충돌 처리

타일 맵으로 생성된 게임 월드의 경우 타일맵 오브젝트 단위로 충돌처리 설정이 가능하다. 타일맵 단위로 충돌 처리를 할 수 있기 때문에 하나의 gird 오브젝트가 여러 개의 타일맵 오브젝트를 관리하게 되고 타일뱁 오브젝트를 여러개를 하나의 게임 월드로 사용하게 된다. 

Tilemap Collider 2D 컴포넌트는 타일맵의 충돌 처리를 담당하는 컴포넌트로 타일맵 오브젝트의 충돌 처리를 설정할 수 있다. tilemap collider 2D 컴포넌트를 추가하면 초록색의 실선으로 충돌 범위를 표시한다.

 

Tile Asset을 선택하여 collider type에서 sprite는 생김새대로 충돌처리가 되는 것이고, grid는 사각형 형태로 충돌처리가 되는 것이다. 따라서 블록들은 모두 grid 로 설정하고 파이프는 sprite로 설정해주었다. 

 

충돌 처리를 최적화하기 위해 composite collider 2D 컴포넌트를 추가한다. 

tilemap collider 2D 컴포넌트에 used by composite를 체크해주고 Rigidbody 2D의 body type을 static으로 설정해주면 충돌범위가 하나의 충돌 범위로 설정된다. 

 

충돌처리가 잘 적용되었는지 확인을 위해 오브젝트를 하나 생성해서 capsule collider 2D 컴포넌트와 rigidbody 2D 컴포넌트를 추가해주었다. 충돌처리가 잘 되는 것을 확인할 수 있다.

728x90

이 글은 인프런 "솔리디티 깨부수기" 6강 강의를 듣고 정리한 글입니다. 

 

[지금 무료] 솔리디티 깨부수기 | D_One - 인프런

D_One | 이 강의를 통해서, 스마트 컨트랙 제작을 위한 솔리디티 언어를 배울수 있습니다., 코딩이 처음인 분들도 OK! 처음 배우는 솔리디티, 쉽게 시작해보세요. 강의 주제 📖 [사진] 이 강의에서

www.inflearn.com


VIEW & PURE

function use_public_example_a() view public returns (uint256) {
   //...
}

이전 강의에서 get_a() 함수에 view라는 것을 처음 보았는데, 해당 자리는 view 혹은 pure이 들어갈 수 있다. 이는 pulbc 과 같은 접근 제한자 앞 이나 뒤 어디든 들어 갈 수 있다

 

view 

함수 밖에 있는 변수들을 읽을 수 있지만 변경이 불가능할 때 사용하는 것이 view이다. 

pragma solidity >=0.7.0 <0.9.0;

contract View_example{
     uint256 public a = 1;
    
    function read_a() public view returns(uint256){
        return a+2;
    } 
}

위의 예시 코드에서 함수 밖에 변수에 값이 저장되고 read_a 함수에 view를 명시를 했다. read_a 함수는 a 변수의 값을 읽어 올 수는 있지만 변경이 불가능하기 때문에 배포를 한 뒤에도 a의 값은 변경되지 않고 그대로 임을 확인할 수 있다. 

 

 

 

pure

함수 밖의 변수들을 읽지도 못하고 변경이 불가능할 때, 사용하는 것으로 외부 변수 값을 가지고 올 수 없기 때문에 함수 내에서만 쓸 수 있는 로컬변수들로만 구성된 것이라 볼 수 있다. 

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;
contract Pure_example{
	uint256 public a = 1;
    
    function read_a() pure public returns(uint256){
        uint256 a = 4;
        return a+2;
    } 
}

위의 예시에서는 pure로 정의한 함수는 외부 변수를 읽어올 수 없기 때문에 로컬변수 a만 읽어올 수 있다. 로컬변수 a 는 4 을 대입받고, 2를 더해서 마지막에는 6로 리턴하게 된다. 

이외에 viwe 와 pure 둘다 명시 안 할 때는 함수 밖의 변수들을 읽어서, 변수를 변경할 때 명시를 하지 않는다.

 

 

728x90

이 글은 인프런 "솔리디티 깨부수기" 5강 강의를 듣고 정리한 글입니다. 

 

[지금 무료] 솔리디티 깨부수기 | D_One - 인프런

D_One | 이 강의를 통해서, 스마트 컨트랙 제작을 위한 솔리디티 언어를 배울수 있습니다., 코딩이 처음인 분들도 OK! 처음 배우는 솔리디티, 쉽게 시작해보세요. 강의 주제 📖 [사진] 이 강의에서

www.inflearn.com


public

public은 완전히 오픈되어서 모든 곳에 접근이 가능하다. 아래와 같이 코드를 작성하고 배표를 하면 다음과 같이 값을 확인할 수 있다. 

contract Lec5 {
    uint256 public a = 3;
}

 

두 개의 스마트 컨트랙을 사용해서 public 예제를 이용해서 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 스마트 컨트랙안에는 changeA와 get_a 함수가 있는데 get_a 함수에 들어가 있는 view는 pure와 같이 다음 강의에서 다룰 예정이다. 

 

Public_example_2 를 사용하여 Public_example 스마트 컨트랙에 접근하려고 하는데, 접근하기 위해서는 인스턴스화를 해야한다. 인스턴스를 정의하는 부분은 Public_example_2 에서 Public_example instance = new Public_example(); 식으로 인스턴스를 정의하는 것을 알 수 있다.

 

public_example2를 배포하여 확인을 하면,  changeA_2에 10을 넣으면 10이 리턴하는 것을 보고 public으로 접근 제한자를 설정했기 때문에 모든 곳에 접근할 수 있다는 것을 알 수 있다. 

 


private

private은 오직 private이 정의된 자기 컨트랙에서만 가능하며,  private이 정의된 컨트랙을 상속 받은 자식도 접근이 불가능하기 때문에 아래와 같이 코드를 입력하고 배포를 했을 때, 변수 접근이 되지 않는 것을 확인할 수 있다. 

contract Lec5 {
    uint256 private a = 3;
}

 

이유는, private으로 정의한 변수에 접근을 하려면 오직 Lec5안에서만, private 정의된 스마트 컨트랙 내에서만 가능하다. 배포한 것은 스마트 컨트랙 내가 아니라 밖이기 때문에 접근이 불가능하다.

 

contract Public_example {
    uint256 public a = 3;
    
    function changeA(uint256 _value) private {
        a =_value;
    }
    function get_a() view private returns (uint256)  {
        return a;
    }
}

위에 public_example 컨트랙 예시에서 changeA함수와 get_a 함수의 접근 제한자를 private로 하게 되면, changeA_2 함수에서 인스턴스 changeA 값에 접근을 할 수 없어서 에러가 나게 된다.

 

이런식으로 private을 사용하면, 본 변수 값은 은닉화 시킬 수 있다.

 


external

external은 public과 유사하며, 모든 곳에 접근이 가능하나 external이 정의되어 있는 자기 컨트랙 내에서는 접근이 불가하여 자기 컨트랙이 아닌 다른 컨트랙이 접근할 때 사용된다. 

 

contract Public_example {
    uint256 public a = 3;
    
    function changeA(uint256 _value) external {
        a =_value;
    }
    function get_a() view external returns (uint256)  {
        return a;
    }
}

위에 public_example 예시를 external 접근 제한자로 바꾸고 배포를 하면 당연히 작동이 된다. 이유는 external이 정의된 스마트 컨트랙트에서 해당 함수값에 접근하는 것이 아니라 public_example2 컨트랙 즉 외부에서 external로 정의된 함수에 접근하는 것이기 때문이다. 

 

다만 여기서 uint256의 접근 제한자를 external로 바꾸게 되면 오류가 나게 된다. 


internal

internal은 private과 유사하지만 상속받은 컨트랙도 접근이 가능하다. 

728x90

이 글은 인프런 "솔리디티 깨부수기" 3강,4강 강의를 듣고 정리한 글입니다. 

 

[지금 무료] 솔리디티 깨부수기 | D_One - 인프런

D_One | 이 강의를 통해서, 스마트 컨트랙 제작을 위한 솔리디티 언어를 배울수 있습니다., 코딩이 처음인 분들도 OK! 처음 배우는 솔리디티, 쉽게 시작해보세요. 강의 주제 📖 [사진] 이 강의에서

www.inflearn.com



Ether

이더리움의 코인은 ETH 이더라고 한다. 

1 ether = 10^9 Gwei = 10^18 wei 로 1^18 wei 는 1 이더를 나타낸다. 예시를 들면, 100원은 1원이 100 개라고 볼 수 있다. 

 

 0.00000000000000001 ehter = 1^-18 =1 wei 가 되며 예시로 본다, 0.01 ether 를 가졌다고 가정했을때, 10^16wei와 같다. 

 

GWei

Gwei는 주로 가스를 소비했을때, 사용되는 단위로 가스는 스마트 컨트랙을 사용하기 위해서 또는, 이더리움 블록체인과 상호작용하기 위해서는 가스가 필요하다.  

가스비용을 Gwei 단위로 낸다.

 


가스비용 책정

사용하고자 하는 스마트 컨트랙 안에 정의된 코드의 길이에 따라 가스 비용이 책정되며, 길이가 짧을수록 소비되는 가스가 적어진다. 

스마트 컨트랙 안에 무엇으로 정의 되냐에 따라 가스 소비하는 비용이 달라지게 된다. 예를들어, string 이나 modifer를 사용하는경우 가스가 더 많이 들어간다.

 

이더리움에서 제공하는 옐로우 페이퍼에 26페이지를 보면, 어떤 내장기능을 사용하냐에 따라 가스 소비량을 계산할 수 있다. 예를 들어 transaction 함수를 사용하였을 때, 이더를 보내는 함수를 사용했을 때 21,000 가스가 소비된다고 정의된다.

https://ethereum.github.io/yellowpaper/paper.pdf

 

 

솔리니티 안에서 either-way-gway를 지원하여 간단하게 아래와 같이 이더리움 유닛을 이용해 간단하게 작성할 수 있다.

 

위에처럼 코드를 배포할때 가스가 소비된 것을 확인할 수 있다. 이는 이더리움 블록체인과 상호작용을 위하여 무조건 가스를 사용해야한다. 스마트 컨트랙을 쓸때 해당 정보들이 블록체인 네트워크와 연결이되어 가스 비용이 쓰이게 된다.


가스(Gas)

보안적인 측면에서 가스는 DDoS(Distributed Denial of Service) 같은 공격을 방지할 수 있다.

예를 들어, 해커가 고의적으로 스마트 컨트랙을 지속적으로 작동하게 반복시켜 블록체인 네트워크에 과부화를 주어 해커는 작동을 반복시킬때마다 Gas 비용을 지불해야한다는 점에서 비용적인 측면에서 부담이 되기 때문에 공격 방지가 된다.


function 정의

함수의 정의 방법은 다음과 같다.

 

function 이름 () public { // (public, private, internal, external) 변경가능.  
      // 내용
    }

 

public 과 같은 접근제어자를 함수명 뒤에 써주게 된다.  접근제어자는 public, private, internal, external 이 있다.

함수를 정의할 대 3가지 경우의 수가 나오게 되는데 순차적으로 아래에서 다루도록 하겠다. 

 


Parameter 와 Retrun 값이 없는 function 정의

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

contract Lec4 {
    uint256 public a = 3;
    function changeA() public{
        a =5;
    }
}

위에 예시는 changeA() 함수를 이용하여 변수의 값을 바꾸는 것으로,  a 라는 변수는 3로 정의를 하였지만, changeA()라는 함수를 실행시키시면 가스가 소비되고 a는 5가 바뀌는 것을 확인할 수 있다. 

changeA 함수 실행 전, 실행 후


Parameter는 있고, Retrun 값이 없는 function 정의

function 이름 (받고싶은 타입  변수명 ) public { 
  // 내용
}
ex) 
function 이름 (uint 256 _value) public { 
  // 내용
}

첫번째 예시와 다른 점은 파라미터 있는 함수를 정의할 땨는 type이 어떤 파라미터를 넣을 것인지 알 수 있다, . 

type 은 여러가지를 쓸 수 있으며, byte, string, address 등등이 있다,

 

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

contract Lec4 {
    uint256 public a = 3;
    function changeA(uint256 _value) public{
        a =_value;
    }
}

위의 예시에서는 uin256 타입의 파라미터를 사용하며, changeA를 실행할때마다, _value의 파라미터 값을 넣어 주어야한다. 이 파라미터는 a에 대입이 되어 값이 변경된다.

 

만약에 2 개 이상의 파라미터가 필요하다면, 아래와 같이 이어 붙이면 된다,

    function changeA(uint256 _value1, uint256 _value2) public{
        a =_value;
    }

 


Parameter는 있고, Retrun 값이 있는 function 정의

function 이름 (받고싶은 타입  변수명 ) public returns(반환하고자 하는 type) {
  // 내용
}
ex) 
function 이름 (uint 256 _value) public returns(uint256) { 
  // 내용
}

 

두번째 경우와 매우 흡사하지만 return 값을 명시줘야 한다. return에는 s를 붙여야 하며 어떤 값을 리턴할 지에 대한 타입을 작성해야한다. 여기서 주의해야 할 점은, 변수명이 없고 타입만 써주시면 된다.

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

contract Lec4 {
    uint256 public a = 3;
    function changeA(uint256 _value) public returns(uint256){
        a =_value;
        return a;
    }
}

위의 예시는  returns(uint256)이 있으니, uint256 타입으로 반환한다라는 뜻이 된다.  써주신다면, changeA 함수가 실행될때, 

_value의 파라미터 값을 받고, a 변수에 _value 파라미터가 대입된 후에 a 값이 리턴된다.

 

 

+ Recent posts