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

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월 15일 토요일

(동영상)닷넷이란? CLI, CLS, CLR, CTS, 어셈블리 VS 2022, C# HelloWorld, Main함수, C#닷넷교육, 닷넷학원, 시샵학원

 (동영상)닷넷이란?  CLI, CLS, CLR, CTS, 어셈블리  VS 2022, C# HelloWorld, Main함수, C#닷넷교육, 닷넷학원, 시샵학원





이미지 썸네일 삭제
닷넷이란? CLI, CLS, CLR, CTS, 어셈블리 VS 2022, C# HelloWorld, Main함수

닷넷이란? CLI, CLS, CLR, CTS, 어셈블리 VS 2022, C# HelloWorld, Main함수C#닷넷이란?CLI, CLS, CLR, 어셈블리VS 2022, C# HelloWorld닷넷이란?(CLI, CLR, CTS, CLS)닷넷이란? 마이크로소프트에서 개발한 프로그램 개발 및 실행 환경이다.CLS(Common Language Specific…

ojc.asia

이미지 썸네일 삭제
닷넷이란? CLI, CLS, CLR, CTS, 어셈블리 VS 2022, C# HelloWorld, Main함수

닷넷이란? CLI, CLS, CLR, CTS, 어셈블리 VS 2022, C# HelloWorld, Main함수C#닷넷이란?CLI, CLS, CLR, 어셈블리VS 2022, C# HelloWorld닷넷이란?(CLI, CLR, CTS, CLS)닷넷이란? 마이크로소프트에서 개발한 프로그램 개발 및 실행 환경이다.CLS(Common Language Specific…

ojc.asia






닷넷이란?  CLI, CLS, CLR, CTS, 어셈블리  VS 2022, C# HelloWorld, Main함수

C#




 

닷넷이란?

CLI, CLS, CLR, 어셈블리

VS 2022, C# HelloWorld





 닷넷이란?(CLI, CLR, CTS, CLS)


  • 닷넷이란마이크로소프트에서 개발한 프로그램 개발 및 실행 환경이다. 


  • CLS(Common Language Specification) : 닷넷 컴파일러가 지원해야 하는 최소한의 표준규약으로 C#.NET, VB.NET, C++.NET, F#등 닷넷 프레임웍 언어가 반드시 지켜야 하는 언어 스펙으로 CLS를 따르는 언어라면 어떠한 언어라도 닷넷 프레임워크에서 실행가능하다.


  • CLR(Common Language Runtime) : 닷넷의 실행환경. 닷넷 언어의 컴파일된 자원들은 CLR이라는 독립적인 환경에서 실행된다. 즉 소스코드를 컴파일 하면 닷넷 어셈블리가 되는데, 이 어셈블리가 CLR 위에서 동작한다.VS 2022에서는 C#, C++, VB, F#, Python, Node.js, JavaScript, TypeScript 등의 언어를 지원한다. 사용자가 컴파일된 중간언어 파일인 .exe를 실행하면 CLR이 메모리에 로드되고 .exe를 번역하여 기계어(머신코드)로 변환 후 OS위에서 실행을 한다.






  • CTS(Common Type System) :  닷넷 호환 언어가 지켜야할 타입의 표준 규격. C#에서는 4바이트 정수를 int 라고 사용하고, VB.NET에서는 Integer라고 사용한다. 하지만 이들은 모두 닷넷의 공용 타입인 System.Int32 타입이다.


  • CLI(Common Language Infrastructure) : CTS를 명세를 포함하고 MSIL(중간언어)에 대한 코드정의, 메타데이터와 이를 포함하는 MSIL(중간언어)의 구조를 포함하여 표준사양으로 기술한다. 결국 닷넷 프레임워크는 CLI의 구현체로 보면 된다.


  • Visual Studio.NET 2022는 C#, C++, VB, F#, Python, Node.js, JavaScript, TypeScript 등 여러 언어들을 지원하며 닷넷 환경에서 어느 프로그래밍 언어로 작성하던지 컴파일 된 코드(MSIL, Microsoft Intermediate Language)는 같다는 것이 아주 강력한 특징이다. 즉 프로그래머가 가장 자신 있고 편한 언어로 개발하면 된다는 것이다. 그렇지만 대부분 C#을 많이 사용하고 있다. C#은 자바의 객체지향 특징과 C++의 강력함, VB처럼 쉬운 통합환경의 3가지 요소가 결합된 최고의 언어라고 할 수 있다. 


  • C#으로 프로그래밍을 하기 위해서는 닷넷프레임워크에 대한 이해가 우선되야 하는데 먼저 CLR(Common Language Runtime)에 대해 알아보자. CLR의 Architecture는 아래와 같다. 자바언어로 생각하면 JVM 이라고 보면 된다.



  • CLR(닷넷 환경의 런타임)은 하부구조로 OS를 가지며 OS 위에서 닷넷 Application을 실행할 수 있게 해주는 중요한 환경이다. 이 때문에 닷넷 환경하에서 어떠한 언어로 개발하던지 컴파일된 파일(중간언어, IL)은 같은 모양을 가지며 파일들은 CLR 위에서 여러 라이브러리 등을 참고해서 실행 하게 된다.


