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, 닷넷, 시샵, 닷넷동영상, 시샵동영상, 닷넷교육, 닷넷학원, 시샵학원, 시샵연산자

2022년 1월 28일 금요일

C# 값전달, 참조전달 ref, out, 메소드 파라미터, C#학원, 시샵학원, C#교육, 시샵교육, 닷넷교육동영상

 C# 값전달, 참조전달  ref, out, 메소드 파라미터, C#학원, 시샵학원, C#교육, 시샵교육, 닷넷교육동영상


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


C# 값전달, 참조전달 ref, out, 메소드 파라미터

C# 값전달, 참조전달 ref, out, 메소드 파라미터값전달, 참조전달ref, out실습 : VS 2022값 전달, 참조전달(ref, out)C#이나 자바에서 메소드의 인자로 객체참조변수가 넘어가면 참조로 파라미터가 전달되

ojc.asia

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

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


값 전달, 참조전달(ref, out)


C#이나 자바에서 메소드의 인자로 객체참조변수가 넘어가면 참조로 파라미터가 전달되며 기본데이터 형식(int등)이 넘어가면 값 자체가 전달된다.


아래 예제는 Swap 함수로 값 자체가 전달된다.


namespace RefTest

{

    class Program

    {

        static void Swap(int a, int b)

        {

            int tmp = a; 

            a = b; 

            b = tmp;

        }

        static void Main(string[] args)

        {

            int a = 10; int b = 20;


            Console.WriteLine("a={0}, b={1}", a, b);

            Swap(a, b);

            Console.WriteLine("a={0}, b={1}", a, b);

        }

    }

}



[결과]

a=10, b=20

a=10, b=20


C#에서 기본데이터 형식을 참조로 넘기려면 ref, out을 사용한다.


- out 키워드

참조에 의한 전달을 할 때 사용하는 키워드로  참조로 값을 넘길 때 참조할 대상을 초기화할 필요는 없다. 함수로부터 값을 얻어낼 때 주로 사용하는 Out 파라미터로 특별히 초기화를 할 필요가 없다.

빈 깡통을 넘겨서 값을 얻어낼 때 사용(오라클 같은 DBMS 프로시저의 OUT 매개변수)하며 초기화된 배열을 넘기는 것도 가능하다.


- ref 키워드

참조로 값이 전달되며, 참조할 변수는 반드시 초기화되어 있어야 한다.


namespace RefTest

{

    class Test

    {

        private static void Sum(int num, ref int tot)

        {

            tot += num;

        }


        static void Main()

        {

            int tot = 0;

            Sum(10, ref tot);

            Console.WriteLine("Sum : {0}", tot);

            Sum(20, ref tot);

            Console.WriteLine("Sum : {0}", tot);

        }

    }

}


namespace RefTest

{

    class Test

    {

        private static void Add(int num1, int num2, out int tot)

        {

            //tot는 out 타입으로 메소드 실행중 초기화 된다.

            tot = num1 + num2;

        }


        static void Main()

        {

            int tot = 999;   //기본적으로 초기화 필요없고, 초기화 되어있어도 무시된다.

            Add(10, 20, out tot);

            Console.WriteLine("Sum : {0}", tot);

            Add(20, 30, out tot);

            Console.WriteLine("Sum : {0}", tot);

        }

    }

}


[결과]

Sum : 30

Sum : 50



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



#값전달, #참조전달, #ref, #out, #시샵동영상, #시샵교육, #시샵학원, #닷넷교육, #닷넷학원, 값전달, 참조전달, ref, out, 시샵동영상, 시샵교육, 시샵학원, 닷넷교육, 닷넷학원, 

C# 부분클래스, 부분메소드, partial class partial method, C#학원, C#교육, C#동영상, 닷넷교육, 닷넷학원, 닷넷동영상

 C# 부분클래스, 부분메소드, partial class  partial method, C#학원, C#교육, C#동영상, 닷넷교육, 닷넷학원, 닷넷동영상





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

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



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



