반응형

프로그래밍 215

C++ 템플릿(template) 이해하기

템플릿을 사용하여 프로그래밍 하는 것을 일반화(Generic) 프로그래밍이라고도 한다. 개인적으로 C++을 제대로 공부하기 위한 첫 번째 관문은 템플릿(template) 아닐까 생각한다. 템플릿을 알아야 STL(Standard Template Library)를 공부할 수 있기 때문에 이 관문을 거쳐가야 한다. 물론 템플릿을 제대로 이해하는 것이 만만한 영역은 아니지만 STL은 사용방법만 알면 깊은 이해없이도 기본적인 사용은 할 수 있다. 어찌되었건 템플릿을 제대로 공부하려면 큰 맘을 먹어야 한다. 여기에서는 템플릿의 기본적인 내용을 우선 정리해보려고 한다. 그렇다면 템플릿은 무엇인가? 식상하지만 많은 책에서 붕어빵 틀, 또는 모형 자 등으로 비유된다. 붕어빵 틀에 밀가루 반죽을 부어서 붕어빵을 찍으면 붕..

프로그래밍/cpp 2017.04.18

에라토스테네스의 체 이해하기

그리스 수학자 에라토스네테스가 고안해 낸 소수를 찾는 알고리즘입니다. 다른 알고리즘에 비해서 논리가 상당이 심플하기 때문에 어렵지 않게 접근할 수 있습니다. 우선 소수의 정의는 1과 자기 자신 외에 약수를 가지지 않는 수 입니다. 따라서 1이 아닌 어떤 수를 n(n > 1)배 했을 때 소수가 나올 수는 없습니다. 이것이 이 알고리즘의 핵심입니다. 소수가 아닌 수는 합성수입니다. 1과 자기 자신 이외에 약수를 가지는 수가 합성수죠. 알고리즘을 간단히 설명하겠습니다. 예를들어 2부터 100까지의 수 중에서 소수를 구한다고 해봅시다. 앞서 예기한 것처럼 1이 아닌 어떤 수(여기서는 2부터 100까지의 수를 차례대로)를 2배, 3배, ... 해서 100을 넘기기 전까지의 배수를 구합니다. (아래 그림) 위 그림..

c언어 포인터 읽는 방법만 알아도 반은 안다.

요즈음 책들은 양도 질도 많이 높아졌다고 생각합니다. 그래서 C언어를 공부하시는 많은 분들은 이 내용을 잘 아시리라 생각듭니다. 제가 요즈음 나온 기본 문법서는 제대로 본적이 없지만 잘은 모르겠네요. 아무튼 아직까지 책에서 제대로 이 부분을 짚어놓은 책을 본 적이 없어서 포인터의 읽는 법에 대해서 몇가지 주저리 써보겠습니다. 몇몇 분들께는 조금이나마 도움이 되었으면 하는 바램으로 글을 써나가겠습니다. 사실 포인터에 대한 개념을 제대로 이해하기 위해서는 읽는 법이 매우 중요합니다. 왜냐면 어찌되었건 우리는 코드를 통해서 생각을 하기 때문에 코드가 자연스럽게 읽혀져야 포인터가 어떻게 동작하는지에 대해서 지속적이고 올바른 방향으로 생각해 나갈 수 있기 때문이다. 좀 추상적으로 말한 듯 한데 결론은 제대로 읽어..

c++ 캐스팅 연산자 const_cast

앞서 static_cast에 이어서 나머지 캐스팅 연산자에 대한 내용입니다. conast_cast와 dynamic_cast는 사용 빈도수가 높지 않습니다. 그래도 중요한 포인트는 기억해 두어야 합니다. const_cast이름으로 유추해 보면 상수를 상수가 아닌 수로 또는 그 반대로 바꾸는 경우에 사용할 듯 싶네요. 그런데 이름 그대로 이해하면 안됩니다. 앞서 살펴본 static_cast의 경우 상수변수의 상수성을 없애는 용도로 사용했었습니다. 그렇다면 const_cast라는 것을 굳이 둘 필요가 없겠죠. 바로 const_cast은 포인터나 참조로만 캐스팅이 가능합니다. 이 때에는 상수성을 주거나 또는 상수성을 없앴 수만 있습니다. 예를 들어 보면... num이라는 정수형 상수와 이에 대한 상수 지시 포인..

프로그래밍/cpp 2017.04.11

동적 계획법 functools.lru_cache 장식자

동적 계획법(dynamic programming)이란 말은 수학에서 유래한 용어이다. 의미를 살펴보면 프로그래밍 언어에서 말하는 동적(dynamic), 정적(static)이란 말과는 구별을 두어야 할 듯 싶다. 동적 계획법은 일종의 최적화 기법으로 어떤 문제를 부분적으로 나눌 수 있을 때 중복되는 문제해결 과정을 재사용하여 계산을 최적화 하는 기법이다. 이를 메모이제이션(memoization)이라고 한다. 예를 들어 어떤 문제집합을 풀 때 func(1,2)라는 호출이 여러번 있다면 func(1,2)라는 호출에 대한 결과를 캐시에 저장해 놓고 다음 호출 부터는 캐시에 있는 결과값을 바로 얻는 방식이다. 단 이 경우에 func(1, 2)라는 값은 언제나 동일함을 보장해야 한다. 가장 쉬운 예로는 피보나치 수..

