소프트웨어/C# & ASP.NET

연산자 오버로딩 - 인덱스

falconer 2009. 8. 6. 18:18










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] );
    }
}


출처 : http://ssogarif.tistory.com/entry/%EC%97%B0%EC%82%B0%EC%9E%90-%EC%98%A4%EB%B2%84%EB%A1%9C%EB%94%A9-%EC%9D%B8%EB%8D%B1%EC%8A%A4

'소프트웨어 > C# & ASP.NET' 카테고리의 다른 글

ASP.NET 2.0 프로젝트의 특정 폴더의 설명  (0) 2009.08.07
.NET Assembly  (0) 2009.08.07
C# 디버깅  (0) 2009.08.06
C#에서의 데이터형  (0) 2009.08.06
닷넷 3.5를 이용한 디자인 패턴의 구현 (4)  (0) 2009.08.05