Deff_Dev

[Unity/C#] 메소드 본문

Unity(유니티)/유니티 공부

[Unity/C#] 메소드

Deff_a 2024. 3. 8. 17:10

해당 포스팅은 고박사님의 유니티 C# 강의를 보고 공부한 내용과 추가적으로 공부한 내용을 정리한 포스팅입니다.

 

메소드란 ?

  • 객체 지향 프로그래밍 언어에서 사용하는 용어 (메소드 = 함수, 프로시져, 서브루틴)
  • 일련의 코드를 하나의 이름 아래 묶은 것
  • 묶어 놓은 코드를 메소드의 이름을 불러 내부 코드들을 실행
public class 클래스이름
{
	한정자 반환형식 메소드이름(매개변수)
	{
		// 코드
		
		return (반환형식)데이터;
	}

}

메소드의 장점

  • 반복된 코드 작성이 편해지고 가독성이 높아진다.

매개 변수

값에 의한 전달 (Call By Value)

  • 함수의 매개변수에 값을 복사해 전달한다.
  • 값이 복사되어 매개변수로 전달되기 때문에 함수 내에서 해당 변수의 값을 변경하더라도 호출된 함수에서의 원래의 값이 변경되지 않는다.
    private void Awake()
    {
        int a = 10, b = 1;

        Debug.Log(a + "  " + b);
        Swap(a, b);
        Debug.Log(a + "  " + b);
    }

    private void Swap(int a, int b)
    {
        int tmp = a;
        a = b;
        b = tmp;
    }

출력 값


참조에 의한 전달 (Call By Reference)

  • 값에 의한 전달과 달리, 해당 변수의 메모리 주소를 전달하여 값을 수정할 수 있다.
  • 변수의 복사본이 아닌 실제 변수 자체를 전달한다.
  • 사용 방법은 매개 변수 앞에 ref를 작성한다.
    private void Awake()
    {
        int a = 10, b = 1;

        Debug.Log(a + "  " + b);
        Swap(ref a, ref b);
        Debug.Log(a + "  " + b);
    }

    private void Swap(ref int a,ref int b)
    {
        int tmp = a;
        a = b;
        b = tmp;
    }

출력 값

 

참조 지역 변수

public class Product
{
    private int price = 100;
    
    public ref int GetPrice()
    {
        return ref price;
    }

    public void PrintPrice()
    {
        Debug.Log($"Price : {price}");
    }
}
public class TestManager : MonoBehaviour
{

    private void Start()
    {
        Product snack = new Product();

        // 참조 지역 변수
        ref int snackPrice = ref snack.GetPrice();

        snack.PrintPrice();
        Debug.Log(snackPrice);

        // 참조 지역 변수의 값을 바꿔도 snack의 price 값이 바뀐다.
        snackPrice = 1000;

        snack.PrintPrice();
        Debug.Log(snackPrice);

    }

출력 전용 매개 변수 Out

  • ref 매개 변수는 메소드 내부에서 결과를 저장하지 않아도 컴파일러가 아무런 경고도 하지 않는다.
  • out 매개 변수는 메소드 내부에서 결과를 저장하지 않으면 컴파일 에러가 발생해 개발자의 실수를 줄여주기 때문에 out을 쓰는것을 권장한다.
    private void Awake()
    {
        int a = 10, b = 1, result = 0;

        Add(a,  b , out result);
        Debug.Log(result);
    }

    private void Add(int a,int b, out int result)
    {
        result = a + b;
    }

출력 값, 에러


메소드 오버로딩

  • 동일한 메소드 이름으로 여러 종류의 메소드를 구현하는 것
  • 매개 변수의 개수와 형식을 분석하여 메소드를 선택함.
    • 단, 반환 형식은 고려하지 않기 때문에 반환 형식만 다를 경우는 구분하지 못한다.
    private void Awake()
    {
        Add(1,2);
        Add(1.7f, 1.1f);       
    }
    private void Add(int a,int b)
    {
        Debug.Log(a + b);
    }
    private void Add(float a, float b)
    {
        Debug.Log(a + b);
    }

출력 값


가변 길이 매개 변수

  • 개수가 유연하게 변할 수 있는 매개 변수
  • 배열 매개 변수 앞에 params 키워드를 붙히고 사용
    private void Awake()
    {
        Add(1,2,3,4);
        Add(1,2);
    }
    private void Add(params int[] nums)
    {
        int sum = 0;
        for(int i = 0; i< nums.Length; i++)
        {
            sum += nums[i];
        }
        Debug.Log(sum);
    }

출력 값


명명된 매개 변수

  • 일반적을 매개 변수에 데이터를 할당할 때 순서에 의거하여 할당하는 반면, 순서에 상관 없이 매개 변수의 이름에 근거하여 데이터를 할당하는 방법
  • 코드의 길이는 길어지지만 코드 가독성이 높아진다.
    private void Awake()
    {
        Func(b: 500,a: 100);
    }
    private void Func(int a,int b)
    {
        Debug.Log("a = " + a + " b = " + b);
    }

출력 값


 선택적 매개 변수

  • 매개 변수를 특정 값으로 초기화 하지 않았을 때 기본 값을 할당하는 것
  • 필요에 따라 매개 변수에 데이터를 할당하거나 할당하지 않을 때 사용
  • 선택적 매개 변수는 항상 필수 매개 변수 뒤에 와야 한다.
    private void Awake()
    {
        Func(100);
    }
    private void Func(int a,int b = 10000)
    {
        Debug.Log("a = " + a + " b = " + b);
    }
    
    // 선택적 매개 변수는 항상 필수 매개 변수 뒤에 나와야 함
    /* 불가능한 코드
    private void Func(int a = 1000 ,int b)
    {
        Debug.Log("a = " + a + " b = " + b);
    }
    */

출력 값


로컬 함수

  • 메소드 안에서 선언되고, 선언된 메소드 안에서만 사용되는 특별한 함수이다.
  • 클래스의 멤버가 아니기 때문에 메소드가 아니라 함수라고 부른다.
  • 로컬 함수는 해당 메소드에서만 사용되는 함수이기 때문에 함수 간의 의존성을 줄일 수 있고 가독성 향상과 유지 보수하기 쉬워진다는 장점이 있다.
    private void Start()
    {
        int x = 100;

        LocalFunc(); // 로컬 함수 호출

        void LocalFunc() // 로컬 함수 
        {

            Debug.Log(x); // 100

            x = 500; // 메소드의 지역 변수에 접근할 수 있다.

            Debug.Log(x); // 500
        }
    }

 

'Unity(유니티) > 유니티 공부' 카테고리의 다른 글

[Unity/C#] 클래스  (0) 2024.03.09
[Unity/C#] 객체 지향 프로그래밍  (0) 2024.03.09
[Unity/C#] 상수, 열거형, Nullable, var  (0) 2024.03.04
[Unity/C#] 데이터 형 변환  (0) 2024.03.04
[Unity/C#] 변수  (0) 2024.02.25