레이블이 OperatorOverloading인 게시물을 표시합니다. 모든 게시물 표시
레이블이 OperatorOverloading인 게시물을 표시합니다. 모든 게시물 표시

2022년 1월 29일 토요일

C# 연산자 오버로딩, Operator Overloading, public static ~ operator(C#동영상, 닷넷동영상교육, C#학원, 자바학원, C#동영상, WPF학원, WPF교육)

 C# 연산자 오버로딩,  Operator Overloading,  public static ~ operator(C#동영상, 닷넷동영상교육, C#학원, 자바학원, C#동영상, WPF학원, WPF교육)


http://ojc.asia/bbs/board.php?bo_table=LecCsharp&wr_id=403 


C# 연산자 오버로딩, Operator Overloading, public static ~ operator(C#동영상, 닷넷동영상교육)

C# 연산자 오버로딩, Operator Overloading, public static ~ operator(C#동영상, 닷넷동영상교육)연산자 오버로딩Operator Overloading실습 : VS 2022연산자 오버로딩(Operator Overloading)연산자 오버로딩이란 +, -와 같은

ojc.asia

https://www.youtube.com/watch?v=XC3f8CnY6yk&list=PLxU-iZCqT52DJyR6gqJy0MCL8RiTVXdos&index=14 





연산자 오버로딩

Operator Overloading 


실습 : VS 2022





연산자 오버로딩(Operator Overloading)


  • 연산자 오버로딩이란 +, -와 같은 연산자들을 용도에 맞게 다시 의미, 기능을 부여하여 작동하도록 한 것인데, 메소드 오버로딩에서 메소드의 인자개수나 타입을 변형해서 같은 메소드를 여러개 정의하는 것과 비슷하게 연산자는 같지만 받아들이는 피연산자의 형식이 다르게해서 연산자의 의미, 기능을 여러 개 정의하는 것이다. 
  • public static ~ operator 키워드를 사용한다.



다음과 같은 A 클래스가 있다고 하자.


public class A{

public int val;

}


A a1 = new A();   a1.val=1;

A a2 = new A();   a2.val=2;


//객체를 더할수는 없다. 오류!!

A a3 = a1 + a2;  


위 예제를 다음과 같이 고쳐 보자.


namespace OperatorOverload1

{

public class A

{

public int val;

public static A operator +(A a1, A a2)

{

A a3 = new A();

a3.val = a1.val + a2.val;

return a3;

}

}


class Test

{

static void Main()

{

A a1 = new A(); a1.val = 1;

A a2 = new A(); a2.val = 2;

A a3 = a1 + a2;


Console.WriteLine("a1 + a2 = {0}", a3.val);

}

}

}


[다음 예제를 보자]


namespace OperatorOverload1

{

public class A1

{

public int val;

//아래의 함수는 A1, A2에서는 정의가 가능하며 A3에서는 불가

public static A3 operator +(A1 a1, A2 a2)

{

A3 a3 = new A3();

a3.val = a1.val + a2.val;

return a3;

}

}


public class A2 { public int val; }

public class A3 { public int val; }


class Test

{

static void Main()

{

A1 a1 = new A1(); a1.val = 1;

A2 a2 = new A2(); a2.val = 2;

A3 a3 = a1 + a2;

Console.WriteLine("a1 + a2 = {0}", a3.val);

}

}

}



C#에서 오버로딩 할 수 있는 연산자.


단항 연산자 ::: +, -, !,  ~, ++, --, true, false

이항 연산자 ::: +, -, *, /, %, &, |, <<, >>

비교 연산자 ::: ==, !=, <, >, <= , >=


  • true와 false를 오버로딩 하면 클래스, 객체를 bool 표현식에서 사용 할 수 있다.
  • += 같은 배정 연산자는 오버로딩 할 수 없지만 +연산자를 오버로딩 함으로써 +=을 오버로딩 한 것과 같은 효과를 나타낸다. 
  • =(등호)는 오버로딩 할 수 없는데 이 연산자는 기능을 바꿀 필요가 없는 것이다. 
  • &&와 ||역시 오버로딩 할 수 없는데 &, |를 오버로딩 하여 구현하면 된다. 
  • < 와 >의 경우 반드시 쌍으로 오버로딩 해야 한다. 즉 < 를 오버로딩 했을 때 >도 반드시 오버로딩 해야 한다. 비교연산자를 오버로딩 할 때는 한 연산자에서 다른 연산자를 호출하여 처리할 수도 있다.
  • true 와 false의 경우도 반드시 쌍으로 오버로딩 해야 한다. 


public class A{

public int val;

public static bool operator > (A op1, Aop2) {

return (op1.val > op2.val);
}


public static bool operator < (A op1, Aop2) {

return !(op1 > op2);

}

}


  • ==와 != 연산자에 대해서는 위의 경우 처럼 사용이 가능하나 Object.Equals()와 Object.GetHashCode()도 재정의 하는 경우가 많이 있다. 즉 ==를 재정의 하는 부분에서 Equals 메소드도 재정의 함으로써 사용자가 == 또는 Equals() 어느 것으로 비교하든지 같은 결과가 나타나게 할 수 있다. 


[예제]

namespace ConsoleApplication2

{

    public class A

    {

        public int val;

        public static bool operator ==(A op1, A op2) { return (op1.val == op2.val); }

        public static bool operator !=(A op1, A op2) { return !(op1 == op2); }


        public static bool operator >(A op1, A op2) { return (op1.val > op2.val); }


        public static bool operator <(A op1, A op2) { return (op1.val < op2.val); }

        //op1과 op2가 같아도 true이므로 위의꺼로

        //public static bool operator < (A op1, A op2) { return !(op1.val > op2.val); }  


        public override bool Equals(object op1)

        {

            return val == ((A)op1).val;

        }

        //GetHashCode 는 개체의 상태에 기반한 고유한 int 값을 얻는데 사용 한다.

        //Equals 메서드를 재정의했다면, 반드시 GetHashCode메서드에 대해서도 재정의를 해줘야 한다

        //컴파일러는 Equals만 재정의한 경우 경고 메시지를 표시한다.

        //모든 컬렉션에서는 두 객체가 동일한지 알기위해 GeHashCode를 확인하기때문

        public override int GetHashCode() { return this.GetHashCode(); }


        static void Main()

        {

            A op1 = new A(); op1.val = 1;

            A op2 = new A(); op2.val = 2;

            Console.WriteLine("op1 = op2 = {0}", op1 == op2);

            Console.WriteLine("op1 = op2 = {0}", op1.Equals(op2));

            Console.WriteLine("op1 > op2 = {0}", op1 > op2);

            Console.WriteLine("op1 < op2 = {0}", op1 < op2);

        }

    }


}


#연산자오버로딩, #OperatorOverloading, #닷넷, #시샵, #닷넷동영상, #시샵동영상, #닷넷교육, #닷넷학원, #시샵학원, #시샵연산자,
연산자오버로딩, OperatorOverloading, 닷넷, 시샵, 닷넷동영상, 시샵동영상, 닷넷교육, 닷넷학원, 시샵학원, 시샵연산자

(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...