나 개발자 진짜 되냐?

[ C# 기본 문법 18 ] out 과 ref 본문

C# 을 맛보았어요!/문법정리를 해보았어요!

[ C# 기본 문법 18 ] out 과 ref

Snow Rabbit 2024. 9. 23. 17:38

고급문법 두 번째

out와

ref가 있다.

 

둘 다 메서드에서 매개변수로 전달할 때 사용한다.

 

하나씩 알아보자!!

 


🌟 out 🌟

메서드에서 반환 값을 매개변수로 전달하는 경우에 사용

 

🌟 ref 🌟

메서드에서 매개변수를 수정하여 원래 값에 영향을 주는 경우에 사용

 

결국 변수를 만지작하는 것이기 때문에

굉장히 주의해야 한다.

 

using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Diagnostics.Metrics;

namespace ConsoleApp1
{
    internal class Program
    {// out 키워드 사용 예시
        // main함수를 그대로 가져오는 것이기 때문에 우리는 static으로 맞춰준다.
        static void Divide(int a, int b, out int quotient, out int remainder)
            //out으로 매개변수를 받았으면 무조건 값이 바껴서 나간다! 즉 반환이 필요없다.
        {
            quotient = a / b;
            remainder = a % b;
        }


        static void Main(string[] args)
        {
            int quotient, remainder;
            Divide(7,3,out quotient,out remainder);
            Console.WriteLine($"{quotient}, {remainder}");
        }
    }
}

 

out이다.

 

여기서 int a b는

7과 3이 복사해서 들어간 것이고

out 은 자료구조처럼 가리킨다 라는 의미로 해석한다.

그래서 out 이 있다면 Divide 메서드에 있던 매개변수 두 개가

main의 quo와 rem을 가리킨다고 보면 된다!

 

그래서 return 없이도 가능! 한 것

 

 

using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Diagnostics.Metrics;

namespace ConsoleApp1
{
    internal class Program
    {// main함수를 그대로 가져오는 것이기 때문에 우리는 static으로 맞춰준다.

        // ref 키워드 사용 예시
        static void Swap(ref int a, ref int b)
        {
            int temp = a;
            a = b;
            b = temp;
        }


        static void Main(string[] args)
        {
            int x = 1, y = 2;
            Swap(ref x, ref y); // 이 x y가 a b랑 연결!
            Console.WriteLine($"{x}, {y}");
        }
    }
}

 

 

out이든 ref든

이 키워드는 메서드에서 값을 반환하는 것이 아니라,

return이 필요 없는!

 

매개변수를 이용하여 값을 전달할 수 있다.

 

❗❗ 유의사항 ❗❗

 

 out의 매개변수는

메서드 내에서 반드시 값을 할당해야 한다.

 

매개변수메서드 내에서 무조건 값이 바뀌어야 한다.

 

예를 들면 우리가 int a = 10으로 지정해 줬는데

out으로 메서드에 들어가서

a = 99로 정했다.

그러면 10은 지워지는 것이다.

그렇기 때문에 원본을 잘 간수해야 한다.

 

 

전달할 때 해당 변수의 이전 값이 유지되지 않으므로 주의

 

ref의 매개변수는

 

값에 대한 복사 없이

메서드 내에서 직접 접근할 수 있기 때문에

능상 이점

 

대신 많으면 독이 된다!

 

ref의 매개변수는

사용하게 되면 메서드 내에서

해당 변수의 값을 직접 변경할 수 있기 때문에

주의가 필요!


반환을 안 해줘서 좋다! 생각할 수 있지만

 

생각보다 위험한 친구이다.

 

양날의 검 이 친구를 

쓰게 된다면

조심해서 써야겠다 (●'◡'●)