9월, 2019의 게시물 표시

RTTI에 대한 이해

이미지
이번에는 C++의 RTTI ( R un t ime T ype I ndentification) 에 대해 소개하고자 합니다. 다형성(Polymorphism) 을 갖는 C++ class 들(하나 이상의 가상함수를 포함)에 대해 적용 가능합니다. 클래스 다형성은 가상함수에 의해 구현되므로, RTTI는 가상함수를 갖는 클래스의 상속관계에서만 사용가능 합니다. 아마도 이 주제를 찾아 보는 사용자라면 알고 있겠지만, C++ 포인터와 클래스 상속에 대한 이해가 요구됩니다. RTTI 런타임에 상속 관계를 갖는 클래스들의 객체 타입을 체크 하는 메커니즘. dynamic_cast or typeid 연산자로 구성. 가상함수(Virtual Fucntion)를 가지는 클래스들만 사용 가능.  왜 RTTI 가 필요한지 코드를 통해 살펴보겠습니다. 안전하지 않은 타입 캐스팅 #include <iostream> using namespace std; class CWnd { virtual void draw() { cout << "CWnd" << endl; } }; class CView:public CWnd { public: int m_view; void draw() { cout << "View" << endl; } }; class CTreeView :public CView { public: int m_treeview; void draw() { cout << "Tree View" << endl; } }; int main() { // 부모클래스 포인터는 자식 클래스 객체를 가르킬 수 있다. CWnd *pw = new CWnd; CWnd *pv = new CView; CWnd *pt = new CTreeView;

PyQt와 피타고라스정리를 이용한 양궁 게임

이미지
개요 이번에 만든 파이썬 예제는 양궁게임(Archery Game) 입니다. 마우스를 클릭하면 움직이는 QProgressBar (수평, 수직) 를 이용해 x, y  좌표를 설정하고 과녁에 맞춘 위치 표시합니다. 심화반 초등학생이 C++, MFC로 만든 양궁게임에서 영감을 얻어 Python과 PyQt5를 이용해 만들해 보았습니다. [양궁게임 실행화면] 설계 과정 1. 윈도우 창의 하단, 우측에 수평, 수직 QProgressBar를 배치 (X, Y 좌표 얻기 용도) 2. QFrame을 이용해 양궁 과녁판 제작 (정사각형) [과녁판] 3. 양궁 과녁 점수판 사각형 영역 얻기 (과녁 사각형을 줄여가며) [과녁 점수판 영역 설정] 4. 사각형에 내접하는 원으로 그리기 [과녁 점수판 원으로 표현] 5. 과녁 색상 입히기 [과녁 완성 모습] 6. 피타고라스의 정리를 이용해 점수 구하기 [화살 좌표로 점수 구하기] 좀 더 세부적인 내용은 소스코드를 보며 알아보겠습니다. 소스코드 2개의 파이썬 파일로 구성 (main.py, archery.py) main.py import sys from Py

PyQt로 구현한 아날로그 시계 2편

이미지
NTP에 대해 설명한 아날로그 시계 1편 에 이어, 실제 Analog Clock을 그리는 2편입니다. Python에서 NTP(Network Time Protocol)을 이용한 시간 얻기 는 1편을 참조하기 바랍니다. 2편에서는 얻어진 시간정보로 아날로그 시계를 그리는 방법 에 대해 살펴보겠습니다. 완성된 모습은 아래와 같습니다. pyinstaller 실행파일 링크 : Analog Clock.exe [Python Analog Clock] 자세한 개요는 1편에 있으므로, 바로 소스코드를 분석해 보겠습니다. 소스 코드 분석 전체 코드는 2개의 파이썬 파일로 구성되어 있으며(main.py, NTP.py), 이번 시간에는 시계를 그려내는 main.py 파일을 살펴보겠습니다. 프로그램을 실행하기 위해서는 1편의 NTP.py 파일과 2편의 main.py 파일 2개가 필요합니다. NTP.py ( 1편 참조 ) main.py 윈도우 창을 구성하고, 시계외형 원, 시간표시, 시, 분, 초침, 날짜 등을 그리는 역할입니다. 세부내용은 아래 main.py 전체 코드 를 살펴보고 설명하겠습니다. import sys import math from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import * from NTP import NTP from threading import Thread import time QApplication.setAttribute(Qt.AA_EnableHighDpiScaling, True) class CWidget(QWidget): displayUpdate = pyqtSignal() def __init__(self): super().__init__()