C# partial 클래스

 

  • C# 2.0 이상에서 partial class는 여러 개의 파일에 하나의 클래스를 분리하여 만들거나 하나의 파일에 여러 클래스를 만들 수 있는 방법을 제공한다. 
  • 윈폼등에서 폼을 생성하면 기본적으로 자동으로 만들어 주는 개발자가 손댈 필요가 없는 디자인 요소의 파일(Form1.Designer.cs) 코드와 개발자가 작성하는 C# 코드(Form1.cs)를 분리하여 C# 개발자는 C# 비하인드 코드 개발에 집중할 수 있도록 해주며, 컴파일러가 분리된 partial class를 하나의 클래스로 합쳐준다.
  • 대형 프로젝트를 진행하는 경우 클래스를 개별 파일로 분할하면 여러 프로그래머가 동시에 작업을 수행할 수 있다.

 


하나의 파일에 Emp 클래스를 나누어서 정의하는 경우


using System;

namespace ConsoleApplication7

{   

    partial class Emp

    {

        public void gotoOffice() 

        {

            Console.WriteLine("출근합니다.");

        }

    }


    partial class Emp

    {

        public void Work() 

        {

            Console.WriteLine("일합니다.");

        }

    }


    partial class Emp

    {

        public void getoffWork() 

        {

            Console.WriteLine("퇴근합니다.");

        }

    }


    class MainTest

    {

        static void Main()

        {

            Emp e = new Emp();

            e.gotoOffice();

            e.Work();

            e.getoffWork();

        }

    }

}


//------------------------------------------------------


서로 다른 파일에 Emp 클래스를 나누어서 정의하는 경우


[Program.cs]

using System;

namespace ConsoleApplication2

{

    partial class Emp

    {

        public int id;

        public string name;

    }

    class Program

    {

        static void Main()

        {

            Emp e1 = new Emp();

            e1.id = 1; e1.name = "1길동";

            Console.WriteLine(e1);

            Console.WriteLine(e1.ToString());


            Emp e2 = new Emp()

            {

                id = 2,

                name = "2길동"

            };

            Console.WriteLine(e2);

        }

    }

}


[Program2.cs]

using System;

namespace ConsoleApplication2

{

    partial class Emp

    {

        public override String ToString()

        {

            return "[사원]id=" + id + ",name=" + name;

        }

    }

}




C# partial 메소드

 

  • partial 클래스의 한쪽(추상클래스)에서는 메소드의 선언만 하고, 다른쪽 partial 클래스(구현 클래스)에서 메소드를 구현할 수 있다.  만약 개발자가 구현을 하지 않는다면 컴파일러는 컴파일 시점에 해당 partial 메소드 빼고 컴파일 한다.
  • partial 메소드를 작성하기 위해서는 partial로 메소드가 시작되어야 하며, 선언과 정의 타입이 일치해야하며, void를 리턴하도록 해야 하며, out 매개변수, virtual, override, sealed등이 없으며,  접근 지정자는 없다(private이 기본).




namespace PartialTest

{

    partial class Hello

    {

        public string name = "";

        public Hello()

        {

            SayHello("홍길동");

        }

        partial void SayHello(string name);

    }


    partial class Hello

    {          

        partial void SayHello(string name)

        {

            this.name = name;

        }

    }


    class Test

    {

        static void Main()

        {

            Hello h = new Hello();

            Console.WriteLine("Hello ~ " + h.name);            

        }

    }

}





#partialclass, #partialmethod, #partial클래스, #partial메소드, #닷넷교육, #닷넷학원, #닷넷강의, #시샵동영상, #시샵교육, #시샵학원, partialclass, partialmethod, partial클래스, partial메소드, 닷넷교육, 닷넷학원, 닷넷강의, 시샵동영상, 시샵교육, 시샵학원, 

(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...