본문 바로가기

컴퓨터 과학 & 영상처리 관련/C# / .NET / JAVA

c# 연산자 오버로딩


연산자오버로뒹.zip
















using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

//해야될일 7개 +-*/><=에 대해 예제를 만들어보라  


// *

// /

// >

// <

// =


namespace MyMath

{

    struct Vector3

    {

        private double _x;

        private double _y;

        private double _z;

        //외부는 이 클래스 외 다른 공간

        //일반적으로 private 멤버 생성자는 _를 쓴다 

        //타입은 마우스 갖다대면 다 나오니깐 그냥 멤버앞에 언더바

        //지역변수가 멤버랑 겹치는 경우가 있으므로 언더바


        public Vector3(double x, double y, double z)  //double x,y,z를 인자로 받는 생성자

        {

            _x = x;

            _y = y;

            _z = z;

        }

        public Vector3(Vector3 rhs)//인자로 vector3를 받는 생성자 

        {

            _x = rhs._x;

            _y = rhs._y;

            _z = rhs._z;

        }

        //이 방법이 c# 특성상 자주 사용된다 operator c c++ c# 공통. 이 안에 모두 포함 

        //결과값이 vector 값이여야 된다


        public static Vector3 operator +(Vector3 v1, Vector3 v2)

        {

            return new Vector3(v1.X + v2.X, v1.Y + v2.Y, v1.Z + v2.Z);

        }//Vector3와 Vector3의 + 이항연산 오버로딩

        public static Vector3 operator +(Vector3 v1, double v2)

        {

            return new Vector3(v1.X + v2, v1.Y + v2, v1.Z + v2);

        }//Vector3와 double형의 + 이항연산 오버로딩

        public static Vector3 operator +(double v1, Vector3 v2)

        {

            return v2 + v1;

        }//앞에 재정의한 Vector3와 double형의 + 이항연산 오버로딩을 활용한 오버로딩

        //중복을 줄이는거 바로 위의 연산을 줄인거지


        public static Vector3 operator -(Vector3 v1, Vector3 v2)

        {

            return new Vector3(v1.X - v2.X, v1.Y - v2.Y, v1.Z - v2.Z);

        }//Vector3와 Vector3의 - 이항연산 오버로딩

        public static Vector3 operator -(Vector3 v1, double v2)

        {

            return new Vector3(v1.X - v2, v1.Y - v2, v1.Z - v2);

        }//Vector3와 double의 - 이항연산 오버로딩

        public static Vector3 operator -(double v1, Vector3 v2)

        {

            return v2 - v1;

        }//앞에 재정의한 Vector3와 double의 - 이항연산 오버로딩을 이용한 오버로딩


        public static Vector3 operator *(Vector3 v1, Vector3 v2)

        {

            return new Vector3(v1.X * v2.X, v1.Y * v2.Y, v1.Z * v2.Z);

        }//Vector3와 Vector3의 곱셈 이항연산 오버로딩

        public static Vector3 operator *(Vector3 v1, double v2)

        {

            return new Vector3(v1.X * v2, v1.Y * v2, v1.Z * v2);

        }//Vector와 double형의 이항연산 오버로딩

        public static Vector3 operator *(double s1, Vector3 v2)

        {

            return v2 * s1;

        }//앞에 재정의한 *연산을 이용

        public static Vector3 operator *(Vector3 v1, float v2)

        {

            return new Vector3(v1.X * v2, v1.Y * v2, v1.Z * v2);

        }//double 대신 float만 바꿈

        public static Vector3 operator *(float v1, Vector3 v2)

        {

            return v2 * v1;

        }//앞에 재정의한 *연산을 이용


        public static Vector3 operator /(Vector3 v1, Vector3 v2)

        {

            return new Vector3(v1.X / v2.X, v1.Y / v2.Y, v1.Z / v2.Z);

        }// v1 / v2 하여 결과를 인자로 받는 Vector3를 new하고 그 Vector3를 리턴

        // division by zero 같은건 여기서 예외로함

        

        public static bool operator >(Vector3 v1, Vector3 v2)

        {

            return (v1.Length > v2.Length);

        }//v1.Length와 v2.Length를 실행하고 크기를 비교하는 >연산으로 결과를 return


        public static bool operator <(Vector3 v1, Vector3 v2)

        {

            return (v1.Length < v2.Length);

        }//v1.Length와 v2.Length를 실행하고 크기를 비교하는 <연산으로 결과를 return


        public static bool operator ==(Vector3 v1, Vector3 v2)

        {

            return Math.Equals(v1.X, v2.X) && 

                Math.Equals(v1.Y, v2.Y) && 

                Math.Equals(v1.Z, v2.Z);

        }//v1하고 v2의 X,Y,Z값을 Math.Equals()함수로 각각 비교 후 다시 and한다..

        //1개라도 같지 않으면 false 리턴

        // float.Epsilon; 요게 뭐당가


        public static bool operator !=(Vector3 v1, Vector3 v2)

        {

            return !(v1 == v2);  

        }//이항연산자 v1==v2를 실행하고 나온 리턴값에 !(not)을 해서 bool값을 return한다


        public override string ToString()

        {

            return "(" + _x.ToString() + ", " + _y.ToString() + ", " + _z.ToString() + ")";

        }//ToString 오버라이드



        //멤버변수에서 언더바 빼고 대분자로 만든다

        public double X

        {

            get { return _x; }//_x 값을 리턴한다

            set { _x = value; }//입력값을 _z에 넣는다

        }

        public double Y

        {

            get { return _y; }//_y 값을 리턴한다

            set { _y = value; }//입력값을 _y에 넣는다

        }

        public double Z

        {

            get { return _z; }//_z 값을 리턴한다

            set { _z = value; }//입력값을 _z 에 넣는다

        }


        public double Length //벡터의 length를 구하는 함수

        {

            get { return Math.Sqrt(_x * _x + _y * _y + _z * _z);  }

            //현대시피유로는 쉽지만 오버해드가 있다 어느정도

            //매번 가져올때마다 이걸로 길이를 구하는게 별로다...그래서 length 변수로 xyz값이 바뀌면 자동으로 변하게

            //set은 없으므로 값을 얻어올 수만 있다

        }

    }

}