24.04.2019 Views

모어 이펙티브 C#(2판) - 맛보기

빌 와그너 저/김완섭 역 | 한빛미디어 | 2019년 05월 25,000원

빌 와그너 저/김완섭 역 | 한빛미디어 | 2019년 05월
25,000원

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

있고, 정수 외의 매개변수를 받는 인덱서는 맵 map 을 정의할 때 유용하다.<br />

public Address this[string name]<br />

{<br />

get => addressValues[name];<br />

set => addressValues[name] = value;<br />

}<br />

private Dictionary addressValues;<br />

<strong>C#</strong>의 다차원 배열처럼 다차원 인덱서를 만들 수도 있다. 이 경우 각 차원을 나타내는 매개변수<br />

를 동일 타입으로 지정할 수도 있지만, 서로 다른 타입을 취하도록 선언할 수도 있다.<br />

public int this[int x, int y] => ComputeValue(x, y);<br />

public int this[int x, string name] => ComputeValue(x, name);<br />

모든 인덱서는 this 키워드로 선언한다는 것에 주목하자. <strong>C#</strong>에서는 인덱서가 이름을 가질 수<br />

없다. 따라서 여러 개의 인덱서를 선언하려면 각기 매개변수 목록이 달라야 한다. 인덱서는 속<br />

성과 거의 동일한 특성을 지닌다. virtual이나 abstract가 될 수 있으며, 세터와 게터 각각에<br />

서로 다른 접근 한정자를 지정할 수 있다. 유일한 차이라면 속성과는 달리 암묵적 인덱서는 만<br />

들 수 없다.<br />

지금까지 알아본 것처럼 속성은 기능적으로 부족함이 없고, 이전보다도 훌륭하게 개선되었다.<br />

그런데도 불구하고, 데이터 멤버로 우선 사용하다가 속성이 제공하는 이점이 필요해지면 그때<br />

수정하려고 생각하는 사람도 있을 것이다. 합리적인 것처럼 보일지 모르지만, 사실 옳지 않은<br />

생각이다. 다음의 클래스 정의를 생각해보자.<br />

// public 데이터 멤버를 사용: 잘못된 예<br />

public class Customer<br />

{<br />

public string Name;<br />

}<br />

// 이하 생략<br />

이 Customer 타입은 한 명의 고객을 나타내기 위한 용도로 사용되며, Name 필드만을 가지<br />

24 <strong>모어</strong> <strong>이펙티브</strong> <strong>C#</strong>

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!