Study/Blockchain & Solidity

[Solidity ๊นจ๋ถ€์ˆ˜๊ธฐ] Function

veriperi 2024. 4. 29. 18:30
728x90

01 ์ •์˜

๐Ÿ“Œ ๊ธฐ๋ณธ ๊ตฌ์กฐ
function ์ด๋ฆ„ (๋ฐ›๊ณ ์‹ถ์€ ํƒ€์ž…  ๋ณ€์ˆ˜๋ช…) public { // public, private, internal, external ๋“ฑ ๊ฐ€๋Šฅ
      // ๋‚ด์šฉ
    }โ€‹

(1) Parameter ์™€ Retrun ๊ฐ’์ด ์—†๋Š” function ์ •์˜

์œ„์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ์„ ๊ฒฝ์šฐ, changeA๋ผ๋Š” ํ•จ์ˆ˜๊ฐ€ ์ž‘๋™ํ•  ๋•Œ ๋ณ€์ˆ˜ a์˜ ๊ฐ’์„ 5๋กœ ๋ณ€๊ฒฝ์‹œ์ผœ์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค.

 

์ปดํŒŒ์ผ ์ดํ›„, ๋ฐฐํฌ๋ฅผ ํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด a๋งŒ ํ˜ธ์ถœํ–ˆ์„ ๊ฒฝ์šฐ ์ดˆ๊ธฐ๊ฐ’์ธ 3์„ ์ถœ๋ ฅํ•˜๊ณ  ์žˆ์ง€๋งŒ

 

changeA ๋ฅผ ํ˜ธ์ถœํ•œ ์ดํ›„ a๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๊ฐ’์ด 5์ธ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ณ , ์ด ๊ณผ์ •์—์„œ๋„ ๊ฐ€์Šค๊ฐ€ ์†Œ๋น„๋œ๋‹ค.

์ฆ‰, changeA ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด 5๋ผ๋Š” ๊ฐ’์ด ๋ณ€์ˆ˜ a์— ๋Œ€์ž…๋๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

(2) Parameter ๋Š” ์žˆ๊ณ , Retrun ๊ฐ’์ด ์—†๋Š” function ์ •์˜

ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์žˆ๊ณ  ๋ฆฌํ„ด๊ฐ’์ด ์—†๋Š” ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ, ์œ„ changeB ํ•จ์ˆ˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•ด์ค„ ๊ฒฝ์šฐ type์ด ์–ด๋–ค ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋„ฃ์„ ๊ฒƒ์ธ์ง€๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 

๋”ฐ๋ผ์„œ ํ•ด๋‹น ํ•จ์ˆ˜๋Š” changeB ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค, _value์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์„ ๋„ฃ์–ด์ฃผ์–ด์•ผ ํ•˜๋ฉฐ, ๋ณ€์ˆ˜ a์— ์ž…๋ ฅํ•œ ๊ฐ’์ด ๋“ค์–ด๊ฐ€๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋ฐฐํฌ ์ดํ›„ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•ด๋ณด์ž. ์šฐ์„  ๋ณ€์ˆ˜ a๋งŒ ํ˜ธ์ถœํ–ˆ์„ ๊ฒฝ์šฐ ์ดˆ๊ธฐ๊ฐ’์ธ 3์„ ์ถœ๋ ฅํ•˜๊ณ  ์žˆ๋‹ค.

 

changeB ํ•จ์ˆ˜ ๋ถ€๋ถ„์— 10์„ ์ž…๋ ฅํ•˜๊ณ  ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ 

 

๋‹ค์‹œ ๋ณ€์ˆ˜ a๋ฅผ ํ˜ธ์ถœํ•ด๋ณด๋‹ˆ ๋ณ€์ˆ˜์˜ ๊ฐ’์ด 10์œผ๋กœ ๋ฐ”๋€๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

