2022년 1월 31일 월요일

C# 인덱서(Indexer), C#동영상교육, C#학원, 닷넷교육, 닷넷학원, C#동영상

 C# 인덱서(Indexer), C#동영상교육, C#학원, 닷넷교육, 닷넷학원, C#동영상


http://ojc.asia/bbs/board.php?bo_table=LecCsharp&wr_id=404 


C# 인덱서(Indexer), C#동영상교육, C#학원

C# 인덱서(Indexer), C#동영상교육, C#학원인덱서(Indexer)실습 : VS 2022C# 인덱서(Indexer)일반적으로 C#의 속성(프로퍼티)를 이용하여 내부 필드(멤버 변수)에 접근하는데, 클래스 내부의 컬렉션 형태의 데

ojc.asia


https://www.youtube.com/watch?v=RWrdG2lfnBA&list=PLxU-iZCqT52DJyR6gqJy0MCL8RiTVXdos&index=15 






인덱서

(Indexer)


실습 : VS 2022





C# 인덱서(Indexer)


일반적으로 C#의 속성(프로퍼티)를 이용하여 내부 필드(멤버 변수)에 접근하는데, 클래스 내부의 컬렉션 형태의 데이터에 접근할 때는 인덱서(Indexer)를 주로 사용한다.


인덱서(Indexer)

❶ 이름이 this인 프로퍼티( public string this[int i] { … } )
❷ 인덱스(첨자)를 이용하여 객체 내의 데이터에 접근하게 해주는 속성(프로퍼티). 
❸ 객체를 배열처럼 접근할 수 있는 방법을 제공하는데, this[ ]를 사용하여 객체내부의 특정 필드(주로 컬렉션 형태의 자료)에 접근
❹ 사용법이 배열과 비슷하다는 의미이지 실제로 객체를 배열로 쓴다는 의미는 아니다.
❺ this[ ] 형태로 속성처럼 get, set을 정의하여 작성하는데 get 접근자는 값을 반환하고 set 접근자는 value키워드로 입력되는 값을 할당하며, this 키워드는 인덱서를 정의하는데 사용한다.
❻ [ ] 안에는 인덱싱을 위한 첨자가 들어오는데 int, string등 다양한 형태가 가능하다.


인덱서와 프로퍼티의 비교


프로퍼티가 이름을 통해 객체 내의 데이터에 접근하게 해 준다면 인덱서는 인덱스를 통해 객체 내의 데이터에 접근하게 해 준다. 인덱서는 get, set 접근자를 통해 어떤 필드의 값을 얻어 오거나 어떤 계산을 통해 새로운 값을 다른 곳에 지정한다. 인덱서 역시 프로퍼티처럼 실제 값을 가지고 있지 않기 때문에 ref, out과 같은 접근자를 사용할 수 없다. 물론 둘 다 void는 사용할 수 없다. 


System.String 클래스에 잠시 살펴보자.



string s = “Hello”;
char c = s[0];   //c = ‘H’, 객체를 배열처럼 다룸.


s가 배열이 아님에도 불구하고 배열처럼 사용하고 있다. 이것은 String 클래스가 인덱서로 구현되어 있기 때문에 가능한 것이다. 인덱서를 사용하면 string 타입처럼 객체를 배열처럼 쓰는 것이 가능해 진다는 것이다.


s[2] = ‘c’; //에러


이 경우 오류가 발생 하는 것은 String 인덱서가 읽기 전용, get만 만들어졌기 때문이며 인덱서를 이용하면 r-value 이든 l-value 이든지 상관없이 배열처럼 이용할 수 있다.


인덱서(Indexer) 와 배열(Array)의 비교


  1. 인덱서는 배열의 표기법과 비슷하다. 하지만 배열은 integer 형으로만 첨자를 사용할 수 있지만 인덱서인 경우엔 다른 타입도 첨자로 사용 가능하다.


class test {

public string this[string index]

{

get {…}

set {…}

}

}


  1. 또한 인덱서는 오버로딩이 가능하다. 여러 개의 인덱서를 선언해 놓고 그곳의 인자가 다르면 오버로딩 된다.


class test {

public string this[int number] { }

public string this[int number, string name] {}

}




[예제1 인덱서 심플 예제]

namespace IndexerTest

{

    class Dept

    {

        public string[] emps = new string[3];

        public string this[int i]

        {

            get { return emps[i];  }    //r-value

            set { emps[i] = value; }  //l=value

        }

    }

    class Test

    {

        static void Main()

        {

            Dept d1 = new Dept();

            d1.emps[0] = "사원1"; d1.emps[1] = "사원2"; d1.emps[2] = "사원3";

            Console.WriteLine("d1.emps[0] : {0}", d1.emps[0]);


            d1[0] = "사원1"; d1[1] = "사원2"; d1[2] = "사원3";

            Console.WriteLine("d1.emps[0] : {0}", d1[0]);


        }

    }

}



[예제2 : 문자열을 첨자로 사용한 인덱서 예제]

class DayCollection

{

    string[] days = { "일", "월", "화", "수", "목", "금", "토" };

    private int GetDay(string testDay)

    {

        for (int j = 0; j < days.Length; j++)

        {

            if (days[j] == testDay) { return j; }

        }

        return 999;

    }


    public int this[string day]

    {

        get { return (GetDay(day)); }

    }

}

class Program

{

    static void Main(string[] args)

    {

        DayCollection week = new DayCollection();

        System.Console.WriteLine(week["일"]);   //0

        // 999 리턴        

        System.Console.WriteLine(week["없는요일"]);

    }

}



[예제3 : 일반화 프로그래밍을 이용한 인덱서 예제]


class Ojc<T>   //일반화 클래스 정의

{

    //외부에서 접근못하도록 private으로 배열을 정의하고

    //배열의 값은 인덱스를 통해 다루도록 한다.

    //배열의 타입은 Ojc를 사용하는 시점에 정의 ==> Generic

    private T[] ojcArr = new T[10];


    //Generic을 이용하여 인덱서를 정의하자.

    public T this[int i]

    {

        get   //R-VALUE

        {

            return ojcArr[i];

        }

        set   //L-VALUE

        {

            ojcArr[i] = value;

        }


       // C#7.0 이상

        /* get  => ojcArr[i];

        set   => ojcArr[i] = value; */


    }

}


class Program

{

    static void Main(string[] args)

    {

        Ojc<string> ojc1 = new Ojc<string>();

        ojc1[0] = "Hello, OJC";

        string s = ojc1[0];

        Console.WriteLine(s); ;


        Ojc<int> ojc2 = new Ojc<int>();

        ojc2[0] = 999;

        Console.WriteLine(ojc2[0]);

    }

}



[결과]

Hello, OJC

999



#인덱서, #Indexer, #시샵교육, #시샵학원, #시샵인덱서, #닷넷교육, #닷넷학원, #닷넷동영상, #시샵동영상, 인덱서, Indexer, 시샵교육, 시샵학원, 시샵인덱서, 닷넷교육, 닷넷학원, 닷넷동영상, 시샵동영상,  

댓글 없음:

댓글 쓰기

(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...