D 언어 사양 — 레거시 코드

D 언어 사양 — 레거시 코드 (Legacy Code)

D 언어는 오래된 코드와의 호환성을 꽤 신경 써요. 새 문법으로 바뀐 기능이라도, 옛 방식으로 쓰인 코드가 계속 돌아가도록 예전 기능(레거시) 을 그대로 남겨 두고 지원하죠. 이 챕터는 아직 지원되고 있는 레거시 기능들을 하나씩 소개하면서, 요즘 코드로 어떻게 고쳐 쓰면 좋은지 함께 짚어줘요. 그래서 옛 코드를 만날 때 '이건 왜 이렇게 생겼지?' 하는 궁금증을 풀기 좋아요.

출처: https://dlang.org/spec/legacy.html

본문

옛 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 에디션부터 AliasDeclarationalias 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)