ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 연산자 오버로딩 - 인덱스
    .NET/C# Basic 2008. 10. 10. 17:27
    반응형










    class Point
    {
    public int x;
    public int y;

    public Point(int x, int y)
    {
    this.x = x;
    this.y = y;
    }


    public override string ToString()
    {
    //(x,y)값
    return String.Format("({0},{1})",x,y);
    }
    // + 연산자 메서드
    public static Point operator +(Point pt1, Point pt2)
    {
    return (new Point(pt1.x + pt2.x, pt1.y + pt2.y));
    }

    // - 연산자 메서드
    public static Point operator -(Point pt1, Point pt2)
    {
    return (new Point(pt1.x - pt2.x, pt1.y - pt2.y));
    }

    }
    class Class1
    {
    static void Main(string[] args)
    {
    Point pt1 = new Point(100, 100);
    Point pt2 = new Point(100, 200);
    Point pt3;

    // Point 객체 + 연산
    pt3 = pt1 + pt2;

    Console.WriteLine("{0} + {1} = {2}", pt1, pt2, pt3);
    }
    }











    인덱서란 
    프로퍼티(Property)의 기본 아이디어는 클래스를 사용하는 입장에서 보았을 때 마치 필드를 직접 사용하는 것처럼 보이도록 하는 것 
    실제로는 get/set 메서드가 불려져서 필드 값을 넣거나 가져온다 

       // 프로퍼티를 사용한 예
         pt.X = 100;
         int x = pt.X;


    인덱서(Indexer)는 프로퍼티를 모아 놓은 배열을 사용하는 개념 
    get/set 메서드를 이용하며, 여러 개의 값을 다루기 때문에 인덱스 값이 필요 

        // 비트 배열을 인덱서로 사용한 예
         Bits[0] = true;
         Bits[1] = false;


    인덱서(indexer) 
    일련의 데이터 값을 가질 수 있는 데이터 구조가 필요 
    사용할 데이터형을 지정하고, 클래스 자체를 배열처럼 사용하기 때문에 this를 사용하고 [ ] 사이에 인덱스로 사용할 데이터형을 지정 





    인덱서(indexer) 
    프로퍼티와 마찬가지로 get/set 메서드가 불려지며, 특정 값을 가리키는 인덱스를 지정 









    ObjList 인덱서 만들기 예제 

    ArrayList 클래스를 사용해서 object 형 데이터 리스트를 다루는 인덱서를 정의해보는 예제 



    ArrayList 콜렉션 클래스를 다루기 위해 Collections 네임스페이스를 추가 

     using System;
     using System.Collections;    

     ObjList 클래스를 정의하고, 멤버로 ArrayList 클래스를 추가 

     public class ObjList
    {
        protected ArrayList data; // ArrayList 객체

        public ObjList() 
        {
            data = new ArrayList();
            // ArrayList 클래스는 동적으로 배열 크기를 관리하며, 
            // 내부적으로 관리하는 데이터는 object 형 
        }
    }


    ObjList 클래스에 다음과 같이 인덱서를 추가하고, get 메서드에서 값을 리턴하며, 인덱스가 범위를 벗어나는지 검사해서 예외 처리


    public object this[ int i ]
        {
            get 
            {
                if ( i >= 0 && i < data.Count ) // 인덱스 범위 검사
                {
                    return data[i];
                }
                else
                    throw new IndexOutOfRangeException( "범위 벗어남" + i );
            }
            set
            {}
        }

    set 메서드에서 값을 넣을 때도 마찬가지로 범위를 검사해서 범위 내에 들어있는 경우에만 값을 넣어주며, 마찬가지로 범위를 벗어나는 경우는 예외 처리 

    set 
            {
                if ( i >= 0 && i < data.Count ) // 인덱스 범위 검사
                {
                    data[ i ] = value; 
                }
                else
                if ( i == data.Count ) // 마지막 데이터 요소인 경우
                {
                    data.Add( value ); // 데이터를 추가합니다.
                }
                else
                    throw new IndexOutOfRangeException( "범위 벗어남" + i );
            }


    인덱서에 여러 데이터형을 가진 값을 넣고, 값을 출력

    public class Class1
    {
        public static void Main()
        {
            ObjList list = new ObjList();

            list[0] = 100;
            list[1] = "apple";
            list[2] = 123.456;

            for( int i=0; i<3; i++ )
                Console.WriteLine( "[{0}] = {1}", i, list[i] );
        }
    }


















    반응형

    댓글

Designed by Tistory.