Qt

[Qt] Qt에 대해 알아보자.

De-v-signer 2024. 11. 18. 00:01
Write once, compile anywhere

Qt는 C++을 기반으로 하는 그래픽 사용자 인터페이스(GUI) 프레임워크로, 엔진에 해당하는 C++언어와 표시 언어인 자체 규격의 QML 두 가지 언어를 활용한다. LGPL 또는 GPL 라이센스를 적용하는 대부분의 라이브러리 특성 상 코드를 공개할 경우에는 비 상업적인 용도 한정으로 무료로 사용할 수 있지만, 상업적인 용도로 쓰거나 코드 공개를 하지 않으려면 라이센스 비용을 지불해야 한다.

크로스 플랫폼을 지원하는 장점이 있으나 태생이 데스크톱 환경으로 출발하여, 모바일 환경에 대한 최적화가 아주 좋은 평가를 받고 있지는 못하다. 그러나 버전이 오르면서 개선이 이뤄지고 있으며, 해외에서는 많은 프로그램들이 Qt로 만들어지고 있어 글로벌하게 본다면 장래성이 없지는 않아 보인다.

QML (Quick Markup Langauge)는 그 이름에서부터 알 수 있듯이 마크업 언어인데, 완전히 마크업만을 위해서 사용되는 것은 아니며, 일부 프로그래밍도 가능하다는 점이 특징이다. Javascript 기반이기 때문에 웹 언어에 익숙하다면 금방 배울 수 있으며, Javascript와 JSON 등 많은 부분에서 유사점이 있다. 대체로 코드의 문법이 쉽고 직관적이어서 학습 난이도가 굉장히 낮은 편이다.

QML의 주요한 특징 중 하나가 바인딩(Binding)인데, 이 바인딩을 잘 다루는 것이 Qt 프로젝트의 퍼포먼스와 최적화 측면에서 매우 주요한 부분이 된다. 바인딩은 한 마디로 어떤 변수들 또는 컴포넌트들을 묶어 연관시키는 것인데, 이렇게 연관된 요소들은 세부적인 상태나 값이 변하면 같이 변화하기 때문에 잘 사용하면 효율적으로 코드를 관리할 수 있다.

반면 바인딩이 깨지거나 순환하게 되는 경우 끔찍한 결과를 초래하기도 하는데, 원하는 대로 움직이지 않아서 바인딩이 깨진 경로를 역추적하며 관찰해야 하거나 순환 문제가 생겨 하드웨어 성능을 깎아먹는 경우가 발생해 바인딩을 조정해야 하는 경우가 생긴다. 특히 두 번째의 순환문제의 경우 바인딩 루프(Binding Loop)라고 하는데, 대표적인 경우가 부모요소와 자식요소가 서로 값을 참조하여 위치나 크기를 변화하게 만들어놓은 경우, 원인과 결과가 돌고 돌게 되면서 '닭이 먼저냐 달걀이 먼저냐'와 같은 원초적인 문제에 빠져 결과를 도출할 수 없는 상태가 되고 만다. 이러한 경우 선후 인과관계를 분명히 하여 순환이 되지 않도록 조정해줘야 한다.

차량용 HMI를 만들게 되면서 Qt라는 언어를 알게 되었는데, 낯설면서도 독특하고 재미있는 언어이지만 국내에는 커뮤니티나 사용자가 많지 않아 대부분 독학으로 공부하였고, 막히거나 할 때 답을 찾기가 막막한 점도 있다. 이 카테고리에서는 그 과정에서 알게된 점이나 Qt의 중요한 장단점에 대해 기록하여 스스로도 다시 확인하고, 다른 Qt 사용자들이 참고할 수 있는 자료로 만들어보고자 한다.
반응형

'Qt' 카테고리의 다른 글

[QML] 반복되는 요소 구현하기: Repeater  (0) 2024.11.25
[QML] 가장 기본적인 컴포넌트, Item  (0) 2024.11.23
[QML] Component 호출하기  (1) 2024.11.21
[QML] Binding 개념 숙달하기  (1) 2024.11.20