전시간에 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
'교육 노트 > C# 강의' 카테고리의 다른 글
[C# 때려잡기] C# 강의 27. base class (0) | 2018.11.02 |
---|---|
[C# 때려잡기] C# 강의 26. 클래스의 핵심 상속 (2) | 2018.11.02 |
[C# 때려잡기] C# 강의 24. 연산자 오버로딩 (4) | 2018.10.19 |
[C# 때려잡기] C# 강의 23. static 변수 및 함수 (3) | 2018.10.13 |
[C# 때려잡기] C# 강의 22. 복사 생성자와 깊은 복사 (2) | 2018.10.13 |