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
클래스의 정적 생성자가 정적
필드를 초기화 했다.
여기까지가 퍼온 자료입니다. 다음 부터는 직접 작성한 자료로 예제를 올려보도록 하겠습니다.