RAD 스튜디오 10.3 리오 "새 기능 한글 요약본: RTL" 입니다.
모든 새 기능, 강화된 기능, 버그 픽스 등에 대해서는 Docwiki의 What's New 10.3 (영문 보기, 한글번역 보기) 와 관련 페이지를 보기 바랍니다.
10.3 리오 - RTL 관련 주요 업데이트 요약
델파이 RTL 10.3에서는 JSON과 HTTP와 관련된 성능과 표준 준수가 크게 향상되었다.
데이터 구조(Data Structure) 증가 전략 변경
일부 데이터 구조(TStringList, TList, TList<T>, TQueue<T>, TSTack<T>)에서는 항목이 기존 용량에 가득차서 확장을 해야 할 때 더 유연하게 용량이 증가되도록 하는 전략이 반영되었다. 과거에는 무조건 기존 용량 만큼만 더 늘어나도록 정해져있었다. 이 새 증가 전략은 SysUtils.pas 유닛 안에 있는 공유 글로벌 함수로 구현되었다.
function GrowCollection(OldCapacity, NewCount: Integer): Integer;
게다가, 개발자는 이와 호환되는 새 함수를 작성하고, 글로벌 프로시저인 SetGrowCollectionFunc를 호출함으로써, 자신에게 알맞게 구현할 수 있다
만약 사용자 정의된 "컬렉션 증가 함수"를 런타임 패키지 안에 설치한다면, Exit 할 때 반드시 nil이 되도록 지정해야 한다. 그렇지 않으면 런타임은 패키지가 내려간(unload) 후에 이 존재하지 않는 함수를 부르려고 시도할 수도 있을 것이다.
TStringBuilder 변경
성능 향상을 위해 TStringBuilder의 일부가 변경되었다. 메모리 증가 전략 면에서 유사한 변경이 있었으며, 중복된 코드를 제거하는 등 전반적인 구현을 깔끔하게 정리했다.
TStringBuilder 열거형(enumerator)이 최적화 되었다.
또한 TStringBuilder.ToString 메소드 파라미터 하나가 추가되었다. 추가된 파라미터는 ToString (UpdateCapacity: Boolean)이다. ToString(True)이면, TStringBuilder를 더이상 변형할 필요가 없다고 예상되는 상황에서 성능이 더 좋아진다. 데이터가 복사되는 량이 줄어들기 때문이다.
JSON 향상
정확성과 성능 면에서 JSON 처리 및 해독(parse)이 크게 향상 되었다.
리스트 관련 향상
- TList와 TDictionary에 퍼블릭 프로퍼티(들)이 새로 추가: 초기화된 후에 해당 리스트의 비교자(comparer, 정렬 위한 비교 동작에 대한 정의)에 접근할 수 있다.
- TDictionary<TKey,TValue>에 TryAdd 메소드가 추가
- TObjectList<T>에 ExtractAt(Index: Integer): T 가 추가
- TList<T>.IndexOf 성능 향상
- 일반적인 TList<T>, TQueue<T>, TStack<T> 리스트에 항목을 추가하는 성능 향상. 대체로TList<T>.Add는 30%까지 더 빨라졌다.
- TList, TStrings, TComponent, TCollection, TList<> 열거형(enumerator) 최적화. 반복속도 자체만 보면 "for in" 루프는 2.5~4배 빨라졌음
- 컬렉션 열거자(enumerator) 타입의 부분으로, RAD 스튜디오는 반복(iteration)이 완료되었을 때 해당 열거자의 상태를 공식적으로 정의한다: "MoveNext가 False를 반환한 후에는 열거자 상태가 유효하지 않으며 열거자는 반드시 해제되거나 다시 생성되어야하며, 더 이상 액세스해서는 안 됩니다."
기타 RTL 변경
- TStringHelper.Split은 이제 StrUtils에 있는 글로벌 함수인 SplitString과 동일한 결과를 만든다.
- zlib가 1.2.8로 업그레이드 되면서 몇가지 버그 픽스가 있었다 (그리고 이제는 RAD 스튜디오 C++ 64-bit 컴파일러에서 컴파일될 수 있다).
- PCRE가 8.42로 업그레이드 되면서 윈도우에서 UTF-16을 지원한다 (그리고 이제는 RAD 스튜디오 C++ 컴파일러에서 컴파일될 수 있다
- Unicode 테이블 (System.Character 유닛)에서 유니코드 v11.0을 지원한다.
- TStringHelper.Split 메소드에서 지금까지와는 또 다른 동작을 할 수 있도록 지정할 수 있다. 새로 생긴 옵션은 TStringSplitOptions.ExcludeLastEmpty이다.
- SysUtils 유닛에 있는 프로시저와 함수의 순서를 재정돈하여 인라인(inline)을 더 잘 지원할 수 있도록 했다.
- System 유닛에 새 별칭(alias)인 Float32과 Float64가 추가되었다.
앱테더링(AppTethering)에서 긴 문자열 전송
현재 (앱테더링에 사용되는) TTetheringAppProfile 클래스의 SendString / AsString은 대략 1,400 문자까지 길이가 제한되어 있다. 10.3 에서는 다음과 같은 변경과 추가를 통해 호환성을 유지하면서도 긴 문자열을 다룰 수 있도록 했다.
- TTetheringAppProfile에 새 메소드인 SetLongString과 SendLongString이 추가되었으며, 이 메소드들은 문자열이 아니라 스트림을 사용하여 통신한다.
- TResourceValue.AsString은 수신한 스트림을 문자열을 반환하는 것이 가능하면 그렇게 하고, 가능하지 않으면 수신한 문자열을 반환한다. 따라서 일반 문자열과 "긴 문자열" 모두를 처리할 수 있다.
TTetheringAppProfile.SendString은 문자열 길이가 1.3 KB보다 작은 경우에 사용하고, 그 이상인 경우에는 TTetheringAppProfile.SendLongString을 사용해야 한다.
TMemIniFile 최적화
RAD 스튜디오 10.3 리오에서는 TMemIniFile 구현이 최적화 되었다. TMemIniFile 읽기와 생성(constructing)이 10~25배 빨라지고 메모리 사용은 절반으로 감소했다. TMemIniFile의 다른 동작 역시 향상되어서 이전 구현에 비해 50~100% 더 빨라졌다.
또한 10.3에서는 스트림에서 TMemIniFile을 적재(load)할 수 있는 기능이 추가되었다. 즉 생성자 오버로드 2가지가 더 추가되었다.
- TMemIniFile.Create(Stream)
- TMemIniFile.Create(Stream, UseLocale)
이 생성자 파라미터 2개는 해당 클래스 안에서 사용할 수 있도록 유지되며 새 프로퍼티를 통해 외부에 공개된다.
- Stream 프로퍼티
- UseLocale 프로퍼티