Jump to content
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr ×
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr
  • RAD 스튜디오 버전별 신기능:
    2010~6.0

    2010~6.0 언어와 컴파일러

       (0 reviews)

    << 위로 이동 (최신 버전 포함 모든 버전)

    RAD 스튜디오 2010~6.0 "새 기능 한글 요약본: 언어와 컴파일러" 입니다.
    모든 새 기능,  강화된 기능, 버그 픽스 등에 대해서는 Docwiki의 What's New 목록 (영문 보기, 한글번역 보기) 와 관련 페이지를 보기 바랍니다.

    □ [2010] RTTI를 통해 애플리케이션 런타임 시 메소드, 필드, 속성 정보를 조회할 수 있습니다.

    RTTI 강화와 어트리뷰트

    델파이 2010에서 델파이의 RTTI가 대폭 강화되었습니다. 이제 RTTI가 메소드, 필드, 속성을 지원하게 되어 동적 호출과 다른 메타 프로그래밍 방식들을 지원하게 되었습니다. 새로 추가된 RTTI.pas 유닛을 통해 강력한 RTTI 루틴들을 뒷받침합니다.
    어트리뷰트(attribute)는 이 새로운 RTTI를 기반으로 한 문법으로서, 클래스/레코드나 클래스의 멤버에 추가로 지정되는 정보이며, 실행 중에 읽어질 수 있습니다. 어트리뷰트를 활용하면 일반화된 프레임워크를 개발할 때 아주 유용합니다.

     

    □ [2010] DLL 함수가 호출될 때 DLL을 로드하도록 구현할 수 있습니다.

    DLL 지연 로딩

    Delphi 2010에서는 DLL의 로딩 방법으로서 정적(static) 로딩, 동적(dynamic) 로딩 외에 지연(delayed) 로딩이 추가되었습니다. 지연 로딩은 정적 로딩과 기본적으로 같은 구문을 사용하지만 extern 선언에서 delayed 지시어를 추가하는 것입니다.

    procedure ProcInDll; external 'DLL_name.dll' delayed;


    정적 로딩 구문에 단지 delayed 지시어를 추가한 것 뿐이지만, 이것만으로도 해당 DLL 함수가 실제로 호출될 때까지 해당 DLL을 로드하지 않습니다. 이전의 정적 로딩을 사용하면 코딩이 단순하고 편리한 반면 해당 DLL이나 함수가 존재하지 않을 경우 프로그램 시작 자체가 실패하는 치명적인 문제가 있습니다. DLL이 이런 우려가 있을 경우에 지연 로딩을 사용하면 깔끔하게 문제가 해결됩니다. 특히 Windows 7이나 Windows Vista 등 최신 버전의 Win32에서 추가된 API들을 호출할 필요가 있으면서 동시에 Windows P, 2000 등 구버전과도 호환성이 필요한 경우 더욱 유용합니다. 또한 지연 로딩을 사용하면 실제 호출할 때까지 DLL을 로드하지 않으므로 메모리 소모도 줄어드는 효과도 있습니다.

     

    □ [2009] 명시적으로 타입을 지정하지 않고 실행 시점에 유연하게 타입을 지정하며 개발할 수 있습니다.

    제너릭(Generics)

    제너릭은 배열, 컬랙션, 목록 등에서 데이터타입을 명시적으로 지정하기 않고, 실행 시 필요한 데이터타입으로 사용할 수 있는 문법입니다. 다음 예제는 제너릭 타입을 이용해 목록(TList<T>) 클래스를 만들고 사용한 코드입니다. 

    TList = class(TObject)
    public
      procedure Add(const Value: T);
      function Get(Index: Integer): T;
    end;
    
    var
      IntList: TList;
      StrList: TList;
    begin
      IntList := TList.Create;
      StrList := TList.Create;
      IntList.Add(100);
      StrList.Add('Hello');
      IntList.Free;
      StrList.Free;

    자세히보기 : http://tech.devgear.co.kr/406874

     

    □ [2009] 메소드의 파라메터로 코드블록을 전달할 수 있어 유연한 코드를 작성할 수 있습니다.

    익명메소드(Anonymouse Method)

    이름에서 알 수 있듯이 익명메소드는 이름이 없는 프로시저나 함수입니다. 익명 메소드는 변수에 할당하거나 메소드의 파라메터로 코드 블록을 전달할 수 있습니다. 

    type
      TProc = reference to procedure(Value: Integer);
    procedure Call(const AProc: TProc);
    begin
      AProc(10);
    end;
    
    procedure DoSimpleAnonymouseMethod;
    var
      Proc: TProc;
    begin
      proc := procedure(Value: Integer)
      begin
        ShowMessage(Value.ToString);
      end;
      Call(Proc);
    end;

    익명메소드는 다른 언어의 클로저(closures)의 구조와 유사합니다. 익명메소드는 특히 쓰레드 개발 시 사용하면 유용합니다. 쓰레드 시작 코드 구현 시 쓰레드 완료 코드를 함께 구현하면 작업흐름을 한눈에 파악할 수 있어 코드의 유지보수가 편리해 집니다.

    자세히보기 : http://tech.devgear.co.kr/406874

     

    □ [2009] 유니코드 문자열 기반의 애플리케이션을 개발할 수 있습니다.

    유니코드 지원

    이제 델파이 언어 전체에서 유니코드가 지원됩니다. 기존 버전들에서는 String은 AnsiString을 의미했지만 이제는 유니코드를 완벽하게 지원하는 UnicodeString으로 바뀌었습니다. UnicodeString은 기존의 WideString과는 달리 AnsiString과 유사한 레퍼런스 카운팅(Reference Counting) 구조로 설계되어 훨씬 메모리 효율적이며 속도도 빠릅니다. 스트링을 버퍼로 사용해왔던 관행에 대한 대안으로 RawByteString 타입도 추가되었습니다. 

    자세히보기 : http://tech.devgear.co.kr/406874

     

    □ [2006] 기존의 클래스를 수정하지도 상속받지도 않고 클래스 기능을 확장할 수 있습니다.

    타입 헬퍼(Type Helper)

    타입 헬퍼는 클래스, 레코드, 열거형 타입의 기능을 확장할 수 있는 문법입니다. 다음코드는 열거형에 타입헬퍼를 이용해 ToString 메소드를 확장하는 예제입니다. 

    type
      TGeoDirection = (North, East, South, West);
    
    // 열거형을 문자열로 변환하는 기능 확장
    TGeoDirectionHelper = record helper for TGeoDirection
    function ToString: string; inline;
    end;
    
    function TGeoDirection.ToString: string;
    begin
      case Self of
        TGeoDirection.North:  Result := ‘북쪽 (N)’;
        TGeoDirection.East:  Result := ‘동쪽 (E)’;
        TGeoDirection.South:  Result := ‘남쪽 (S)’;
        TGeoDirection.West:  Result := ‘서쪽 (W)’;
      else
        raise Exception.Create(‘Unknown TGeoDirecton value’);
      end;
    end;
    
    var
      Direction: TGeoDirection;
    begin
      Direction := South;
      ShowMessage(Direction.ToString);
    end;

    자세히보기 : http://tech.devgear.co.kr/406874

     

    □ [2006] 레코드에도 속성, 메소드, 클래스 메소드등 타입을 추가 할 수 있습니다.

    메소드를 지원하는 레코드

    record 선언에서 클래스처럼 필드 외에도 속성, 메소드(생성자도 포함됨), 클래스 속성, 클래스 메소드, 클래스 필드, 네스티드 타입을 가질 수 있게 되었습니다. 

    type
      TMyRecord = record
    type
      TInnerColorType = Integer;
      var
        Red: Integer;
      class var
         Blue: Integer;
       procedure printRed();
       constructor Create(val: Integer);
       property RedProperty: TInnerColorType read Red write Red;
       class property BlueProp: TInnerColorType read Blue write Blue;
    end;
    
    constructor TMyRecord.Create(val: Integer);
    begin
      Red := val;
    end;
    
    procedure TMyRecord.printRed;
    begin
      writeln('Red: ', Red);
    end;

     

    □ Exit; 문에 반환값을 넣을 수 있어 코드가 더 짧아 집니다.

    반환값을 갖는 빠져나오는 Exit 함수

     

    □ inline 지시자로 함수와 프로시저의 성능을 향상 시킬 수 있습니다.

    Inline 지시자

    타입 헬퍼는 클래스, 레코드, 열거형 타입의 기능을 확장할 수 있는 문법입니다. 다음코드는 열거형에 타입헬퍼를 이용해 ToString 메소드를 확장하는 예제입니다. 

    function Max(const X,Y,Z: Integer): Integer; inline;

    델파이 컴파일러는 함수와 프로시저의 성능을 향상할 수 있는 Inline 지시자를 지정할 수 있습니다. 이 지시자는 해당 루틴을 실제로 호출하는 대신 호출하는 측에서 해당 루틴을 포함하는 코드를 생성하도록 합니다.

     

    □ 같은 유닛의 클래스에서도 변수와 메소드를 노출하지 않을 수 있습니다.

    srict private, strict protected

    델파이에서 클래스의 속성에 대한 가시성을 결정하는 2가지 옵션이 있습니다.

    strict private: private는 같은 유닛에 있는 다른 클래스에서는 접근할 수 있습니다. strict private는 같은 유닛에 있는 다른 클래스에서도 접근할 수 없습니다.

    strict protected: strict private과 유사하며, strict protected로 선언된 변수와 메소드는 클래스 본인과 상속한 클래스에서만 접근할 수 있습니다.

     

    □ 메소드 뿐 아니라 클래스도 abstract로 선언해 추상 클래스로 만들 수 있습니다.

    클래스 추상화(class abstract)

    타입 헬퍼는 클래스, 레코드, 열거형 타입의 기능을 확장할 수 있는 문법입니다. 다음코드는 열거형에 타입헬퍼를 이용해 ToString 메소드를 확장하는 예제입니다. 

    type
      TAbstractClass = class abstract
      procedure SomeProcedure;
    end;

     

    □ 클래스를 더이상 상속하지 못하도록 sealed로 지정할 수 있습니다.

    클래스 봉인(class sealed)

    type
      TAbstractClass = class sealed
      procedure SomeProcedure;
    end;

     

    □ 클래스는 해당 클래스에서만 사용 가능한 타입 선언을 포함할 수 있습니다. 

    클래스 타입(class type)

    type
    
    TClassWithClassType = class
    
    private
    
       type
    
         TRecordWithinAClass = record
    
           SomeField: string;
    
         end;
    
    public
    
       class var
    
         RecordWithinAClass: TRecordWithinAClass;
    
    end;
    
    
    
    procedure TForm1.FormCreate(Sender: TObject);
    
    begin
    
    TClassWithClassType.RecordWithinAClass.SomeField := '이것은 클래스 타입으로 선언된 필드입니다.';
    
    ShowMessage(TClassWithClassType.RecordWithinAClass.SomeField);
    
    end;

     

    □ 클래스는 클래스 변수를 가질 수 있습니다.

    클래스 변수(class var)

    이것은 클래스의 객체가 아닌 클래스 자체에 적용되는 변수입니다. 예제는 위의 “클래스 타입”을 참고하십시오. 

     

     

    □ 클래스 선언부 에서 타입 선언을 포함시킬 수 있습니다.

    중첩된 클래스

    클래스 선언 내에서 타입 선언이 포함될 수 있습니다. 이 방법으로 개념적으로 관계가 있는 타입들을 같이 둘 수 있으며, 이름 충돌도 피할 수 있습니다. 

    type
    
    TOuterClass = class
    
    strict private
    
       MyField: Integer;
    
    public
    
       type
    
         TInnerClass = class
    
         public
    
           MyInnerField: Integer;
    
           procedure InnerProc;
    
         end;
    
         procedure OuterProc;
    
    end;
    
    
    
    procedure TOuterClass.TInnerClass.InnerProc;
    
    begin
    
    ...
    
    end;

     

    □ 메소드를 더 이상 상속받지 못하도록 fianl 지시자로 막을 수 있습니다.

    final 지시자

    오버라이드한 버추얼 메소드를 final로 표시하여 상속되는 클래스에서 해당 메소드를 더 이상 오버라이드하지 못하도록 막을 수 있습니다. 

    TAbstractClass = class abstract
    
    public
    
    procedure Bar; virtual;
    
    end;
    
    
    
    TSealedClass = class sealed(TAbstractClass)
    
    public
    
    procedure Bar; override;
    
    end;
    
    
    
    TFinalMethodClass = class(TAbstractClass)
    
    public
    
    procedure Bar; override; final;
    
    end;

     

    □ 클래스에 스태틱 클래스 메소드를 추가할 수 있습니다.

    클래스 스태틱 메소드(class static method)

    클래스에 스태틱 클래스 메소드를 추가할 수 있는데, 이것은 클래스 타입으로부터 호출할 수 있는 메소드입니다. 클래스 스태틱 메소드는 객체에 대한 참조 없이도 사용이 가능합니다. 일반적인 클래스 메소드와는 달리, 클래스 스태틱 메소드는 Self 파라미터를 가지지 않습니다. 또한 객체의 멤버들을 액세스할 수도 없습니다. (클래스 필드, 클래스 속성, 클래스 메소드는 액세스할 수 있습니다) 또한 클래스 메소드와 달리 클래스 스태틱 메소드는 virtual로 선언될 수 없습니다. 

    type
    
    TMyClass = class
    
    strict private
    
       class var
    
       FX: Integer;
    
    strict protected
    
       // 노트: 클래스 속성을 액세스하려면 클래스 스태틱으로 선언되어야 합니다.
    
       class function GetX: Integer; static;
    
       class procedure SetX(val: Integer); static;
    
    public
    
       class property X: Integer read GetX write SetX;
    
       class procedure StatProc(s: String); static;
    
    end;
    
    
    
    begin
    
    TMyClass.X := 17;
    
    TMyClass.StatProc('Hello');
    
    end;

     

    □ 컬렉션의 요소만큼 반복하는 for-in 반복문을 사용할 수 있습니다.

    for-in 반복문

    이제 델파이에서 컨테이너에 대해 for-요소-in-컬렉션 스타일의 반복자를 지원합니다. 컴파일러는 다음의 컨테이너 반복 패턴을 인식합니다. 

    for Element in ArrayExpr do Stmt;
    for Element in StringExpr do Stmt;
    for Element in SetExpr do Stmt;
    for Element in CollectionExpr do Stmt;

     




    User Feedback

    표시할 리뷰가 없습니다.


×
×
  • Create New...

중요한 정보

이용약관 개인정보보호정책 이용규칙 이 사이트가 더 잘 작동하기 위해 방문자의 컴퓨터에 쿠키가 배치됩니다. 쿠키 설정 변경에서 원하는 설정을 할 수 있습니다. 변경하지 않으면 쿠키를 허용하는 것으로 이해합니다.