D 언어 사양 — 레거시 코드
D 언어 사양 — 레거시 코드 (Legacy Code)
D 언어는 오래된 코드와의 호환성을 꽤 신경 써요. 새 문법으로 바뀐 기능이라도, 옛 방식으로 쓰인 코드가 계속 돌아가도록 예전 기능(레거시) 을 그대로 남겨 두고 지원하죠. 이 챕터는 아직 지원되고 있는 레거시 기능들을 하나씩 소개하면서, 요즘 코드로 어떻게 고쳐 쓰면 좋은지 함께 짚어줘요. 그래서 옛 코드를 만날 때 '이건 왜 이렇게 생겼지?' 하는 궁금증을 풀기 좋아요.
본문
옛 D 코드와의 호환성을 유지하기 위해, 많은 레거시 기능이 계속 지원돼요. 이 페이지는 그렇게 지원되는 각 레거시 기능을 설명하고, 코드를 어떻게 현대화(modernize)하면 좋을지 제안해 줘요.
body 키워드 (body keyword)
body는 계약(contract) 문 다음에 오는 함수/메서드의 본문을 지정할 때 쓰던 키워드였어요:
class Foo
{
void bar(int i)
in { assert(i >= 42); }
body { /* Do something interesting */ }
string method(string s)
out(v) { assert(v.length == s.length); }
body { /* Do something even more interesting */ }
void noBody() { /* No contracts, no body */ }
}
교정 방법 (Corrective Action)
대신 do 키워드를 사용하세요 (v2.075.0에서 도입됐어요):
void bar(int i)
in { assert(i >= 42); }
do { /* Look ma, no body! */ }
alias target name; 문법 (alias target name; syntax)
2024 에디션부터 AliasDeclaration은 alias name = target; 문법만 지원해요. 이 문법이 심볼 식별자를 찾기 더 쉬운데, 특히 target이 복잡한 심볼일 때 그렇죠. target이 먼저 오는 순서는 C의 typedef 문법에서 유래했어요.
인스턴스 멤버 별칭 짓기 (Aliasing an instance member)
예를 들어 alias a = instance.field; 같은 형식이에요. 이런 별칭은 사실 인스턴스 멤버 그 자체가 아니라, 인스턴스의 타입에 속한 멤버를 가리키게 돼요. 그래서 헷갈릴 수 있죠. 대신 타입의 멤버에 별칭을 붙이세요:
struct Bar
{
Foo f;
alias v = f.v; // Error, use `typeof(f).v`
}
struct Foo
{
int v;
void test(Foo that) const
{
alias a = this.v; // OK
alias b = that.v; // Error, use `typeof(that).v` instead
assert(&a is &b); // passes
assert(&b !is &that.v);
}
}
더 알아보기 (Learn more)
- D Language Reference — 전체 사양 목차: 모든 챕터의 시작점
- Attributes:
@disable,@deprecated등 속성 관련 기능 - D Language Reference — Glossary: 사양에 쓰이는 용어 사전