private void Awake()
{
int a = 3
int b = 4;
Add(a,b)
}
public void Add(int num1, int num2)
{
int result = num1 + num2;
Debug.Log($"{num1} + {num2} = {result}");
}
☝ num1은 a의 값과 동일한 데이터를 가지고 있지만, 별개의 메모리 공간 사용
(num1을 수정해도 a의 데이터는 변하지 않는다)
👇 CaLL By Value 예시 코드
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
// 값에 의한 전달
private void Awake()
{
int a = 3;
int b = 4;
Debug.Log($"Before a={a}, b={b}");
Swap(a, b);
Debug.Log($"After a={a}, b={b}");
}
public void Swap(int num1, int num2)
{
int temp = num1;
num1 = num2;
num2 = temp;
}
// 값은 그대로 전달하였지만 다른 메모리 공간을 사용하고 있기 때문에
// 매개변수 num1과 num2에 무슨짓을 하더라도 a 와 b의 값에는 아무런 영향이 없다
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
// 참조에 의한 전달
private void Awake()
{
int a = 3;
int b = 4;
Debug.Log($"Before a={a}, b={b}");
Swap(ref a, ref b);
Debug.Log($"After a={a}, b={b}");
}
public void Swap(ref int num1, ref int num2)
{
int temp = num1;
num1 = num2;
num2 = temp;
}
// ref 키워드를 붙이면 참조에 의한 전달로 판단하고,
// 매개변수 num1에 a의 주소 값을
// num2에 b의 주소 값을 전달해서 메모리 공간을 공유한다
// 즉, num1의 값이 바뀌면 a도 같이 바뀐다
}
👇 out 키워드 예시 코드
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
private void Awake()
{
int a = 5;
int b = 4;
int result1 = 0;
int result2 = 0;
Divide(a, b, out result1, out result2);
Debug.Log($"몫 = {result1}, 나머지 = {result2}");
}
public void Divide(int num1, int num2, out int result1, out int result2)
{
result1 = num1 / num2;
result2 = num1 % num2;
}
// ref 매개 변수는 메소드 내부에서 결과를 저장하지 않아도 컴파일러가 아무런 경고도 하지 않는 반면,
// out 매개 변수는 메소드 내부에서 결과를 저장하지 않은면 컴파일 에러가 발생 (개발자의 실수를 줄여준다)
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
private void Awake()
{
AddInt(10, 20);
AddFloat(0.1f, 0.2f);
}
public void AddInt(int num1, int num2)
{
int result = num1 + num2;
Debug.Log($"{num1} + {num2} = {result}");
}
public void AddFloat(float num1, float num2)
{
float result = num1 + num2;
Debug.Log($"{num1} + {num2} = {result}");
}
}
☝ 이런 식으로 필요해따라 함수를 만들수도 있지만 오버로딩 을 사용하면 더욱 깔끔하게 코딩을 할 수 있다
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
private void Awake()
{
Add(10, 20);
Add(0.1f, 0.2f);
}
public void Add(int num1, int num2)
{
int result = num1 + num2;
Debug.Log($"{num1} + {num2} = {result}");
}
public void Add(float num1, float num2)
{
float result = num1 + num2;
Debug.Log($"{num1} + {num2} = {result}");
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
private void Awake()
{
Sum(1, 2);
Sum(1, 2, 3);
Sum(1, 2, 3, 4);
Sum(1, 2, 3, 4, 5);
}
public void Sum(params int[] nums)
{
int sum = 0;
for ( int i = 0; i < nums.Length; i++)
{
sum += nums[i];
}
Debug.Log($"합게 : {sum}");
}
}
// Tip. 매개 변수의 형식은 같아야 한다
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
private void Awake()
{
Player("김철수", 100); // 일반적인 매개 변수 사용 방식
Player(ID: "김매개", health: 200); // 명명된 매개변수 사용 방식
Player(health: 300, ID: " 김변수"); // 명명된 매개변수 사용 방식
// 매개변수명과 매개변수에 저장되는 데이터를 함께
// 쓰기 떄문에 순서가 바뀌어도 인식가능하다!
}
public void Player(string ID, int health)
{
Debug.Log($"ID : {ID}, HP : {health}");
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
private void Awake()
{
Player("김철수");
Player("김철수", 3000);
}
// 첫번째 Player함수 호출에서 health의 값을 입력하지 않았지만 선택적 매개 변수로
// 1000값이 설정되어 있어서 1000으로 자동 설정된다
public void Player(string ID, int health = 1000)
{
Debug.Log($"ID : {ID}, HP : {health}");
}
}
👇 선택적 매개 변수를 사용한다면 선택적 매개변수보다 뒤에 필수 매개변수가 올 수 없다
public void Player(string ID, int health = 1000)
{
Debug.Log($"ID : {ID}, HP : {health}");
} // 올바른 방식
public void Player(string ID = "김철수", int health)
{
Debug.Log($"ID : {ID}, HP : {health}");
} // 잘못된 방식(에러)