C# 2
* 메소드는 프로시저 = 메소드 = 함수 라고 불린다.
* static 이란?
c와 c++에서는 정적변수로 함수를 나가도 함수 내에 있는 변수 값을 유지하는 용도로 쓰였지만
클래스에서는 좀 다르다.
--------------------------------------------------------
class Program
{
public static void abc (int p)
{
Console.Write(p);
}
static void Main(string[] args)
{
int a = 10;
abc(a);
...
--------------------------------------------------------
class Program
{
public void abc (int p)
{
Console.Write(p);
}
static void Main(string[] args)
{
int a = 10;
Program b = new Program();
b.abc(a);
--------------------------------------------------------
* static으로 선언된 경우
- 동일한 클래스 내부의 메소드에 접근할 때 abc()란 함수명만 있으면 접근이 가능하다.
* static으로 선언되지 않은 경우
- 동일한 클래스 내부의 메소드에 접근할 때 클래스의 인스턴스를 선언해주고 접근해야 한다.
// 외부의 클래스에 접근할 때도 마찬가지다.
--------------------------------------------------------
class Program2
{
public static void abc2(int p)
{
Console.Write(p);
}
}
class Program
{
public void abc (int p)
{
Console.Write(p);
}
static void Main(string[] args)
{
int a = 10;
Program2.abc2(a);
--------------------------------------------------------
class Program2
{
public void abc2(int p)
{
Console.Write(p);
}
}
class Program
{
public void abc (int p)
{
Console.Write(p);
}
static void Main(string[] args)
{
int a = 10;
Program2 bbc = new Program2();
bbc.abc2(a);
--------------------------------------------------------
* static으로 선언된 경우
- 다른 클래스의 메소드에 접근할 때 클래스명.abc()란 함수명만 있으면 접근이 가능하다.
* static으로 선언되지 않은 경우
- 다른 클래스의 메소드에 접근할 때 클래스의 인스턴스를 선언해주고 접근해야 한다.
* ref, out 함수
- 값에 의한 전달과 참조에 의한 전달을 알고 있다면 간단하다.
- ref를 메서드에서 사용할 때 주의할 점은 보낼 곳과 받을 곳에 써준다.
- ref는 초기화시 사용 (x), 보낼 때 (o), 받을 때 (o)
--------------------------------------------------------
public static void abc(ref int a, ref int b) // 받을 때 사용o
{
int temp = a;
a = b;
b = temp;
}
static void Main(string[] args)
{
int a = 10; // 초기화시 사용x
int b = 20;
abc(ref a, ref b); // 보낼 때 사용o
Console.Write("{0} {1}", a, b);
}
--------------------------------------------------------
// 두 개의 값이 바뀐 것을 확인할 수 있다.
- out 함수는 출력함수로 용도가 조금 다르다.
- out은 초기화 사용 (x), 보낼 때 (o), 받을 때 (o)
--------------------------------------------------------
public static void abc(int a, int b, out int c)
{
c = a + b;
}
static void Main(string[] args)
{
int a = 10;
int b = 20;
int c;
abc(a, b, out c);
Console.Write("{0} {1} {2}", a, b, c);
}
--------------------------------------------------------
// out은 메서드 내에서 값이 입력되지 않으면 에러가 난다.
// 반드시 메서드를 거쳐 값이 입력될 때만 사용한다. 사용할 일은 별로 없어보인다.
* 메소드 오버로딩
static int abc(int a, int b)
static int abc(int a, int b, int c)
static double abc(double a, double b)
static double abc(double a, int b)
// 그렇다면 리턴형만 다르고 매개변수가 같다면? 안된다.
int abc(int a, int b)
double abc(int a, int b) 이건 불가능.
* params 가변길이 매개변수
- 메서드에 params + 배열로 받으면 무제한의 매개변수를 받을 수 있다.
--------------------------------------------------------
public static void abc(params int [] a)
{
foreach(int i in a)
{
Console.Write(i);
}
}
static void Main(string[] args)
{
abc(1, 2, 3, 4, 5, 6, 7);
}
--------------------------------------------------------
// 차라리 배열을 넘기는게 깔끔하지 않을까.. 굳이 쓸 필요는 없어보인다.
* named 명명된 매개변수
- 매개변수의 이름으로 값을 지정해서 넘기는 방식이다.
--------------------------------------------------------
public static void abc(int a, int b)
{
Console.Write(a);
Console.Write(b);
}
static void Main(string[] args)
{
abc(a: 10, b: 20); // int c = 50; abc(a:c)도 가능
}
--------------------------------------------------------
// 별 쓸모는 없어보이지만 매개변수가 많거나 할 땐 필요할 수도 있을 것 같다.
* optional 선택된 매개변수
- 매개변수의 고정 값을 넣는 방식이다. 유동적이라 쓸모있음.
--------------------------------------------------------
public static void abc(int a, int b, int c = 30)
{
Console.WriteLine("{0} {1} {2}", a, b, c);
}
static void Main(string[] args)
{
abc(10, 20);
abc(10, 20, 50);
}
--------------------------------------------------------
// 매개변수 자체에 고정값을 넣는건데 2개가 넘어올땐 고정값이 들어가지만
3개가 넘어올 땐 넘어온 값으로 바뀐다.