using System;
// C++ 과 다른 C#의 핵심 문법들
// 1. Property : 구현자 입장에서는 함수(제어문 가능)
//               사용자 입장에서는 Data처럼 보인다.
// 2. indexer : C++의 배열 연산자 재정의..
class Bike
{
    private int gear;
    private int[] array = new int[10];  // C#의 배열 만드는 법.
    public int Gear
    {
        get { return gear; }
        set {  if( value < 100 ) gear = value; }
    }
    public int this[int name]   // set_Item( name, value ) 함수로 제공된다.
    {
        get { return array[name]; }
        set { array[name] = value; }
    }
}
class Test
{
    public static void Main()
    {
        Bike p = new Bike();
        p.Gear = 10;
        Console.WriteLine("{0}", p.Gear);
    }
}
//////////////////////////////////////////////////////
// out 파라미터와 Ref 파라미터
// 결국 항상 C처럼 메모리 그림을 그려서 해결하면 됩니다.
class Point
{
    public int x;
}
class Test
{
    public static void foo(out Point p)
    {
        //p.x = 20;
        p = new Point();
        p.x = 100;
    }
    public static void Main()
    {
        Point p1 = new Point();
        p1.x = 10;
        foo(out p1);
        Console.WriteLine("{0}", p1.x);
    }
}
class Test
{
    public static void foo(out int a)
    {
        a = 20;
    }
    public static void Main()
    {
        int x = 10;
        foo(out x);
        Console.WriteLine("{0}", x);
    }
}
//////////////////////////////////////////////////////////
// 결국 C++ : type 사용자가 메모리의 위치 결정
//      C#  : type 제작자가 메모리의 위치 결정
// 무조건 참조 type이다.
class Point1
{
    public int x;
    public int y;
}
// 구조체는 무조건 값 type이다. stack에 객체가 만들어 진다.
struct Point2
{
    public int x;
    public int y;
}
class Test
{
    public static void Main()
    {
        Point1 p1;  // 참조 일 뿐이다.
        Point2 p2;  // 객체이다.
        Point1 p3 = new Point1();   // 힙에 만든다.
        Point2 p4 = new Point2();   // stack에 만든다.
        // int는 구조체이다.
        int a;
        Point1 pp;  // 실제 Point1이 아니고 C++의 포인터개념이다.
                    // (C#에서는 레퍼런스라고 한다.)
        //Point1 p = new Point1;  // C++
        Point1 p = new Point1();  // C#
        int a = 0;
        int b = new int();
    }
}
