인덱서 (프로그래밍)
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
인덱서는 C#에서 `operator[]`를 사용하여 구현되며, 클래스나 구조체에서 배열과 유사하게 특정 값을 가져오거나 설정할 수 있도록 해주는 기능이다. 프로퍼티와 유사하지만, 매개변수를 받는다는 점이 다르다. C#에서는 `this[첨자 목록]` 형식으로 선언하며, get 및 set 접근자를 통해 값을 읽고 쓸 수 있다. 다른 언어와의 상호 운용을 위해 기본적으로 `Item`이라는 이름의 인덱스 속성이 자동으로 생성되며, `System.Runtime.CompilerServices.IndexerNameAttribute` 속성을 사용하여 이름을 명시적으로 지정할 수 있다. Visual Basic에서는 `Default` 키워드를 사용하여 인덱서를 정의한다.
더 읽어볼만한 페이지
- 연산자 (프로그래밍) - 중위 표기법
중위 표기법은 사람이 이해하기 쉬운 연산자 표기 방식이지만, 컴퓨터가 구문 분석하기 어렵고 연산 순서를 위해 괄호나 연산자 우선순위 규칙이 필요하다. - 연산자 (프로그래밍) - 형 변환
형 변환은 프로그래밍에서 변수의 데이터 타입을 변경하는 것으로, 암시적 형 변환과 명시적 형 변환으로 나뉘며, 객체 지향 프로그래밍에서는 업캐스팅과 다운캐스팅이 발생하고, 각 언어는 고유한 규칙과 방법을 제공하며 잘못된 형 변환은 오류를 유발할 수 있다. - 프로그래밍 언어 주제 - 프로그래밍 패러다임
프로그래밍 패러다임은 프로그래머에게 프로그램 작성 방식을 제시하는 관점 또는 스타일이며, 구조적 프로그래밍을 시작으로 절차적, 객체 지향, 선언형 등으로 발전해 명령형, 선언형, 멀티 패러다임 프로그래밍 언어로 분류된다. - 프로그래밍 언어 주제 - 프로그램 최적화
프로그램 최적화는 컴퓨터 프로그램의 효율성을 높이는 과정으로, 더 효율적인 구현 방식을 선택하거나 불필요한 기능을 제거하여 문제 해결에 집중하며, 다양한 수준에서 플랫폼 의존적이거나 독립적인 기술을 활용하여 수행되지만, 특정한 품질 지표를 개선하기 위해 다른 측면을 희생하는 트레이드오프가 발생할 수 있다. - 객체 지향 프로그래밍 - Is-a
Is-a 관계는 객체 지향 프로그래밍에서 한 유형이 다른 유형의 하위 유형임을 나타내는 관계로, 상속, 서브타이핑, 리스코프 치환 원칙과 관련되며, C++, Python, Java 등에서 표현된다. - 객체 지향 프로그래밍 - 객체 (컴퓨터 과학)
객체는 객체 지향 프로그래밍에서 데이터와 조작을 묶어 메시지를 수신하고, 프로그램의 개념을 표현하며 가시성과 재사용성을 높이는 실체이다.
인덱서 (프로그래밍) | |
---|---|
프로그래밍 | |
종류 | 언어 기능 |
언어 | C 샤프 |
사용 목적 | 클래스의 인스턴스를 배열처럼 접근하기 위한 구문 |
유사 개념 | 연산자 오버로딩 |
2. 구현
인덱서는 C#에서 `operator[]`에 대한 get 및 set 접근자를 통해 구현된다. 이는 프로퍼티와 유사하지만, 정적이 아니며 인덱서의 접근자가 매개변수를 받는다는 점에서 차이가 있다. get 및 set 접근자는 인덱서 선언의 매개변수 목록을 사용하여 메서드로 호출되지만, set 접근자는 여전히 암시적 `value` 매개변수를 갖는다.
C#에서는 클래스 및 구조체 내부에 인덱서를 가질 수 있다.
[1]
웹사이트
C# - What is an indexer in C#
http://forums.suresh[...]
2008-01-29
3. 예제
인덱서는 `this[첨자 목록]` 형식으로 선언한다.
인덱서의 구문 내에서는 `get`/`set`이, `set` 접근자 내에서는 `value`가 각각 문맥 키워드로 기능한다.
```csharp
class Matrix2x2 {
private readonly int[][] items = new[]{
new[] { 0, 0 },
new[] { 0, 0 },
};
// 셀의 값을 가져오고 설정하는 인덱서.
public int this[int index0, int index1] {
get { return items[index0][index1]; }
set { items[index0][index1] = value; }
}
}
```
호출 측에서는 배열에 접근하는 것과 같은 구문으로 인덱서의 기능을 호출한다.
```csharp
var matrix = new Matrix2x2();
// set 접근
matrix[0, 0] = 10;
// get 접근
int num = matrix[0, 1];
// get ⇒ 가산 ⇒ set
matrix[1, 0] += 10;
```
일반적인 메서드와 달리, 대입을 수반하지 않는 인덱서 메서드의 호출은 수행할 수 없다. 아래와 같은 호출은 구문 오류가 되며, 반환 값 void형의 인덱서를 정의하는 것도 불가능하다. 단, 인덱서를 통해 호출한 객체의 멤버를 호출하는 경우에는 구문상 문제가 없다.
```csharp
// 구문 오류로 처리된다.
matrix[1, 0];
// 다음 호출은 문제가 없다 (이 예에서는 의미가 없는 호출이지만)
matrix[1, 0].ToString();
```
C#에서 인덱서를 클래스에 사용한 예는 다음과 같다.[7]
```csharp
class OurFamily
{
private long[] familyMember = new long[7];
public long this [int index]
{
// The get accessor
get
{
return familyMember[index];
}
// The set accessor with
set
{
familyMember[index] = value;
}
}
}
```
다음은 클래스에서 인덱서를 사용하는 C# 예제이다.[2]
```csharp
class Family
{
private List
public Family(params string[] members)
{
_familyMembers.AddRange(members);
}
public string this[int index]
{
// The get accessor
get => _familyMembers[index];
// The set accessor with
set => _familyMembers[index] = value;
}
public int this[string val]
{
// Getting index by value (first element found)
get => _familyMembers.FindIndex(m => m == val);
}
public int Length => _familyMembers.Count;
}
```
사용 예시:
```csharp
void Main()
{
var doeFamily = new Family("John", "Jane");
for (int i = 0; i < doeFamily.Length; i++)
{
var member = doeFamily[i];
var index = doeFamily[member]; // same as i in this case, but it demonstrates indexer overloading allowing to search doeFamily by value.
Console.WriteLine($"{member} is the member number {index} of the {nameof(doeFamily)}");
}
}
```
이 예제에서 인덱서는 n번째 위치의 값을 가져오고, 해당 값으로 참조되는 목록의 위치를 가져오는 데 사용된다.
코드의 출력은 다음과 같다.
John is the member number 0 of the doeFamily
Jane is the member number 1 of the doeFamily
3. 1. C#
C#에서는 클래스 및 구조체 내부에 인덱서를 가질 수 있다.
인덱서는 `this[첨자 목록]` 형식으로 선언한다.
인덱서의 구문 내에서는 `get`/`set`이, `set` 접근자 내에서는 `value`가 각각 문맥 키워드로 기능한다.
```csharp
class Matrix2x2 {
private readonly int[][] items = new[]{
new[] { 0, 0 },
new[] { 0, 0 },
};
// 셀의 값을 가져오고 설정하는 인덱서.
public int this[int index0, int index1] {
get { return items[index0][index1]; }
set { items[index0][index1] = value; }
}
}
```
호출 측에서는 배열에 접근하는 것과 같은 구문으로 인덱서의 기능을 호출한다.
```csharp
var matrix = new Matrix2x2();
// set 접근
matrix[0, 0] = 10;
// get 접근
int num = matrix[0, 1];
// get ⇒ 가산 ⇒ set
matrix[1, 0] += 10;
```
일반적인 메서드와 달리, 대입을 수반하지 않는 인덱서 메서드의 호출은 수행할 수 없다. 아래와 같은 호출은 구문 오류가 되며, 반환 값 void형의 인덱서를 정의하는 것도 불가능하다. 단, 인덱서를 통해 호출한 객체의 멤버를 호출하는 경우에는 구문상 문제가 없다.
```csharp
// 구문 오류로 처리된다.
matrix[1, 0];
// 다음 호출은 문제가 없다 (이 예에서는 의미가 없는 호출이지만)
matrix[1, 0].ToString();
```
C#에서 인덱서를 클래스에 사용한 예는 다음과 같다.[7]
```csharp
class OurFamily
{
private long[] familyMember = new long[7];
public long this [int index]
{
// The get accessor
get
{
return familyMember[index];
}
// The set accessor with
set
{
familyMember[index] = value;
}
}
}
```
다음은 클래스에서 인덱서를 사용하는 C# 예제이다.[2]
```csharp
class Family
{
private List
public Family(params string[] members)
{
_familyMembers.AddRange(members);
}
public string this[int index]
{
// The get accessor
get => _familyMembers[index];
// The set accessor with
set => _familyMembers[index] = value;
}
public int this[string val]
{
// Getting index by value (first element found)
get => _familyMembers.FindIndex(m => m == val);
}
public int Length => _familyMembers.Count;
}
```
사용 예시:
```csharp
void Main()
{
var doeFamily = new Family("John", "Jane");
for (int i = 0; i < doeFamily.Length; i++)
{
var member = doeFamily[i];
var index = doeFamily[member]; // same as i in this case, but it demonstrates indexer overloading allowing to search doeFamily by value.
Console.WriteLine($"{member} is the member number {index} of the {nameof(doeFamily)}");
}
}
```
이 예제에서 인덱서는 n번째 위치의 값을 가져오고, 해당 값으로 참조되는 목록의 위치를 가져오는 데 사용된다.
코드의 출력은 다음과 같다.
John is the member number 0 of the doeFamily
Jane is the member number 1 of the doeFamily
3. 1. 1. C# 코드 예제
wikitext
C#에서 인덱서를 클래스에 사용한 예는 다음과 같다.[7]
```csharp
class OurFamily
{
private long[] familyMember = new long[7];
public long this [int index]
{
// The get accessor
get
{
return familyMember[index];
}
// The set accessor with
set
{
familyMember[index] = value;
}
}
}
```
다음은 클래스에서 인덱서를 사용하는 C# 예제이다.[2]
```csharp
class Family
{
private List
public Family(params string[] members)
{
_familyMembers.AddRange(members);
}
public string this[int index]
{
// The get accessor
get => _familyMembers[index];
// The set accessor with
set => _familyMembers[index] = value;
}
public int this[string val]
{
// Getting index by value (first element found)
get => _familyMembers.FindIndex(m => m == val);
}
public int Length => _familyMembers.Count;
}
```
사용 예시:
```csharp
void Main()
{
var doeFamily = new Family("John", "Jane");
for (int i = 0; i < doeFamily.Length; i++)
{
var member = doeFamily[i];
var index = doeFamily[member]; // same as i in this case, but it demonstrates indexer overloading allowing to search doeFamily by value.
Console.WriteLine($"{member} is the member number {index} of the {nameof(doeFamily)}");
}
}
```
이 예제에서 인덱서는 n번째 위치의 값을 가져오고, 해당 값으로 참조되는 목록의 위치를 가져오는 데 사용된다.
코드의 출력은 다음과 같다.
John is the member number 0 of the doeFamily
Jane is the member number 1 of the doeFamily
3. 1. 2. 다른 언어와의 상호 운용
다른 언어와의 상호 운용을 위해 기본적으로 `Item`이라는 이름의 인덱스 속성이 자동으로 생성된다.
`System.Runtime.CompilerServices.IndexerNameAttribute` 속성을 추가하여 자동으로 생성되는 인덱서의 이름을 명시적으로 지정할 수 있다. 이 기능이 활용되는 대표적인 예시로 System.String 클래스를 들 수 있다. `System.String` 클래스에서는 인덱서의 이름이 `Chars`가 되도록 지정되어 있다.
3. 2. Visual Basic (.NET)
Visual Basic에서는 `Default` 키워드가 붙은 인덱싱된 프로퍼티를 인덱서로 접근할 수 있다.
```vbnet
Public Class StringArray
Private m_Item As String() = New String(10) {}
' Default가 선언된 인덱싱된 프로퍼티는 인덱서로 접근 가능
Default Public Property Item(index As Integer) As String
Get
Return m_Item(index)
End Get
Set(ByVal value As String)
m_Item(index) = value
End Set
End Property
End Class
```
```vbnet
Dim obj As StringArray = New StringArray
' get 접근
Dim str As String = obj(1)
' set 접근
obj(2) = str
4. 추가 설명 (일본어 문서 내용)
참조
[2]
웹사이트
C# Interview Questions
https://www.dotnetfu[...]
2011-08-01
[3]
문서
C#ではGetEnumeratorという名前のメソッドを実装することでforeach文が使えるようになる。
[4]
Javadoc
[5]
문서
string.cs
https://referencesou[...]
[6]
웹인용
C# - What is an indexer in C#
http://forums.suresh[...]
Bulletin: SURESHKUMAR.NET FORUMS
2008-01-29
[7]
웹인용
C# Interview Questions
http://www.dotnetfun[...]
.net Funda
2011-08-01
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com