extern, static 지정자

사실 이 두 지정자는 그렇게 복잡한 녀석들은 아니지만 메모리의 모습과 컴파일 과정과 맞물린 성질을 가지고 있기 때문에 확실히 개념을 잡지 않으면 그냥 저냥 이해하고 넘어가게 된다. extern우선 extern이란 지정자는 간단한 예제 프로그램에서는 거의 등장하지 않는다. 왜냐면 extern으로 선언된 변수가 있다면 이 변수는 전역 변수로 어디엔가 선언되어 있다는 의미를 가지고 있는데 일반적인 예제 프로그램들의 전역변수는 코드의 앞 부분에 미리 선언되므로 굳이 extern 지정자를 사용할 필요가 없기 때문이다. 코드는 순서대로 메모리에 올라가게 되고 이 순서만 맞춰서 전역 변수가 메모리에 우선 올라가 있다면 어디서든 접근이 가능하기 때문이다. 반대로 이 순서라는 것이 발목을 잡을 수가 있다. 예를 들어 전..

프로그래밍/cpp 2017.04.06

PYINSTALLER로 파이썬 실행파일 만들기

파이썬으로 만든 파일은 py라는 확장자를 가진 스크립트 파일이다. 이 파일을 실행시킬 때는 반드시 시스템에 해당 버전에 맞는 파이썬이 설치되어 있어야 한다. 따라서 배포를 목적으로 파이썬으로 프로그램을 만들기 위해서는 py2exe와 같은 유틸리티가 필요하다. py2exe는 파이썬2 문법으로 만든 파이썬 파일을 실행파일(exe)로 만들어준다. 파이썬3 문법으로 만들었다면 py2exe를 사용할 수 없다. 대신 pyinstaller를 사용하면 된다.(윈도우즈 환경에만 해당) 기본적인 사항py확장자를 가진 스크립트 파일의 용량을 살펴보면 1MB를 넘는 파일은 드물다. 하지만 exe파일로 바꿔놓고 나면 아주 작은 녀석의 경우도 10MB정도 될 것이다. 이것은 파이썬 파일을 실행파일(exe)로 만들 때 파이썬이 설..

파이썬 달력 모듈 calendar 사용법

파이썬에서 기본적으로 제공되는 달력 모듈인 calendar에 대한 정리! calendar 모듈은 표준 모듈로 달력과 관련된 유용한 함수, 클래스들을 포함하고 있다. 달력 출력하기이번달(오늘이 포함된) 달력을 그려보려면 어떻게 할까? 함수를 이용하는 방법을 먼저 알아보자. month(year, month) 함수로 해당 년(year), 월(month)에 해당하는 달력이 문자열로 출력된다. print로 이 문자열을 출력하면 달력 형식에 맞게 출력된다. 애초에 다음과 같이 prmonth함수를 사용해도 된다. 그런데 달력을 제대로 사용하려면 calendar 모듈이 제공하는 클래스를 사용해야 한다. 위와 같은 작업을 클래스로 해보겠다. 달력을 현지화(요일이름을 사용자 언어에 맞게) 시키고 싶다면 다음과 같이 하면 ..

텐서플로우 tensorflow 설치 파이썬, GPU 이용

앞서 아나콘다 설치와 GPU연산을 사용하기 위한 CUDA 툴킷을 설치했다. 이젠 텐서플로우만 설치하면 바로 실습에 들어갈 수 있다. 앞에서 아나콘다를 관리자 권한으로 설치하지 않았다면 문제가 발생할 수 있으므로 관리자 권한으로 설치하지 않았으면 재설치하도록 한다. 아나콘다에서 텐서플로우를 그냥 설치할 수도 있고 가상환경을 이용해서 설치할 수도 있다. 가상환경을 이용한 설치 방법은 여기를 참고하도록 하고 여기서에서는 그냥 텐서플로우를 설치하도록 하겠다. 윈도우 커맨드 창을 열도록 한다. 우선 아나콘다가 제대로 설치되었는지 확인한다. python 3.5.2 | Anaconda 4.2.0(64-bi)... 이렇게 나오면 제대로 설치된 것이다. quit() 또는 ctrl+z로 빠져나온 뒤에 다음과 같이 입력하자..

파이썬 아나콘다 설치하기

얼마 전부터 텐서플로우를 윈도우에도 설치할 수 있게 되어 해당 환경을 만드는 방법을 정리한다. 파이썬은 오픈소스인 만큼 다양한 배포판이 있다. 그 중에 수학이나 과학에 관련된 필수 라이브러리를 묶어서 배포하는 버전이 아나콘다 버전이다. 기존 설치된 파이썬으로도 가능하지만 필요한 라이브러리가 생길 때 마다 추가적으로 설치작업이 필요할 수 있으므로 아나콘다 버전을 설치하는 것이 깔끔하다. 그리고 두 번째로 쿠다를 설치할 것이다. 쿠다는 연산을 할 때 GPU를 사용할 수 있도록 해주는 기술인데, 인공지능이나 과학기술의 연산에서는 CPU보다 GPU를 이용함으로서 훨씬 높은 성능을 낼 수 있다. 여기서는 쿠다 Toolkit과 쿠다 GPU 가속 라이브러리를 설치할 것이다. 따라서 본인의 그래픽 카드가 NVIDIA그..

반응형