std::vector, Iterator 직접 구현하며 이해하기

이미지
들어가며  C++ 표준 라이브러리 (STL) std::vector 는 순차적인 자료(배열)를 저장하는 템플릿 클래스입니다.  처음 프로그래밍을 배우던 시절 수년간 동적 메모리 할당(Dynamic Allocation) 을 오직 new, delete 구문에만 의존해 왔습니다. (STL이 뭔지 몰랐습니다.) 그러던 어느날 std::vector 를 처음 사용해 본 후 그 편리함과 왜 이런 존재를 나는 몰랐지라는 허무함이 공존했던 기억이 납니다. 하지만 new, delete를 다년간 사용하며 배웠던 포인터, 메모리에 대한 깊은 이해 는 현재까지도 프로그래밍 지식의 좋은 밑바탕이 되었음을 스스로 느낍니다. 편리함의 이면 std::vector를 접한 후 대부분의 동적 배열, 동적메모리 할당 은 제 코드에서 사라지게 되었고, 남이 만든 클래스(물론 표준이지만)의 사용법을 배우는 것에만 집착하게 됩니다. "이게 어떻게 만들어져 있지" 보다 "어떻게 이것을 사용하지" 라는 생각만 남아 깊은 공부에 별 도움이 되지 않는 도구의 사용법에만 관심이 있었습니다.  대학시절의 자신에게 돌아간다면, 그건 (사용법은) 별로 중요하지 않다고 말해주고 싶군요. 오히려 " 비슷하게 직접 한번 만들어 보는 것은 어때 " 라고 권해주고 싶습니다. 또한, STL은 C++의 강력한 표준 라이브러리이지만 언제나 사용가능한 것은 아닙니다. (아두이노 IDE는 C++언어를 지원하지만 STL은 사용이 불가, 작은 메모리환경)   std::vector 그럼 직접 나만의 벡터 를 만들어 보겠습니다. 앞으로 소개할 예제는 vector Class, Nested Class로 iterator Class 구현까지 포함한 내용입니다. 물론 표준 라이브러리만큼 훌륭하진 않지만 좋은 공부가 될 것입니다. ...

PyQt를 이용해 날아오는 적군 피하기 게임

이미지
개요 이번 주제는 Python과 PyQt5를 이용한 피하기 게임 입니다. 기본 구성은 주인공이 키보드 화살표(상, 하, 좌, 우)로 이동하고, 모든 방향에서 출현하는 적을 피하는 게임입니다. 지뢰라는 아군의 무기를 도입해 스페이스 키를 누르면 동그란 원이 생기고 적으로부터 1회의 방어막을 생성합니다. (쿨타임 3초) 가끔씩 등작하는 "갈색 적군" 은 아군과 접촉하면 모든 적이 한번에 사라집니다.   [실행 화면] PyGame 을 활용해 더 비주얼하고 멋진 게임 코드를 작성할 수도 있지만, 여러분이 개발 가능한 영역을 더 확장(유틸리티, 시스템소프트웨어, 네트워크 등)하기 좋은 Qt를 배우는 것을 권장하고 싶습니다. 예제를 작성시 아래 사항들에 대해 주의를 기울여 코드를 작성해 보았습니다. 객체 지향적 으로 만들자 화면 갱신을 최소화해 CPU 점유율 을 낮추자   소스코드 그럼 소스코드를 한번 살펴보겠습니다. 게임은 총 3개의 파이썬 파일 ( main.py, game.py, unit.py ) 로 구성되어 있습니다.   unit.py 파일 이 파일은 Unit, Enemy, My 3개의 Class 선언 입니다. from PyQt5.QtCore import Qt, QRectF from PyQt5.QtGui import QColor class Unit: def __init__(self, r=QRectF(), c=QColor()): self.rect = r self.color = c class Enemy(Unit): def __init__(self, dir=0, type=0, r=QRectF(), c=QColor()): super().__init__(r, c) ...

자동차 트립컴퓨터 파이썬클래스로 구현하기

