객체지향에서 객체는 1)속성과 2)메소드를 지니고 있어야 한다!!
메소드는 클래스 내에서만 정의된다. namespace는 그저 class만 담는 정도
i.e. namespace에서는 명령문이 올 수 없다는 것을 의미. 단, enum은 제외
변수는 속성이고 함수는 메소드에 해당한다.
i.e. 이에 따라 변수는 calss 밖에서 정의가 되는데 함수는 불가임.
return문 : return닿으면 값을 반환하고 함수탈출 (void함수는 없어도 가능, 반대는 꼭!존재必)
public은 class밖에서도 사용 가능, private는 class 내부에서만 사용 가능.
(안 적혀 있는 건 private가 default구조이다)

[자료구조] 2. 스택(Stack)과 큐(Queue), 덱(Deque)
public static void Swap(int a, int b)
{
int temp = b;
b = a;
a = temp;
}
static void Main(string[] args)
{
int x = 3;
int y = 4;
Swap(x, y); //여기서 함수 실행히우도 3,4값이 바뀌지는 않는다.
//값을 복사해서(int a, int b)에 줬을뿐, 그 변수를 바꾸는건 아니다!
}
But, 이때, 원래의 값을 바꾸고 싶다면 어떻게 해야 할까?
A) 참조 변수(call by reference 를 써서 해결할 수 있음.

| 변수 타입 | C# | C | C++ |
|---|---|---|---|
| call by value (값을 변경) | O | O | O |
| call by address(주소를 통해 변경) → 위험 | X | O | O |
| call by reference (참조 변수로 변경) | O | X | O |
But, 참조 변수에 해당하는 놈이 아닌 다른 전역변수에 값을 담고 싶다면 어쩌지?
A) 그럴 때는 OUT변수를 쓰자!
void Divide( int a, int b, out int quotient, out int remainder )
{
quotient = a / b;
remainder = a % b;
}
int a = 20;
int b = 3;
int c;
int d;
Divide( a, b, out c, out d );
Console.WriteLine("Quotient : {0}, Remainder {1}", c, d );
int a = 3;
data_f(1231,321,a); <=> a = data_f(1231,321);
<aside> 💡
void f(int[] a) a[100] =100;
{
int [] X = new int [200]; → Heap에 메모리 할당하고 참조 변수 정의
f(x); → 값을 가져준 게 아니라, 참조 변수 X이므로 참조 변수를 준거임!
(참조 변수 주소는 8byte이므로 8byte 전달 해준 것이다!)
int y= X[100]; → 이때 값은 100 이 나올 것 이다.
}
</aside>
같은 이름의 메소드를 놓은 상태에서 입력변수에 맞게 알아서 호출되는 기능
만일, 아래와 같은 구조라면, double만 존재해도 정수 형 입력을 묵시적으로 실수 형으로 변환

(그러나, int result1 로 인해서 오류가 날것이다 int → double (O) double → int (X) 이므로)
void MyMethod( int a, int b = 0 )
//이런식으로 "= 몇" 을 추가하면 값을 안줘도 그 값을 default값으로 알아서 들어감.
{
Console.WriteLine( “{0}, {1}”, a, b );
}
MyMethod(3); // 매개변수 b 생략
MyMethod(3, 4);
class Man
{
~
}
Man a = new Man();
Man b = a;
Man b =a;를 하는 순간 참조변수값을 복사
이에 따라 class에 들어가져있는 값이랑
b에서 바꾸는 값이 동일하므로 동기화됨
struct Man
{
~
}
Man a = new Man();
Man b = a;
이건 b가 a를 복사+참조변수까지
폼 그자체를 다 복사해서 가져옴
그러므로 b 를 바꾼다고 a가 바뀌지 않음