1.7.7 Indexers(인덱서)
인덱서는 배열과 같은 방식으로 객체를 색인화 한다. Property(특성)이 필드 접근을 하는 반면 인덱서는 배열 접근을 한다.
예를 들어, 이미 보여준 Stack 클래스를 생각해 보자. 이것은 쓸데없이 Push 와 Pop 연산없이 item(아이템)을 점검하고 교체할 수 있게 배열 접근을 원할 것이다. Stack은 차례로 연결된 List로 구현되나 배열 접근의 편리함을 제공하려 할 것이다.
인덱서 선언은 특성 선언과 비슷하다. 다만 "name"은 this와 함께 선언되고, this 는 그 자체가 색인화 되어 있기 때문에 인덱서는 "name"이 없고 indexing parameters(색인 인자)를 갖는다.
using System;
public class Stack
{
private Node GetNode(int index) {
Node temp = first;
while (index > 0) {
temp = temp.Next;
index--;
}
return temp;
}
public object this[int index] {
get {
if (!ValidIndex(index))
throw new Exception("Index out of range.");
else
return GetNode(index).Value;
}
set {
if (!ValidIndex(index))
throw new Exception("Index out of range.");
else
GetNode(index).Value = value;
}
}
...
}
class Test
{
static void Main() {
Stack s = new Stack();
s.Push(1);
s.Push(2);
s.Push(3);
s[0] = 33; // Changes the top item from 3 to 33
s[1] = 22; // Changes the middle item from 2 to 22
s[2] = 11; // Changes the bottom item from 1 to 11
}
}
이것이 바로 Stack 클래스의 인덱서이다.
1.7.8 Instance constructors(인스턴스 생성자)
인스턴스 생성자는 클래스의 인스턴스를 초기화 하는데 필요한 작업을 이행하는 멤버이다.
using System;
class Point
{
public double x, y;
public Point() {
this.x = 0;
this.y = 0;
}
public Point(double x, double y) {
this.x = x;
this.y = y;
}
public static double Distance(Point a, Point b) {
double xdiff = a.x ? b.x;
double ydiff = a.y ? b.y;
return Math.Sqrt(xdiff * xdiff + ydiff * ydiff);
}
public override string ToString() {
return string.Format("({0}, {1})", x, y);
}
}
class Test
{
static void Main() {
Point a = new Point();
Point b = new Point(3, 4);
double d = Point.Distance(a, b);
Console.WriteLine("Distance from {0} to {1} is {2}", a, b, d);
}
}
이는 두개의 public 생성자를 제공하는 point 클래스이다. Point 생성자중 한개는 아무런 arguments를 갖지 않고 다른 하나는 double arguments를 갖는다.
만일 생성자가 클래스에 대해 아무런 공급이 없다면 자동적으로 빈 클래스는 아무런 인자를 갖지 않는다.
1.7.9 Destructors(파괴자)
파괴자는 클래스의 인스턴스를 파괴하는 데 필요한 작업을 이행하는 멤버이다. 파괴자는 인자를 가질 수 없고, 접근성 변경자를 가질 수 없으며, 명시적으로 호출될 수조차 없다. 인스턴스에 대한 파괴자는 garbage collection (쓰레기 수집) 이 이행되는 동안 자동적으로 호출된다.
using System;
class Point
{
public double x, y;
public Point(double x, double y) {
this.x = x;
this.y = y;
}
~Point() {
Console.WriteLine("Destructed {0}", this);
}
public override string ToString() {
return string.Format("({0}, {1})", x, y);
}
}
1.7.10 Static constructors (정적 생성자)
정적 생성자는 클래스를 초기화하는데 필요한 작업들을 이행하는 멤버이다. 정적 생성자는 Destructor(파괴자)와 마찬가지로 인자들이나 접근성 변경자를 가질 수 없고 명시적으로 호출 될 수조차 없다. 클래스에 대한 정적 생성자는 클래스가 Load(로드)될 때 자동적으로 호출된다.
using System.Data;
class Employee
{
private static DataSet ds;
static Employee() {
ds = new DataSet(...);
}
public string Name;
public decimal Salary;
...
}
Employee 클래스의 정적 생성자가 정적 필드를 초기화 했다.
여기까지가 퍼온 자료입니다. 다음 부터는 직접 작성한 자료로 예제를 올려보도록 하겠습니다.