(3) Parameter ์™€ Retrun ๊ฐ’์ด ์žˆ๋Š” function ์ •์˜

ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ๋ฆฌํ„ด๊ฐ’์ด ๋ชจ๋‘ ์žˆ๋Š” ํ•จ์ˆ˜๋Š” changeC ํ•จ์ˆ˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ, public ๋’ค์— ๋ฆฌํ„ดํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š” ๊ฐ’์ด ์žˆ์œผ๋‹ˆ ๋ฆฌํ„ด ๊ฐ’์„ ๋ช…์‹œํ•ด์ฃผ์–ด์•ผ ํ•˜๋ฉฐ ๋ฐ˜๋“œ์‹œ "s"๋ฅผ ๋ถ™์—ฌ "returns"๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค. ๋˜ํ•œ, ์–ด๋–ค ๊ฐ’์„ ๋ฆฌํ„ดํ•  ๊ฒƒ์ธ์ง€ ํƒ€์ž…์„ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค. ๋ณธ ์‹ค์Šต์—์„œ๋Š” a ๋ณ€์ˆ˜๋ฅผ ๊ทธ๋Œ€๋กœ ๋ฆฌํ„ดํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— uint256์„ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

 

๋ฐฐํฌ ์ดํ›„ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•ด๋ณด์ž. ์šฐ์„  a ๋ณ€์ˆ˜์˜ ๊ฐ’์€ ์ดˆ๊ธฐ๊ฐ’ ๊ทธ๋Œ€๋กœ 3์ด ๋‚˜์˜ค๊ณ  ์žˆ๊ณ 

 

45๋ฅผ ๋ฆฌํ„ดํ•˜๊ณ ์ž changeC์— ๊ฐ’์„ ๋„ฃ๊ณ  ๋ฆฌํ„ดํ•œ ํ›„

 

a๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด 45๊ฐ€ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ถ”๊ฐ€์ ์œผ๋กœ ํ„ฐ๋ฏธ๋„์— ๋ฆฌํ„ด๊ฐ’์ด ์ƒ์„ฑ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์ฆ‰, changeC ํ•จ์ˆ˜๋Š” ์ž…๋ ฅํ•œ ๊ฐ’์„ ๋ฐ›์•„์„œ ๋ณ€์ˆ˜ a์— ๋Œ€์ž…ํ•˜๊ณ  ๋Œ€์ž…ํ•œ a๋ฅผ ๋ฆฌํ„ดํ•œ ํ•จ์ˆ˜์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

 

02 public, private, internal, external

(1) public

: ์™„์ „ํžˆ ์˜คํ”ˆ๋˜์–ด ๋ชจ๋“  ๊ณณ์—์„œ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

(2) private

: ์˜ค์ง private์ด ์ •์˜๋œ ์ž๊ธฐ ์ปจํŠธ๋ž™์—์„œ๋งŒ ๊ฐ€๋Šฅ (private์ด ์ •์˜๋œ ์ปจํŠธ๋ž™์„ ์ƒ์†๋ฐ›์€ ์ž์‹๋„ ๋ถˆ๊ฐ€๋Šฅ)

 

(3) internal

: private์ฒ˜๋Ÿผ ์˜ค์ง internal์ด ์ •์˜๋œ ์ž๊ธฐ ์ปจํŠธ๋ž™์—์„œ๋งŒ ๊ฐ€๋Šฅํ•˜๊ณ , internal์ด ์ •์˜๋œ ์ปจํŠธ๋ž™์„ ์ƒ์†๋ฐ›์€ ์ž

 

(4) external

: public์ฒ˜๋Ÿผ ๋ชจ๋“  ๊ณณ์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‚˜, external์ด ์ •์˜๋œ ์ž๊ธฐ ์ž์‹  ์ปจํŠธ๋ž™ ๋‚ด์—์„œ ์ ‘๊ทผ ๋ถˆ๊ฐ€๋Šฅ

 

โ–ถ ์‹ค์Šต ์ง„ํ–‰

์œ„ ๊ฐœ๋…๋“ค์„ ํ™•์ธํ•ด๋ณด๊ณ ์ž ๊ฐ„๋‹จํ•œ ์‹ค์Šต์„ ์ง„ํ–‰ํ•˜์˜€๋‹ค.

 

๋จผ์ € public๊ณผ private์„ ๋น„๊ตํ•ด๋ณด๊ณ ์ž ์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์˜€๋‹ค.

 