C#, HelloWorld, Main 함수


VS.NET에서 HelloWorld 작성 하기


  • Visual Studio .NET 을 실행
  • 파일 -> 새로만들기 -> 프로젝트 메뉴선택
    • (프로젝트는 c:\dotnet\project\OnjConsole1 이라고 하자)
  • Visual C#, 콘솔 응용프로그램 선택


using System;


namespace OnjConsole1

{

    class Program

    {

        static void Main(string[] args)

        {

            Console.WriteLine("Hello Onj");

        }

    }

}


[실행 : Ctrl + F5]

[결과]

Hello Onj



[메인 함수에서 인자 받아 들이기]


using System;


namespace ConsoleApplication1

{

    class Program

    {

        static void Main(string[] args)

        {

            Console.WriteLine("Hello {0}, {1}",args[0], args[1]);

        }

    }

}


[실행]

메인함수에 인자 주기 : 프로젝트에서 우측 마우스버튼 클릭 하여 속성창에서 디버그의 디버그시작프로필UI열기를 클릭하여 명령줄 인스에 메인함수에 넣어 줄 인자를 기술한다. 



onj oraclejava


[결과] Hello onj oraclejava


명령프롬프트(Command Prompt)을 이용한 컴파일


D:\dotnet\project 폴더에 Hello.cs 파일을 만들자


[Hello.cs]

class Program

{

      static void Main(string[] args)

      {

          System.Console.WriteLine("Hello {0}", args[0]);

      }

}


자바와 달라 class명이 꼭 파일명일 이유는 없다.


[명령프롬프트 컴파일]

도구 메뉴 VS2022용 개발자 명령 프롬프트


D:\dotnet\project 로 이동, D:\dotnet\project>csc Hello.cs


[실행]

D:\dotnet\project>Hello ONJ


[결과]

Hello ONJ


C#에서의 메인함수(Main)


응용프로그램의 진입점(Entry Point), 닷넷 응용프로그램을 실행 시키는 런타임인 CLR(Common Language Runtime)은 프로그램 시작을 위해 Main 함수를 호출하게 되는데 Main 함수가 바로 프로그램의 진입점이 되는 것이다. 


위 예제에서 아래와 같이 Main 함수를 정의하였다.


static void Main(string[] args)


- 메인함수 첫글자 M

메인 함수의 첫글자 'M' 은 대문자이며 나머지는 소문자.


- static : Main함수가 static로 정의된 이유는 CLR에서 객체 생성없이 바로 메인함수를 호출하기 위해서이다.

 

- args 매개변수 : Main 메소드 안의 인자로, 문자열(string) 배열을 정의하고 있는데 프로그램을 시작 시 Main 함수로 전달하고자 하는 값이 있는 경우 사용된다.  필요하지 않다면 생략해도 되고 반드시 args라고 해야 하는 것은 아니다.



- Return 타입 : 위 예제에서 Main 함수는 리턴값이 없는 void 형으로 정의되었는데 int도 가능하다. int 형으로 정의할 경우에는 통상 종료할 때의 상태를 런타임(CLR)에 알려주기 위한 것인데, 반환 값이 int 형으로 정의되면 프로그램을 호출하는 쪽으로 자신의 상태 정보를 전달할 수 있다 


  • C# 응용프로그램 종료조건

C# 응용프로그램은 Main 함수의 실행이 끝나거나, 반환(return) 될 때 종료한다.


- Main 함수는 오직 한 개

하나의 C# 응용프로그램에는 하나의 Main 메소드만 있을 수 있다.

 

 

#닷넷, #닷넷이란, #CLI, #CLS, #CLR, #CTS, #어셈블리 #VS2022, #HelloWorld, #닷넷교육, #시샵교육, 닷넷, 닷넷이란, CLI, CLS, #CLR, CTS, 어셈블리 VS2022, HelloWorld, 닷넷교육, 시샵교육


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