본문 바로가기
프로그래밍/c#

c# 인덱서? Indexer? 인덱서의 특징과 예제

by 지나팩 2024. 5. 3.

 

인덱서(Indexer)는 C#에서 클래스나 구조체의 객체를 배열처럼 접근할 수 있게 해주는 프로퍼티의 일종입니다. 인덱서를 사용하면 객체 내부의 데이터 컬렉션에 대해 배열의 인덱싱 구문([])을 사용하여 요소에 접근할 수 있습니다. 이는 객체의 사용성을 향상시키고, 코드의 가독성을 높여 줍니다.

인덱서의 특징

  • 인덱서는 this 키워드를 사용하여 정의됩니다.
  • 인덱서는 하나 이상의 매개변수를 받을 수 있으며, 보통은 하나의 매개변수를 사용합니다.
  • 인덱서는 일반적으로 public으로 선언되어 외부에서 접근 가능합니다.
  • get과 set 접근자를 사용하여 인덱서의 읽기와 쓰기 동작을 정의할 수 있습니다.

활용 상황

인덱서는 다음과 같은 상황에서 유용하게 사용될 수 있습니다:

  • 내부 컬렉션 또는 배열의 데이터에 쉽고 직관적으로 접근이 필요할 때
  • 객체가 내부적으로 컬렉션을 관리하면서도 외부에는 일반 배열처럼 보이게 하고 싶을 때
  • 다차원 데이터 구조에 접근할 때 간결한 구문을 제공하고자 할 때

 

non 인덱서 vs 인덱서

아래는 인덱서를 사용하지 않은 코드와 사용한 코드를 각각 작성해 놓았습니다.

 

non 인덱서

 

인덱서

 

인덱서 사용 시의 장점:

  • 직관성: 인덱서를 사용하면 객체의 내부 데이터에 배열과 유사한 방식으로 접근할 수 있어, 코드가 더 간결하고 이해하기 쉬워집니다.
  • 유연성: 인덱서는 간단한 배열 접근 구문([])을 사용하여 내부 컬렉션의 요소를 읽거나 수정할 수 있게 해줍니다. 이는 코드를 작성하거나 수정할 때 자연스러운 데이터 접근 패턴을 제공합니다.

인덱서 사용하지 않을 때의 단점:

  • 메서드 오버헤드: 각각의 동작(읽기, 쓰기)에 대해 별도의 메서드를 정의하고 호출해야 하므로 코드가 더 복잡해지고 길어질 수 있습니다.
  • 사용성 저하: GetBook과 SetBook 같은 명시적 메서드 호출은 배열이나 리스트처럼 직관적이지 않으며, 사용하기 불편할 수 있습니다.

위 예제에서 BookCollection 클래스는 내부적으로 List<string>를 사용하여 책의 목록을 관리합니다. 인덱서는 이 리스트에 직접 접근하여 특정 인덱스의 책을 가져오거나 설정할 수 있도록 합니다. 이렇게 하면 BookCollection 객체를 사용하는 코드는 마치 배열을 다루는 것처럼 간결하고 직관적으로 내부 리스트에 접근할 수 있습니다. 인덱서를 사용하는 것이 보다 "객체 지향적"으로 간주될 수 있으며, 코드의 가독성과 유지 관리를 향상시킬 수 있습니다.

댓글