PyQt로 구현한 아날로그 시계 1편

이미지
이번에 만들어본 예제는 아날로그 시계 (Analog Clock) 입니다.   먼저 완성된 모습을 살펴보겠습니다. [아날로그 시계 화면]     Python, PyQt5를 이용해 구현되어 있습니다. Pyinstaller 로 제작된 실행 파일(exe) : Analog Clock 개요 전 세계 시간을 모두 표시 할 수 있는 아날로그 시계를 파이썬으로 만들어 보았습니다. Network Time Protocol 을 이용, 온라인으로 타임서버에 접속 해 시간을 읽어와 표시하는 프로그램 입니다. [인터넷 연결시, On-line 표시] 타임서버에 접속 불가 시(오프라인)는 운영체제에서 시간을 읽어와 표시합니다. [인터넷 연결불가시, Off-line 표시] 윈도우 시간이 맞지 않을때 time.windows.com 이라는 타임서버에 접속해 시간을 설정(동기화)하는 원리와 같습니다. 시침, 분침, 초침의 변화하는 각도와 원(시계)의 반지름 정보를 기반으로 삼각함수로 좌표를 찾고 선을 그려주는 방식으로 구현되어 있습니다. UTC (협정 세계시)를 적용 해 각 나라별 세계 시간이 모두 구현되어 있습니다. 아래는 주요 국가별 UTC 지도 입니다. [협정 세계시 지도, 출처 : 위키백과] 주요 기능 1. NTP ( N etwork T ime P rotocol) 를 이용한 온라인 시간 표시 2. 인터넷 비 연결시 Off-line 시간 표시 (시스템 시간 이용) 3. On-line or Off-line 자동 감지 4. UTC 기반 세계 시계 표시 (UTC-12~UTC+14) 5. 시계 주요 부분 개별 그리기 (위 동영상 참조)   소스 코드 분석 총 2개의 파일로 구성. (main.py , NTP.py) NTP.py 먼저 타입서버에 접속해 시간정보를 읽어오는 부분입니다. 설명은 소스코드 뒤에서 이어 가도록 하고, 전체 코드를 살펴보겠습니다. from datetime import

파이썬으로 구현한 로그인 시스템 동작원리

이미지
로그인 시스템 우리는 하루에도 여러번 홈페이지 접속을 위해 ID, Password 를 입력하곤 합니다. [로그인 화면] 이런 로그인 시스템은 어떻게 구성 되어 있을까요? 사이트마다 조금씩 다르지만 대부분 아래와 같습니다. 1. 먼저 회원가입을 통해 내 ID, PW 를 저장. 2. 로그인 화면에서 내 ID, PW를 입력해 둘다 맞는 경우 로그인 성공, 아니면 실패 3. 여러번 로그인에 실패하면 보안강화 보통은 이런 방식입니다. Python 으로 구현한 Login System 파이썬으로 간단히 구성해 보았습니다. # 로그인 실패 횟수 cnt = 0 while True: # ID, PW 입력받기 id = input('ID 입력:') pw = input('PW 입력:') # ID 와 PW 일치하는지 비교 if id=='superman' and pw=='1234': print('로그인 성공') break else: cnt = cnt + 1 print('로그인 {}회 실패'.format(cnt)) if cnt >= 3: print('보안을 위해 로그인 시스템을 종료합니다!') break #줄바꿈 print() 로그인 시도는 한번만 시도할 수 있는게 아니라, 보통 3~5회 정도 시도가 가능합니다. 따라서 while 반복문으로 로그인 관련 코드를 반복 실행합니다. 그다음은 7, 8번 라인을 통해 사용자로 부터 ID, PW를 입력받습니다. input() 함수는 사용자의 입력을 기다리기 위해 아래 코드로 바로 넘어가 실행되지 않고 코드를 멈추게 만듭니

이 블로그의 인기 게시물

Qt Designer 설치하기

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