์ด๋ฅผ ๋ฐฐํฌํ•ด์„œ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•ด๋ณด์ž. ์ฝ”๋“œ ๋ฐฐํฌ๋ฅผ ํ†ตํ•ด ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•ด๋ณด๋‹ˆ a2 ๋ณ€์ˆ˜๋Š” private ์ฆ‰, ์ ‘๊ทผ์ด ์ œํ•œ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ public ์ ‘๊ทผ ์ œํ•œ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ณ€์ˆ˜ a๋งŒ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋‹ค์Œ์œผ๋กœ ์กฐ๊ธˆ ๋” ๋ฐœ์ „๋œ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž.

๐Ÿ“Œ public ์˜ˆ์ œ ์ฝ”๋“œ
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

contract Lec5 {
    // public
    uint256 public a = 5;

    // private
    uint256 private a2 = 5;
}

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์˜ ๋ถ„์‹ ์ด๋ผ๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์œ„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์ปดํŒŒ์ผ ํ›„ ๋ฐฐํฌ๋ฅผ ์ง„ํ–‰ํ•ด๋ณด์ž. ๊ทธ ์ „์—, ์šฐ๋ฆฌ๋Š” ์ฝ”๋“œ์— contract์„ ์ด 3๋ฒˆ ์ƒ์„ฑํ•ด์ฃผ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— remix ํ™˜๊ฒฝ์—์„œ๋„ ์ด 3๊ฐœ์˜ ์ปจํŠธ๋ž™์ด ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

3๊ฐœ์˜ ์ปจํŠธ๋ž™ ์ค‘ public_example_2๋ฅผ ๋ฐฐํฌํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ™”๋ฉด์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

์ด์ œ ์ด A ๊ฐ’์— 10์„ ๋„ฃ๊ณ  ๋ฆฌํ„ด์„ ํ•œ ํ›„ ๊ทธ ๊ฒฐ๊ณผ๊ฐ€ 10๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•ด๋ณด์ž. A๊ฐ’์— 10์„ ๋„ฃ์—ˆ์„ ๋•Œ ์ตœ์ข…์ ์œผ๋กœ ๋™์ผํ•˜๊ฒŒ ๋ณ€๊ฒฝ๋œ ๊ฐ’์ด ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋งŒ์•ฝ ์œ„ ์ฝ”๋“œ์—์„œ changeA์™€ get_a ๊ฐ๊ฐ์˜ ํ•จ์ˆ˜์— ์ ‘๊ทผ์ œํ•œ์ž๋ฅผ public์ด ์•„๋‹Œ private์œผ๋กœ ๋ณ€๊ฒฝํ•  ๊ฒฝ์šฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋‹ค์Œ์œผ๋กœ external๊ณผ ๊ด€๋ จ๋œ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•ด๋ณด์ž.

๐Ÿ“Œ external ์˜ˆ์ œ ์ฝ”๋“œ
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

contract Lec5 {
    // public
    uint256 public a = 5;

    // private
    uint256 private a2 = 5;
}

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๋Š” ์ „ํ˜€ ๋ณ„๊ฐœ์˜ ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™์ด๊ธฐ์— ๊ฐ€๋Šฅํ•จ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

ํ•ด๋‹น ์ฝ”๋“œ๋„ public์ด ์ž‘์„ฑ๋˜๋Š” ๋ถ€๋ถ„์— external์„ ์ž‘์„ฑํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

03 View์™€ Pure

(1) View

: function ๋ฐ–์˜ ๋ณ€์ˆ˜๋“ค์„ ์ฝ์„ ์ˆ˜ ์žˆ์œผ๋‚˜ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅ

 

 

(2) Pure

: function ๋ฐ–์˜ ๋ณ€์ˆ˜๋“ค์„ ์ฝ์ง€ ๋ชปํ•˜๊ณ , ๋ณ€๊ฒฝ๋„ ๋ถˆ๊ฐ€๋Šฅ

 

โ–ถ View์™€ Pure ๋ชจ๋‘ ๋ช…์‹œ๋ฅผ ์•ˆํ•  ๊ฒฝ์šฐ, function ๋ฐ–์˜ ๋ณ€์ˆ˜๋“ค์„ ์ฝ์–ด์„œ ๋ณ€๊ฒฝ์„ ํ•ด์•ผํ•œ๋‹ค.

