본문 바로가기

Language

[C++] 클래스 표준 입출력 C++의 연산자 오버로딩을 활용해 클래스를 직접 cin, cout에 사용할 수 있다.xostream& operator
[JS] Phaser 간단한 웹게임을 만드려고 한다. 다양한 JavaScript 게임 엔진들이 있었지만 Phaser.js를 선택했다. 예제 코드나 API문서들이 잘 정리되어 있어서 금방 따라할 수 있어 보였다. 튜토리얼을 따라가보며 구현법을 간단히 익혔다. 튜토리얼은 여기를 참고했다. Intro일단 Phaser3로 아래 게임을 만들어 볼 것이다. 코드를 작성하며 기능에 대해 알아볼 수 있었다.먼저 Phaser는 HTML5에서 게임을 만들 수 있는 프레임워크다. 데스크탑이나 모바일 브라우저에서 모두 활용할 수 있으며 태그가 지원되는 곳이면 사용 가능하다.아래는 베이스라인 코드이다.​xvar config = { type: Phaser.AUTO, width: 800, height: 600, scene: { preload: prel..
[Python] Queue 멀티 쓰레드 프로그래밍을 할 때 큐와 쓰레드를 혼합해 사용하면 비교적 간단하게 문제를 해결할 수 있다. 작업 큐를 만들어 처리할 작업들을 큐에 저장하고 각 쓰레드는 큐에서 작업들을 하나씩 가져와 처리하는 방식이 일반적이다. 파이썬에서는 이를 위해 멀티 쓰레드 환경에서 사용할 수 있는 Queue를 제공한다.Queue의 핵심 함수는 아래 3개가 있다. 이외에도 qsize(), empty(), full()이 있는데 적절히 사용하면 된다.put/get : 큐에 데이터를 삽입/삭제한다.task_done : 큐에서 작업이 완료되었다.join : 큐의 모든 작업이 끝날때까지 대기한다.put/get은 일반적인 큐와 동일하게 데이터를 삽입하고 가져오는 함수이다. 그 이외 task_done과 join은 기존 큐에서는 볼 ..
[Python] GIL CPython은 파이썬의 표준 구현이며 두 단계를 거쳐 파이썬 프로그램을 실행한다. 먼저 소스 코드를 구문 분석해서 바이트 코드로 변환 후, 인터프리터를 통해 실행한다. 이 떄 CPython은 GIL(Global Interpreter Lock)을 사용해 일관성을 강제로 유지한다. 따라서 파이썬에서 멀티 쓰레드 프로그램을 개발하는데는 한계가 있다.GIL이 멀티 쓰레딩에 어떤 영향을 주는지 코드를 통해 살펴본다. 처리하는데 오래 걸리는 함수를 작성하고 쓰레드를 사용했을 때와 사용하지 않았을 때의 시간을 측정해본다.xxxxxxxxxxdef factorize(n): for i in range(1, n + 1): if n % i == 0: yield i​import timenumbers = [135254,1341..
[Python] Flask 간단한 API 호출을 위한 웹 서버가 필요해서 flask 프레임워크를 사용해 구축하려고 한다. Spring, PHP, nodejs, django 등 많은 프레임워크가 있고 쓸 수도 있겠지만 두 가지 이유에서 flask를 선택했다. 간단하고 빠르게 개발이 가능하고 파이썬 언어를 사용하기 때문이다. 혼자서 개발하고 규모도 크지 않아 적절한 선택이라고 생각한다. flask로 직접 개발해본적은 없지만 쉽게 원하는 기능을 만들 수 있을것 같다.개발 환경은 ubuntu16.04LTS, python3.6으로 진행했다. 모듈 설치flask도 파이썬 모듈이기 때문에 pip로 설치 가능하다.pip install flask 앱 생성app.py파일을 만들고 코드를 작성한다.xfrom flask import Flaskapp =..
[Python] 함수 인자 파이썬으로 작성된 코드를 보다보면 함수 인자에 *args, **kwargs라는 생소한 인자가 들어간다. 이 키워드들이 어떤 것인지, *가 무엇을 의미하는지 확인해본다.packing/unpackingpacking은 여러 인자를 하나의 값으로 묶어주는 기능이다. 함수 인자의 이름 앞에 *를 붙여주면 된다.xdef foo1(*args): print("type", type(args)) print("value", args)​foo1(1, 2, 3, 4)위 코드를 실행하면 아래와 같이 출력된다.xxxxxxxxxxtype value (1, 2, 3, 4)foo1함수의 인자에 1, 2, 3, 4를 전달했으며 함수는 이 값들을 튜플의 형태로 가져온다. 따라서 인자의 갯수에 상관없이 함수를 호출할 수 있다.unpackin..
[C++] Reference(1/2) C/C++에서는 데이터를 관리하기 위해 기본적으로 두 가지 종류의 저장소를 제공한다. 변수 포인터 : 포인터는 다른 저장소를 가리키는 메모리 주소를 저장한다. 주로 크기가 일정하지 않은 문자열이나 배열 등에 사용한다. C++은 여기에 참조(Reference)라고 하는 특수한 종류의 변수가 존재한다. 참조는 일반 변수의 저장소를 공유하기 위해 만든 실제 변수가 아닌 컴파일러가 인지하는 가상 변수를 말한다. C++의 포인터는 메모리 주소에 직접 접근해서 데이터를 읽고 수정할 수 있다. 이를 통해 비교적 크기가 큰 데이터를 빠리게 처리할 수 있다. 일반 객체지향 언어는 포인터를 제공하지 않는다. 대신 가상 포인터와 가상테이블을 사용하여 필요에 따라 서로 다른 데이터 저장소를 가리킨다. int, float같은 ..
[C++] 클래스 생성자 클래스의 인스턴스를 생성할 때 반드시 생성자가 호출된다. 생성자를 통해 클래스가 어떻게 생성되는지 살펴보자.암시적 생성자와 명시적 생성자객체를 생성하는 방법은 클래스 내 멤버을 어떤 방식으로 초기화하느냐에 따라 호출되는 생성자가 달라지게 된다. 아래 예시 코드를 통해 알아보려 한다.아래와 같은 Point 클래스를 정의해보았다.x#include class Point{public: int x; int y;​ Point() : x(0), y(0) { printf("Point() called!\n"); }​ Point(int x) : x(x), y(0) { printf("Point(int x(%d)) called!\n", x); }​ Point(int x, int y) : x(x), y(y) { printf("..