Category Archives: C# Programming

C# operator== vs. Equals

http://msdn.microsoft.com/en-us/library/ms173147.aspx

// Operator Overloading
if (x == y) { // 컴파일시 x와 y가 동일한지 확인

// 참조형일 경우
object x = “hello”;
object y = ‘h’ + “ello”; // ensure it’s a different reference
if (x == y) { // 결과 => FALSE
if (x.Equals(y)) { // 결과 => TRUE

// string 형(참조형이긴 하지만)일 경우
// Equals와 equality operators (== and !=) 을 구현하여 string 객체의 값이 동일한지 확인
string x1 = “hello”;
string y1 = ‘h’ + “ello”; // ensure it’s a different reference
if (x1 == y1) { // 결과 => TRUE
if (x1.Equals(y1)) { // 결과 => TRUE

Interface

Interface (인터페이스)
http://dis.dankook.ac.kr/lectures/hci09/entry/Interface

IEnumerable & IEnumerator Interface
-IEnumerable 인터페이스는 foreach를 사용하여 컬랙션을 반복하는 것을 지원하기 위해 구현하여 사용한다.
http://dis.dankook.ac.kr/lectures/hci11/entry/IEnumerable
http://dis.dankook.ac.kr/lectures/hci09/entry/Enumerator

IEquatable Interface
-IEquatable 인터페이스는 두 객체간에 서로 내부 내용이 같은 지 (예: if(a == b))를 비교하기 위해 구현하여 사용한다.
http://dis.dankook.ac.kr/lectures/hci11/entry/IEquatable
http://dis.dankook.ac.kr/lectures/hci10/72
http://dis.dankook.ac.kr/lectures/hci09/entry/Equals

IComparable Interface
-IComparable 인터페이스는 개체에 대한 기본 정렬(sort) 순서를 지정해주기 위해 구현하여 사용한다. 해당 개체를 배열이나 컬랙션에서 정렬하는데 필요하다.
http://dis.dankook.ac.kr/lectures/hci11/entry/IComparable

Method Overloading vs. Method Overriding

http://dis.dankook.ac.kr/lectures/hci10/entry/Method-Overloading-vs-Method-Overriding

Method Overloading: 동일한 함수명에 매개변수가 다른 함수를 둘 이상 정의하는 것으로, 동일한 함수 기능을 수행하지만 다른 매개변수의 경우를 처리할 때 사용

Method Overriding: 상속받은 파생 클래스에서 동일한 함수명에 동일한 매개변수로 정의하여 함수를 재정의하는 것으로 상속되어진 함수의 기능을 변경해서 재사용하고 싶을 때 사용

    class Point : IEquatable<Point>, IComparable<Point>
    {
        // static member field
        protected static int count = 0;

        // instance member field
        protected int x, y;


        // property
        public int X
        {
            get { return this.x; }
            set { this.x = value; }
        }


        public int Y
        {
            get { return this.y; }
            set { this.y = value; }
        }


        public static int Count
        {
            get { return count; }   // error: this.count 는 사용할 수 없음
        }


        // constructor & destructor
      public Point() : this(0, 0) { }
      public Point(int x, int y) { this.x = x; this.y = y; count++; }
        ~Point() { count–; }


        // method
      public void SetPosition(int x, int y) { this.x = x; this.y = y; }
      public void Move(int x, int y) { this.x += x; this.y += y; }


      // ToString method override
      public override string ToString() { return (String.Format(“({0}, {1})”, x, y)); }
      // virtual method
      public virtual void Print() { Console.WriteLine(“X={0} Y={1}”, x, y); }
       
        // static method
        public static int GetCount() { return count; }
                                 
      // operator++ overload
      public static Point operator++(Point p) { ++p.x; ++p.y; return p; }            
      // operator== overload
      public static bool operator==(Point p1, Point p2) { return p1.Equals(p2); }    
      // operator!= overload        
      public static bool operator!=(Point p1, Point p2) { return !p1.Equals(p2); }    
      public override int GetHashCode() { return x ^ y; }
      public override bool Equals(object obj)
      {
            if (!(obj is Point))
                return false;
            return Equals((Point)obj);
      }
 
        // IEquatable
        public bool Equals(Point other)
        {
            if (this.x == other.x && this.y == other.y)
                return true;
            return false;
        }


        // IComparable
        public int CompareTo(Point other)
        {
            if (this.x > other.x)
            {
                return 1;
            }
            else if (this.x < other.x)
            {
                return -1;
            }
            else
            {
                return 0;
            }
        }
    }






    class Point3D : Point, IEquatable<Point3D>
    {
        // instance member field
        protected int z;


        // property
        public int Z
        {
            get { return this.z; }
            set { this.z = value; }
        }


        // constructor & destructor
      public Point3D() : this(0, 0, 0) { }
      public Point3D(int x, int y, int z) : base(x, y) { this.z = z; }
        ~Point3D() { }


      public void SetPosition(int x, int y, int z) { base.SetPosition(x, y); this.z = z; }
      public void Move(int x, int y, int z) { base.Move(x, y); this.z += z; }


      // override ToString method
      public override string ToString() { return (String.Format(“({0}, {1}, {2})”, x, y, z)); }
      // overrided method
      public override void Print() { Console.WriteLine(“X={0} Y={1} Z={2}”, x, y, z); }  
      // operator++ overload
      public static Point3D operator++(Point3D p) { ++p.x; ++p.y; ++p.z; return p; }      
      // operator== overload
      public static bool operator ==(Point3D p1, Point3D p2) { return p1.Equals(p2); }    
      // operator!= overload  
      public static bool operator !=(Point3D p1, Point3D p2) { return !p1.Equals(p2); }  
      
public override int GetHashCode() { return x ^ y ^ z; }
      public override bool Equals(object obj)
      {
            if (!(obj is Point3D))
                return false;
            return Equals((Point3D)obj);
      }


        // IEquatable
        public bool Equals(Point3D other)
        {
            if (this.x == other.x && this.y == other.y && this.z == other.z)
                return true;
            return false;
        }
    }




    class PointTest
    {
      // pass-by-value (value type)
      static void Swap(int p1, int p2)            
        {
            int p;
            p = p1;
            p1 = p2;
            p2 = p;
        }


      // pass-by-reference (value type)
      static void Swap(ref int p1, ref int p2)
        {
            int p;
            p = p1;
            p1 = p2;
            p2 = p;
        }


      // pass-by-value (reference type)
      static void Swap(int[] p1, int[] p2)        
        {
            int[] p;
            p = p1;
            p1 = p2;
            p2 = p;
        }


      // pass-by-value (reference type)
      static void Swap(ref int[] p1, ref int[] p2)        
        {
            int[] p;
            p = p1;
            p1 = p2;
            p2 = p;
        }


      static void Swap(ref Point p1, ref Point p2)
        {
            Point p;
            p = p1;
            p1 = p2;
            p2 = p;
        }


      static void Swap(ref Point3D p1, ref Point3D p2)
        {
            Point3D p;
            p = p1;
            p1 = p2;
            p2 = p;
        }


        static void Main(string[] args)
        {
            // value type: pass-by-value/pass-by-reference
            int i = 5, j = 10;
            Console.WriteLine(“Before: i={0}, j={1}”, i, j);


          Swap(i, j);
            Console.WriteLine(“After integer pass-by-value swap: i={0}, j={1}”, i, j);


          Swap(ref i, ref j);
            Console.WriteLine(“After integer pass-by-reference Swap: i={0}, j={1}”, i, j);


            // reference type: pass-by-value/pass-by-reference
            int[] arr1 = { 1, 2, 3 };
            int[] arr2 = { 4, 5, 6, 7, 8 };
            Console.WriteLine(“Before array pass-by-value swap: “);
            Console.Write(“arr1: “);
            foreach (int a in arr1)
                Console.Write(“{0} “, a);
            Console.WriteLine();
            Console.Write(“arr2: “);
            foreach (int a in arr2)
                Console.Write(“{0} “, a);
            Console.WriteLine();


          Swap(arr1, arr2);
            Console.WriteLine(“After array pass-by-value swap: “);
            Console.Write(“arr1: “);
            foreach (int a in arr1)
                Console.Write(“{0} “, a);
            Console.WriteLine();
            Console.Write(“arr2: “);
            foreach (int a in arr2)
                Console.Write(“{0} “, a);
            Console.WriteLine();


          Swap(ref arr1, ref arr2);
            Console.WriteLine(“After array pass-by-reference swap: “);
            Console.Write(“arr1: “);
            foreach (int a in arr1)
                Console.Write(“{0} “, a);
            Console.WriteLine();
            Console.Write(“arr2: “);
            foreach (int a in arr2)
                Console.Write(“{0} “, a);
            Console.WriteLine();


            Console.Write(“p1: “);
            Point p1 = new Point();
            Console.Write(“p2: “);
            Point p2 = new Point();


            // Point
            p1.SetPosition(10, 10);  // 변수 값 지정
            Console.Write(“p1 SetPosition: “);
            p1.Print();    // 현재 좌표 출력
            p1.Move(20, 50);  // 좌표 변경 (점의 위치 이동)
            Console.Write(“p1 Move: “);
            p1.Print();    // 현재 좌표 출력
            Console.WriteLine(“p1=” + p1);


            p2.SetPosition(20, 30); // 변수 값 지정
            Console.Write(“p2 SetPosition: “);
            p2.Print();    // 현재 좌표 출력


            //포인터 객체 교환함수 호출
            Console.WriteLine(“\nSwap”);
          Swap(ref p1, ref p2);
            Console.WriteLine(“p1: {0}”, p1);
            Console.WriteLine(“p2: {0}”, p2);


            Console.WriteLine();
            Console.WriteLine(“p1.m_nX={0}, p1.m_nY={1}, Point.GetCount()={2}”, p1.X, p1.Y, Point.Count);
            Console.WriteLine(“p2.m_nX={0}, p2.m_nY={1}, Point.GetCount()={2}”, p2.X, p2.Y, Point.Count);


            // Point3D
            Console.Write(“p3: “);
            Point3D p3 = new Point3D();
            Console.Write(“p4: “);
            Point3D p4 = new Point3D();


            Console.WriteLine();
          p3.SetPosition(10, 20);
            Console.Write(“p3 SetPosition: “);
            p3.Print();   // 현재 좌표 출력
          p3.SetPosition(30, 40, 50);
            Console.Write(“p3 SetPosition: “);
            p3.Print();   // 현재 좌표 출력
          ++p3;
            Console.Write(“++p3: “);
            p3.Print();   // 현재 좌표 출력
          p3.Move(20, 30, 40);   // 좌표 변경 (점의 위치 이동)
            Console.Write(“p3 Move: “);
            p3.Print();   // 현재 좌표 출력
          p3.Move(10, 10);   // 좌표 변경 (점의 위치 이동)
            Console.Write(“p3 Move: “);
          Console.WriteLine(p3); // p3는 Point클래스의 ToString이 호출


            Console.WriteLine();
            p4.SetPosition(100, 200, 300);
            Console.Write(“p4 SetPosition: “);
            p4.Print();   // 현재 좌표 출력
            p4.Move(10, 10, 10);   // 좌표 변경 (점의 위치 이동)
            Console.Write(“p4 Move: “);
            p4.Print();   // 현재 좌표 출력


            //포인터 객체 교환함수 호출
            Console.WriteLine(“\nSwap”);
          Swap(ref p3, ref p4);
            Console.WriteLine(“p1: {0}”, p3);
            Console.WriteLine(“p2: {0}”, p4);


            Console.WriteLine();
            Console.WriteLine(“p3.m_nX={0}, p3.m_nY={1}, p3.m_nZ={2}, Point.GetCount()={3}”, p3.X, p3.Y, p3.Z, Point.GetCount());
            Console.WriteLine(“p4.m_nX={0}, p4.m_nY={1}, p4.m_nZ={2}, Point.count={3}”, p4.X, p4.Y, p4.Z, Point.Count);


          if (p3 == p4)
                Console.WriteLine(“p3 == p4”);
          if (p3 != p4)
                Console.WriteLine(“p3 != p4”);


            Console.Write(“p5: “);
          Point p5 = p3;
          p5.Print();   // 현재 좌표 출력 p5는 Point3D – polymorphism
            Console.Write(“p6: “);
          Point p6 = new Point3D(110, 210, 310); // p6도 Point3D
          p6.Print();   // Point3D의 Print가 호출 (late binding) – polymorphism
            Point3D p7 = (Point3D)p5;
          Console.WriteLine(p7);   // p7는 Point3D클래스의 ToString이 호출
          if (p7 == p5)
                Console.WriteLine(“p7 == p5”);
          if (p7 == p6)
                Console.WriteLine(“p7 == p6”);
        }
    }

Class

Indexer
http://dis.dankook.ac.kr/lectures/hci09/entry/Indexer

Property (속성)
http://dis.dankook.ac.kr/lectures/hci09/entry/Property

Method overloading (메소드 오버로딩) Method overriding (메소드 오버라이딩)
http://dis.dankook.ac.kr/lectures/hci09/entry/Method-Overloading

Abstract Class (추상 클래스)
http://dis.dankook.ac.kr/lectures/hci09/entry/Abstract-class

Sealed Class (봉인 클래스)
http://dis.dankook.ac.kr/lectures/hci09/entry/Sealed-Class

OOP

Class (클래스) – defines the grouping of data and code, the “type” of an object (데이터와 코드의 그룹화, 개체의 “유형”을 정의)
Instance (인스턴스/객체) – a specific allocation of a class (클래스 객체의 특정 할당)
Message (메시지) – sent to objects to make them act (그들 행동을 하기위해 개체에 전송)
Method (메소드) – a “function” that an object knows how to perform (객체가 수행하는 방법을 알고있는 “함수”)
Instance Variables (인스턴스 변수) – a specific piece of data belonging to an object (객체에 속하는 데이터의 특정 부분)
Property (속성) – away to access instance variables and other attributes of an object (인스턴스 변수나 객체의 다른 속성에 접근하기위한 방법)
Encapsulation (캡슐화) – keep implementation private and seperate from interface (private하게 구현하고 인터페이스와는 별개로 유지)
Polymorphism (다형성) – different objects, same interface (다른 객체, 같은 인터페이스)
Inheritance (상속) – hierarchical organization. share code, customize or extend behaviors (계층적 조직, 코드의 공유, 사용자 정의 및 행동을 확장)

pass by value vs pass by reference vs pass by output

http://dis.dankook.ac.kr/lectures/hci10/entry/pass-by-value와-pass-by-reference와-pass-by-output-비교

pass value type by value (값형식을 값에 의한 전달)
pass reference type by value (참조형식을 값에 의한 전달)
-copy of reference가 전달

pass value type by reference (값형식을 참조에 의한 전달)
ref 키워드 사용
pass reference type by reference (참조형식을 참조에 의한 전달)
ref 키워드 사용

pass value type by output (값형식을 output에 의한 전달)
out 키워드 사용
pass reference type by output (참조형식을 output에 의한 전달)
out 키워드 사용

static class vs singleton design pattern

공용 데이터를 저장하여 사용하고자 할 때, singleton 패턴이나 static 클래스를 사용한다.

싱글톤 패턴 (Singleton design pattern)
-싱글톤 패턴이란 single instance object(해당 클래스의 인스턴스 하나)가 만들어지고, 어디서든지 그 싱글톤에 접근할 수 있도록 하기 위한 패턴

정적 클래스 (Static class)
-static 키워드를 사용한 정적 클래스는 정적 멤버만 포함 가능
-정적 클래스는 new 키워드를 사용하여 정적 클래스의 인스턴스를 생성할 수 없음
-정적 클래스는 봉인 클래스 (sealed class) 임
-static 클래스는 single-instance, global 데이터를 저장하여 사용하는 용도로 적당
-그러나, 싱글톤은 인자(parameter)나 객체(object)로 사용가능하나 정적클래스는 불가능

http://dis.dankook.ac.kr/lectures/hci10/entry/singleton-pattern과-static-class-비교