๐Ÿ“Œ ๊ด€๋ จ ์˜ˆ์ œ
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

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

contract Pure_example{
    
    function read_a() pure public returns(uint256){
        uint256 a = 3;
        return a+2;
    } 
}โ€‹

 

 

04 String

โœ… ์†”๋ฆฌ๋””ํ‹ฐ ์ €์žฅ ์˜์—ญ

1. storage : ๋Œ€๋ถ€๋ถ„์˜ ๋ณ€์ˆ˜, ํ•จ์ˆ˜๋“ค์ด ์ €์žฅ๋˜๋ฉฐ, ์˜์†์ ์œผ๋กœ ์ €์žฅ์ด๋˜์–ด ๊ฐ€์Šค ๋น„์šฉ์ด ๋น„์Œˆ
 
2. memory: ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ, ๋ฆฌํ„ด๊ฐ’, ๋ ˆํผ๋Ÿฐ์Šค ํƒ€์ž…์ด ์ฃผ๋กœ ์ €์žฅ์ด ๋จ. ๊ทธ๋Ÿฌ๋‚˜, storage ์ฒ˜๋Ÿผ ์˜์†์ ์ด์ง€ ์•Š๊ณ , ํ•จ์ˆ˜๋‚ด์—์„œ๋งŒ ์œ ํšจํ•˜๊ธฐ์— storage๋ณด๋‹ค ๊ฐ€์Šค ๋น„์šฉ์ด ์Œˆ
 
3. Colldata : ์ฃผ๋กœ external function ์˜ ํŒŒ๋ผ๋ฉ”ํ„ฐ์—์„œ ์‚ฌ์šฉ ๋ฉ๋‹ˆ๋‹ค.  ์˜ˆ๋ฅผ ๋“ค์–ด ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ํŒŒ๋ผ๋ฉ”ํ„ฐ์˜ ๊ฐ’ ์ž์ฒด๋ฅผ calldata๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. calldata๋กœ ๋ฐ›๊ฒŒ ๋œ๋‹ค๋ฉด, ๊ฐ’์€ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๊ณ  ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค. 
 
4. stack:  EVM (Ethereum Virtual Machine) ์—์„œ stack data๋ฅผ ๊ด€๋ฆฌํ• ๋•Œ ์“ฐ๋Š” ์˜์—ญ์ธ๋ฐ 1024Mb 1024๊ฐœ์˜ data๋ฅผ ์ œํ•œ์ ์œผ๋กœ ์ €์žฅํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ๋กœ์ปฌ ๋ณ€์ˆ˜์™€ ๊ฐ™์€๊ฒƒ๋“ค์„ ์ž ์‹œ ๊ธฐ์–ตํ•  ๋•Œ EVM์ด ์‚ฌ์šฉ์„ ํ•œ๋‹ค. 

 

โœ… ์˜ˆ์ œ

// SPDX-License-Identifier  GPL-30
pragma solidity >= 0.7.0 < 0.9.0;

contract lec7 {
    
    function get_string(string memory _str) public pure returns( string memory){
        return _str;
    }
}

 

์œ„ ์˜ˆ์ œ์— ๋ณด๋ฉด string ๋‹ค์Œ์— memory ํ‚ค์›Œ๋“œ๊ฐ€ ์žˆ๋‹ค.  memory๋Š” ๋Š˜ string ๋‹ค์Œ์— ๋ถ™์—ฌ์ค€๋‹ค. ๊ทธ๋ฆฌ๊ณ , pure๋ฅผ ์“ฐ๋Š”์ด์œ ๋Š”, ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐ›์€๊ฑธ ๋ฐ”๋กœ ๋ฆฌํ„ดํ•˜๊ธฐํ•ด์„œ, storage ์— ์ €์žฅ๋œ ๋ณ€์ˆ˜๋“ค์„ ์ฝ์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— pure์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

 

 

 

์ถœ์ฒ˜ : ์ธํ”„๋Ÿฐ ์†”๋ฆฌ๋””ํ‹ฐ ๊นจ๋ถ€์ˆ˜๊ธฐ(https://inf.run/qNVC)
728x90