본문 바로가기

교육 노트/C# 강의

[C# 때려잡기] C# 강의 25. indexer

전시간에 C#의 연산자 오버로딩에서 링크에 있는 제약을 보면

[]연산자는 오버로딩할수없고

인덱서로 사용한다고 되어있다.


인덱서란 무엇일까?



캐릭터클래스에 캐릭터가 가지고있을 아이템들을 관리하기위하여 item배열을 만들었다.

class Character
{
private int?[] items;

public Character()
{
items = new int?[10];
}

}


기본적으로 10 개짜리로 만들었다.

편의상 item클래스를 안만들고 int?형식으로 했다.


암튼

이런 아이템이 있다면

해당 아이템에 접근하기위한

함수가 필요할 것이다.


public int? GetItem(int idx)
{
if( idx <= 10)
return items[idx];
return null;
}

이런 함수를 만들고


mario.GetItem(1);
mario.GetItem(3);

뭐 이런식으로 사용할것이다.


그런데 마리오의 클래스 내부에는 배열이 아이템밖에 없고

따라서 그냥 mario[3] 이런식으로 해서 해당 아이템을 가져오싶다.

if (mario[1] != null)
{
//
}

그러나 []는 오버로딩 되지않느다.

그럴떄 사용하는것이 인덱서이다


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp2
{
class Character
{
private int?[] items;

public Character()
{
items = new int?[10];
}


public int? this[int idx]{
get
{
if (idx <= 10)
return items[idx];
return null;
}
set
{
if (idx <= 10)
items[idx] = value;
}
}

}

class Program
{
static void Main(string[] args)
{

Character mario = new Character();

if (mario[1] != null)
{
//
}
}
}
}

마치 프로퍼티 처럼 사용한다.


심지어 배열처럼 index값만 받는것이아닌 다른형식으로 받을수있고.

역시 프로퍼티처럼 get,set을 구분지어 놓아 사용가능하다.


사실 이런 캐릭터 클래스에서는 굳이 인덱서를사용하지 않고 (의미가 불분명하기때문)

자료구조같은 일종의 컬랙션에서 사용한다.

728x90