블로그 이미지
Every unexpected event is a path to learning for you.

카테고리

분류 전체보기 (2731)
Unity3D (814)
Programming (474)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (228)
협업 (57)
3DS Max (3)
Game (12)
Utility (136)
Etc (96)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (51)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday
03-28 00:02

'매개변수'에 해당되는 글 2건

  1. 2010.12.03 C# 디폴트 파라미터 따라하기
  2. 2010.08.18 메서드 매개 변수(C# params/ref/out)

기본적으로 C#에서는 C++의 디폴트 매개변수 방법을 지원하지 않는 것 같다.

 

void func(int a, int b=1 ){ ... }

 

이런 함수가 있을 떄 디폴트 매개변수를 지원 안하면 같은 소스더라도 2배가 되기 때문에

 

디폴트 매개변수를 지정하는 것이 편할 때가 많았다.

 

하지만  C#에서는 지원을 따로 안하기 때문에 새로운 방법을 써야 한다.

 

public void func(int a){ func(a, 1); }

public void func(int a, int b){ ... }

 

이렇게 디폴트 파라미터가 필요없는 부분의 오버로딩시켜서 새로 호출 시키는 방법을 사용한다.

 

함수에 리턴값이 있을 경우는...

 

public int func(int a){ return func(a, 1); }

public int func(int a, int b){ ... }

반응형
Posted by blueasa
, |

ref 또는 out을 사용하지 않고 메서드의 매개 변수를 선언하면 매개 변수에 연결된 값을 할당할 수 있습니다. 메서드에서 이 값을 변경할 수 있지만 호출한 프로시저로 제어가 다시 전달되면 변경된 값은

유지되지 않습니다. 메서드 매개 변수 키워드를 사용하면 이러한 동작을 변경할 수 있습니다.

이 단원에서는 메서드 매개 변수를 선언할 때 사용할 수 있는 아래와 같은 키워드에 대해 설명합니다.

params(C# 참조)

params 키워드를 사용하면 인수 갯수가 변수로 주어지는 인수를 사용하는 메서드 매개 변수를 지정할 수

있습니다.

메서드 선언에서 params 키워드 다음에는 매개 변수를 추가할 수 없으며 params 키워드 하나만 메서드

선언에 사용할 수 있습니다.

// cs_params.cs using System;

public class MyClass { public static void UseParams(params int[] list) { for (int i = 0 ; i < list.Length; i++) { Console.WriteLine(list[i]); } Console.WriteLine(); } public static void UseParams2(params object[] list) { for (int i = 0 ; i < list.Length; i++) { Console.WriteLine(list[i]); } Console.WriteLine(); } static void Main() { UseParams(1, 2, 3); UseParams2(1, 'a', "test"); // An array of objects can also be passed, as long as // the array type matches the method being called. int[] myarray = new int[3] {10,11,12}; UseParams(myarray); } }

출력

1 2 3 1 a test 10 11 12

 

 

ref(C# 참조)

ref 키워드는 인수를 참조로 전달하는 데 사용됩니다.

메서드의 모든 매개 변수 변경 사항은 호출하는 메서드로 제어가 다시 전달될 때 해당 변수에 반영됩니다.

ref 매개 변수를 사용하려면 메서드 정의와 호출하는 메서드에서 모두 ref 키워드를 명시적으로

사용해야 합니다. 예를 들면 다음과 같습니다.

 

 예제

 

class RefExample
{
    static void Method(ref int i)
    {
        i = 44;
    }
    static void Main()
    {
        int val = 0;
        Method(ref val);
        // val is now 44
    }
}

ref 매개 변수에 전달되는 인수는 먼저 초기화되어야 합니다.

이는 해당 인수를 전달하기 전에 명시적으로 초기화할 필요가 없는 out과 다른 점입니다.

out을 참조하십시오.

 

refout은 런타임에 서로 다르게 취급되지만 컴파일 타임에는 동일하게 취급됩니다.

따라서 한 메서드는 ref 인수를 사용하고 다른 메서드는 out 인수를 사용하는 경우 메서드를

오버로드할 수 없습니다.

 

예를 들어, 이러한 두 메서드는 컴파일할 때 동일하게 간주되므로 다음과 같은 코드는 컴파일되지

않습니다.

class CS0663_Example 
{
    // compiler error CS0663: "cannot define overloaded 
    // methods that differ only on ref and out"
    public void SampleMethod(ref int i) {  }
    public void SampleMethod(out int i) {  }
}

그러나 한 메서드가 ref 또는 out 인수를 사용하고 다른 메서드는 두 인수 중 어느 것도 사용하지

않는 경우 다음과 같이 오버로드할 수 있습니다.

 

class RefOutOverloadExample { public void SampleMethod(int i) { } public void SampleMethod(ref int i) { } }

속성은 변수가 아니므로 ref 매개 변수로 전달할 수 없습니다.

배열을 전달하는 방법에 대한 자세한 내용은 ref 및 out을 사용한 배열 전달을 참조하십시오.

위 예제에서와 같이 값 형식을 참조로 전달하는 방법 이외에 ref를 사용하여 참조 형식을 전달할 수도

있습니다.

이렇게 하면 참조 자체가 참조로 전달되므로 호출된 메서드에서 참조가 가리키는 개체를 수정할 수

있습니다.

다음 샘플에서는 참조 형식이 ref 매개 변수로 전달될 때 개체 자체가 변경될 수 있음을 보여 줍니다.

 

class RefRefExample
{
    static void Method(ref string s)
    {
        s = "changed";
    }
    static void Main()
    {
        string str = "original";
        Method(ref str);
        // str is now "changed"
    }
}
out(C# 참조)

out 키워드는 인수를 참조로 전달하는 데 사용됩니다.

이는 ref 키워드와 비슷하지만 ref의 경우 변수를 전달하기 전에 초기화해야 한다는 점에서 차이가

있습니다.

out 매개 변수를 사용하려면 메서드 정의와 호출하는 메서드에서 모두 out 키워드를 명시적으로

사용해야 합니다.

 

예를 들면 다음과 같습니다.

 

class OutExample
{
    static void Method(out int i)
    {
        i = 44;
    }
    static void Main()
    {
        int value;
        Method(out value);
        // value is now 44
    }
}

out 인수로 전달되는 변수는 이를 전달하기 전에 초기화할 필요가 없지만 호출하는 메서드는

메서드 반환 이전에 값을 할당해야 합니다.

 

refout 키워드는 런타임에 서로 다르게 취급되지만 컴파일 타임에는 동일하게 취급됩니다.

따라서 한 메서드는 ref 인수를 사용하고 다른 메서드는 out 인수를 사용하는 경우 메서드를

오버로드할 수 없습니다.

 

예를 들어, 이러한 두 메서드는 컴파일할 때 동일하게 간주되므로 다음과 같은 코드는

컴파일되지 않습니다.

 

class CS0663_Example 
{
    // compiler error CS0663: "cannot define overloaded 
    // methods that differ only on ref and out"
    public void SampleMethod(out int i) {  }
    public void SampleMethod(ref int i) {  }
}

그러나 한 메서드가 ref 또는 out 인수를 사용하고 다른 메서드는

두 인수 중 어느 것도 사용하지 않는 경우 다음과 같이 오버로드할 수 있습니다.

 

class RefOutOverloadExample { public void SampleMethod(int i) { } public void SampleMethod(out int i) { } }

 

속성은 변수가 아니므로 out 매개 변수로 전달할 수 없습니다.

배열을 전달하는 방법에 대한 자세한 내용은 ref 및 out을 사용한 배열 전달을 참조하십시오.

메서드에서 값을 여러 개 반환해야 하는 경우 out 메서드를 선언하는 것이 좋습니다.

out 매개 변수를 사용하는 메서드에서는 변수를 반환 형식으로 사용할 수 있지만(return 참조)

호출하는 메서드에 하나 이상의 개체를 out 매개 변수로 반환할 수도 있습니다.

다음 예제에서는 out을 사용하여 한 번의 메서드 호출로 변수 세 개를 반환합니다.

세 번째 인수에는 null이 할당됩니다. 이렇게 하면 메서드에서 값을 선택적으로 반환할 수 있습니다.

 

class OutReturnExample
{
    static void Method(out int i, out string s1, out string s2)
    {
        i = 44;
        s1 = "I've been returned";
        s2 = null;
    }
    static void Main()
    {
        int value;
        string str1, str2;
        Method(out value, out str1, out str2);
        // value is now 44
        // str1 is now "I've been returned"
        // str2 is (still) null;
    }
}
반응형

'Programming > C#' 카테고리의 다른 글

String과 string의 차이..??  (0) 2010.08.27
DataGridView 활용 Tip  (0) 2010.08.19
datagrid에서 클릭하면 한 줄이 선택되도록 할 수 있나요?  (0) 2010.08.17
DataSet 및 DataGrid 관련 팁  (0) 2010.08.17
File과 Directory, Path  (0) 2010.08.16
Posted by blueasa
, |