이미지
오늘은 파이썬으로 자동차 클래스 를 만들어 보고자 합니다. 예를 들면, 자동차의 연비, 최대 연료 탱크량, 현재 연료량, 주행거리 등을 속성 (Attribute or Property)으로 갖고 "기름을 넣다", "주행하다" 등의 행위를 함수 (Method) 로 구현하고자 합니다. 클래스를 설계할 때, 위와 같이 속성은 변수 로, 행위는 함수 로 구현하는 것이 기본입니다. 아래와 같이 사용합니다. 두개의 파이썬 파일 ( main.py, car.py ) 로 구성되어 있으므로 두 파일을 같은 경로에 두고 main.py를 실행하면 됩니다.  먼저 Car Class 객체를 생성하고 사용하는 main.py 파일입니다. main.py from car import Car c = Car('마이카', 15, 60) # 이름, 연비, 연료탱크량 c.print() c.chargeFuel(47) c.print() c.drive(100) c.print() 코드는 아래와 같이 동작합니다. 3번 라인 : Car 클래스 객체 c 생성, (차량이름, 연비, 최대연료탱크량) 4번 라인 : Car 클래스 print() 메서드 호출, 차량 정보 출력 6번 라인 : Car 클래스 chargeFuel() 메서드 호출, 기름 충전 9번 라인 : Car 클래스 drive() 메서드 호출, 차량 주행   위 코드의 수행 결과는 다음과 같습니다. 마이카를 한대 생성하고, 기름을 47 리터 충전 후, 100 Km를 주행한 결과입니다. [Car 클래스 생성 후 사용결과] car.py 다음으로 Car Class 코드를 살펴보겠습니다. class Car: def __init__(s...

중첩(Nested)클래스로 Iterator 직접 구현하기

이미지
C++ STL의 템플릿 클래스들이 제공하는 이터레이터를 직접 구현해본 예제 입니다. 예를 들면, std::vector 의 이터레이터를 다음과 같이 사용합니다. std::vector<int> v; v.push_back(5);  v.push_back(3);  v.push_back(7);  // 이터레이터 선언 std::vector<int>::iterator itr = v.begin(); 직접 템플릿 클래스를 만들고 이를 순회하는 iterator 도 직접 만들어 보는 것이죠. 이진 탐색 트리( B inary S earch T ree, 이하 BST)의 Iterator를 직접 구현 해보고자 하는 학원생이 있어 같이 공부하며 만들어 보았습니다. 이 게시물은 BST의 기본적인 구현을 설명하지 않습니다. 인터넷에 많은 자료가 있으므로 참조하기 바라며, Custom Iterator 의 내용 위주로 설명하겠습니다. 구글 검색으로 아래 사이트의 도움을 많이 받았습니다. 미국 "The Ohio State University, Steven J Zeil" 교수님이 구현한 예제이며, 해당 주제에 대해 잘 정리되어 있습니다. 링크 :  https://www.cs.odu.edu/~zeil/cs361/latest/Public/treetraversal/index.html 아래와 같이 사용합니다.  Main.cpp #include <iostream> #include <string> #include "bst.h" int main() { // int type bst ocs::bst<int> b1; b1.insert(5); b1.insert(3); b1.insert(7); b1.insert(2); b1.insert(10); std:...

Qt C++앱 Android 배포하기(개발환경구축)

이미지
개요 이번 포스팅은 C++과 Qt 를 이용해 안드로이드 앱 을 만드는 과정을 진행할 계획입니다. 앱은 간단한 샘플로 제작하고, Qt를 이용해 C++ Android 개발환경을 구축 하는 방법에 대해 집중해 보았습니다. 저 또한 데스크탑 환경이 아닌 낯선 모바일 개발환경을 처음 접했을 때, 이 부분이 가장 어려웠습니다. 결과부터 살펴보면 PC와 폰을 연결해 Qt의 Cross Platform  을 이용, Windows 플랫폼에서 개발 -> Android 플랫폼에서 실행 으로 구성되어 있습니다. [Windows 10, LG G7 연결] [Qt 앱 실행화면] 물론 이 방법 외에도 안드로이드 앱을 만들 수 있는 개발환경은 다양합니다. Android Studio(Java or Kotlin),  Microsoft Xamarin(C#) 등 선호하는 방법으로 개발환경은 스스로 선택하면 되겠습니다.   개발 환경 구축 이 예제는 Windows 10 Pro 64bit 운영체제에서 구성, 작성되었습니다. 더불어, 아래의 구성요소들이 필요합니다.  Qt Android Studio Android NDK Java JDK   1. Qt 설치 Qt는 C++로 만들어진 Class들의 집합이며, 크로스 플랫폼을 지원합니다. GUI ( G raphic U ser I nterface) 개발에 주로 사용되지만, 네트워크, 블루투스, 3D, 쓰레드 등 다양한 분야의 클래스를 지원합니다.   설치...

이 블로그의 인기 게시물

Qt Designer 설치하기

PyQt5 기반 동영상 플레이어앱 만들기