본문 바로가기

프로그래밍 언어

Unit testing 이란 https://www.jetbrains.com/help/clion/unit-testing-tutorial.html#basics Unit testing tutorial | CLion www.jetbrains.com ※ 본 포스팅은 위의 글을 번역한 것입니다. 1. 유닛 테스트의 장점 1. 코드를 모듈화 해준다. - 단위 테스트를 수행하기 위해서는 코드가 모듈화 되어야 하기 때문에, 단위 테스트를 수행하기 위해서라도 코드를 모듈화하게(혹은 테스트하기 쉽게)(Code Testability) 설계를 하게 된다 2. (테스트) 회귀를 피해준다 - 단위 테스트는 작업의 진전이 있을 때 마다 반복적으로 수행을 한다. 따라서, 계속 적으로 작업이 옳은 방향으로 나아갈 수 있게 도와준다. 3. 코드를 문서화 해준다. -.. 더보기
객체 지향 & 패턴 in C (2) [Contents] 스테이트 패턴 객체지향 스테이트 패턴 [출처] '모던 C언어 프로그래밍' - 하나이 시세이 스테이트 패턴 - 상태 변화표를 이용하면, 다이어그램으로 표현하지 못한 빠진 부분 까지 모든 패턴을 확인할 수 있다. - 상태는 열거형(enum)을 이용해 나타내는 방법이 일반적이다. - onEvent 함수에서는 전역변수인 state에 따라 event가 다르게 발휘(?) 되도록 한다. typedef enum { EV_STOP, EV_PLAY_PAUSE } EventCode; typedef enum { ST_IDLE, ST_PLAY, ST_PAUSE } State; void initialize() { state = ST_IDLE; } void onEvent(EventCode ec) { switch.. 더보기
void 포인터 용법 정리 Free void pointer Q. void *로 참조된 배열 혹은 구조체를 Free 하는 것은 괜찮을까? A. Malloc과 Free는 항상 void* 를 취하므로 void* 포인터 참조된 것을 해제 하는 것은 자연스러운 일이다. 즉, Free는 void*를 취한다(take). void ** 사용법 void**는 포인터의 포인터이다. 아래의 예시에 따르면 자료형을 알수 없는(some_type_t) 배열을 참조할 때, 해당 배열을 (void *)로 캐스팅 한 후에, (void **)형인 array로 아래와 같이 접근할 수 있겠다. some_type_t 배열이 2차원 배열이라면, void** array 를 이용해 행(row) 접근을 한다고 볼 수도 있겠다. void** array; int arrayLen.. 더보기
객체 지향 & 패턴 in C (1) [Contents] C언어와 객체지향1 C언어와 객체지향2 - 기능 추가 C언어와 객체지향3 - 확장성을 고려한 기능 추가 C언어와 객체지향4 - 상속된 기능들(기능의 상속화) [출처] '모던 C언어 프로그래밍' - 하나이 시세이 C언어와 객체지향1 - 자료구조는 구조체로 표현하여 '객체'처럼 생성하면 편리하다. - 매크로를 사용하여 쉽게 구조체 초기화를 한다. Stack.h #include typedef struct{ int top; const size_t size; int *const pBuf; } Stack; bool push(Stack *p, int val); bool pop(Stack *p, int *pRet); #define newStack(buf) {0, sizeof(buf) / sizeof.. 더보기
Two pointer as argument 예시) #include #include void My_Func1(int *p) { int val = 100; int *Ptr = &val; p = Ptr; //실제로 이렇게 사용하진 않는다. 예시 일뿐. } void My_Func2(int *p) { int val = 100; p = &val; //실제로 이렇게 사용하진 않는다. 예시 일뿐. } void My_Func3(int *p) { *p = 100; //포인터가 가리키는 값을 변경한다(화살표는 그대로) } void My_Func4(int **p) { int val = 200; *p = &val; //포인터 화살표가 변경된다 } void My_Func5(int **p) { int val2 = 300; int *Ptr = &val2; *p = Ptr; .. 더보기
SOLID (객체 지향 설계) 설명 객체지향 프로그래밍 및 설계 다섯가지 기본 원칙 by 로버트 마틴 - SOLID 원칙들은 소프트웨어 작업에서 프로그래머가 소스 코드가 읽기 쉽고 확장하기 쉽게 될 때까지 소프트웨어 소스 코드를 리팩터링하여 코드 냄새를 제거하기 위해 적용할 수 있는 지침이다. SOLID 약어 개념 A. SRP(단일 책임의 원칙) - 개념: 작성된 클래스는 하나의 기능만을 가지며, 클래스가 제공하는 모든 서비스는 하나의 책임(변화의 축: axis of change)을 수행하는데 집중되어야 한다. 어떤 변화에 의해 클래스를 변경해야 하는 이유는 오직 하나뿐. 책임 변경에서 다른 책임 변경의 연쇄 작용에서 자유로울 수 있다. - 효과 : 코드 가독성 향상, 유지보수 용이 - 연습 방법 : 도메인에 따라 적용 방법이 다르므로, .. 더보기
[OS] python 과 실행파일 1. 파이썬으로 외부 exe 파일 실행하기 import subprocess subprocess.call(["C:\\temp\\calc.exe"]) or import os os.system('"C:/Windows/System32/notepad.exe"') - 서브쉘에서 명령(문자열) 수행. 표준 C함수 system() 호출하여 구현. - command가 출력을 생성하면, 인터프리터 표준 출력 스트림으로 전송된다. ※ os.system 리턴 값 (SO 링크)(링크2) 2. 파이썬 프로그램을 exe 파일로 만들기 - pyinstaller를 통해 하나의 exe 파일을 생성할 수 있다. - 장점 : 하나의 exe 파일로 배포 가능. 압축이 되어 exe 파일 사이즈가 작다 - 단점 : 압축된 형태의 exe 파일이 .. 더보기
경로 유틸리티 os.path.abspath(path) - 파일의 절대 경로를 반환한다. os.path.abspath('tmp') >>> 'C:\\Python30\\tmp' ※ os.path.abspath(path) = os.path.dirname(path) + os.path.basename(path) os.path.isdir(path) - 입력 받은 경로가 디렉토리 라면 1을 반환 os.path.exists(checkpoint_dir) - 해당 디렉토리 path가 있는지 확인한다. 예시) 폴더가 존재하지 않을 경우 생성한다. if not os.path.exist(checkpoint_dir): os.makedirs(checkpoint_dit) os.path.basename(path) - 입력받은 경로의 기본 이름(bas.. 더보기