프로그래밍 언어 74

[ Coding Style Guide ] 02. C언어 - 헤더파일

헤더파일 헤더파일을 바르게 사용하는 것으로 코드의 가독성과 크기, 성능에 큰 차이를 만들 수 있다. define guard 헤더파일이 중복 포함되는 것을 방지하기 위해, 모든 헤더파일 내에 #define 가드를 사용한다 #define 가드의 형식은 ____H_이며, 는 프로젝트 소스 디렉토리로부터의 하위경로로 표시된다. // foo/src/bar/baz.h #ifndef FOO_BAR_BAZ_H #define FOO_BAR_BAZ_H #endif // FOO_BAR_BAZ_H 인라인 함수 10줄 이하이면서 for, while, switch 문을 포함하지 않은 함수만 인라인 함수로 정의한다. -inl.h 파일 복잡한 인라인 함수의 정의로 인해 헤더파일이 지저분해질 경우, 인라인 함수만 정의하는 -inl.h..

[ DB ] 03. SQLite의 이야기와 질의(Query)

SQLITE VIEW 모바일을 위한 요구사항을 만족시키기 위한 데이터베이스 솔루션으로 대표적인 것이 SQLite이다. SQLite는 구글의 안드로이드나 애플의 아이폰 등에서 사용되는 솔루션으로 사용자 측면과 관리자 측면에서 모두 뛰어난 접근성을 가지고 있는 데이터베이스 관리 시스템이다. 본 이야기에서는 SQLite에서 제공하는 SQL문들에 대해서 소개하도록 한다. 뷰(View)는 질의에 대한 결과 세트로 구성된 가상 테이블에 접근할 수 있는 저장 질의로 구성되어 있다. 뷰는 다른 테이블들에서 유도되었으며, 관계형 데이터베이스의 일반적인 기본 테이블과 달리 뷰는 물리적인 스키마의 형태를 가지지 않는다. 이는 데이터베이스 내의 데이터들로부터 계산되거나 병합된 가상 테이블의 형태를 가지고 있으며, 동적인 특성..

[ Coding Style Guide ] 01. C언어 - 이름규칙

아래는 소프트웨어 개발 시 준수해야 하는 코딩 스타일을 정의하고 가이드한다. C언어를 대상으로 하고 있으며 C99표준이 적용된다. ( 추후 C11 등 최신 표준으로 변경 적용 가능하며, 이에 따라 본 문서의 내용이 일부 변경될 수 있다.) 해당 가이드는 구글 C++ 코딩 스타일 가이드를 기반으로 필요에 따라 일부 내용을 수정, 변경하여 적용하였다. 이름규칙 일관성을 위해 가장 중요한 것은 이름 규칙을 따르는 것이다. 이름의 스타일을 통해 요소의 선언을 찾지 않고도 해당 요소가 타입인지, 변수인지, 함수인지, 상수인지, 혹은 매크로인지 바로 알 수 있다. 이름 규칙은 개인의 선호도보다 일관성이 더 중요하다. 합리적이라고 생각하든 아니든 규칙은 지켜야 한다. 일반 함수 이름, 변수 이름, 파일 이름은 약어를..

[ Coding Style Guide ] 00. 코딩 명명법

--오랜만의 포스팅이다.. 회사 프로젝트로 바빠 업로드 하지 못한 나 자신을 반성합니다-- 프로젝트를 진행하면서 선언하는 변수명,함수명,클래스명 등 여러가지 이름들의 명명법에는 규칙이있다. 대표적으로 카멜표기법, 파스칼표기법, 스네이크 표기법이 있는데 하나씩 알아보겠다. 카멜(Camel) 표기법 int manAge; int womanAge; int peopleAge(int man, int woman) { return man + woman; } 변수명과 함수명을 카멜표기법으로 작성한 예이다. 카멜표기법은 낙타등처럼 내려갔다 올라가는 모양인데 woman+age 처럼 단어 여러개가 붙을때 맨 앞에오는 단어만 소문자로 표기하고, 뒤에오는 단어는 대문자로 표기하는 방법이다. (세단어 이상일경우도 맨앞만 소문자) ..

[ C ] 17. 연결리스트 구조체 ( Linked List )

[ 연결리스트 구조체 ] 프로그래밍에서 빼놓을 수 없는 자료구조인 연결 리스트(linked list)에 대해 구현해보겠다. 연결리스트는 데이터가 담긴 노드(메모리 공간)을 일렬로 연결해놓았다고 해서 연결리스트라고 부르며 특징은 다음과 같다. 리스트의 중간 지점에 노드를 손쉽게 추가하거나 삭제할 수 있다. 특정 노드를 찾으려면 노드를 모두 검색해야 한다. 크기가 고정되어 있지 않다. 다음은 다른 노드를 가리키는 포인터가 하나씩만 있는 단일 연결 리스트(singly linked list)이다. 지금부터는 구조체, 포인터, 함수, 메모리 할당을 사용하여 단일 연결리스트를 구현하는 방법을 알아보겠다. 참고로 연결리스트는 기본적인 자료구조 이지만 포인터를 사용하다 보니 많은 사람들이 어려워하는 부분이니 너무 걱정..

[ DB ] 02. SQLite3 with C/C++ (기본편)

SQLite3 with C/C++ 이 포스트는 Zetcode.com의 글 "SQLite C Tutorial"을 번역한 것이다. http://zetcode.com/db/sqlitec/ SQLite C 튜토리얼 SQLite 는 관계형 데이터베이스 엔진입니다. 개발자는 SQLite 를 자급자족하는, 서버도 필요 없고, 설정도 필요없는 트랜잭셔널 SQL 데이터베이스 엔진이라고 표현합니다. 지금은 전세계에 수십 수백만 개가 사용되고 있을 정도로 유명하죠. SQLite 는 Solaris 10, Mac OS, 안드로이드, 아이폰에도 사용됩니다. Qt4 라이브러리도 파이썬, PHP 와 함께 SQLite 를 내부적으로 지원하죠. 또 파이어폭스, 구글 크롬 등의 아주 유명한 애플리케이션들도 내부적으로 SQLite 를 사용..

[ C ] 16. volatile 이용하기

[ volatile ] 변수를 선언할 때 앞에 volatile을 붙이면 컴파일러는 해당 변수를 최적화해서 제외하여 항상 메모리에 접근하도록 만든다. volatile int num1 = 10; // 변수를 최적화해서 항상 메모리에 접근하도록 만듦 volatile로 선언한 변수는 사용할 때 항상 메모리에 접근한다. 즉, 이 변수는 언제든지 값이 바뀔 수 있으니까 항상 메모리에 접근하라고 컴파일러에게 알려주는 것이다. 예를 들면 다음과 같은 반복문이 있다. int i = 0; while(i 컴파일러는 이 코드를 최적화하여 while 반복문을 없애버리고 i에 그냥 10을 할당해 버린다.(Visual Studio의 /02옵션, GCC의 -03옵..

[ C ] 15. 공용체

[ 공용체 ] 공용체는 구조체와 정의 방법이 같지만 멤버를 저장하는 방식이 다르다. 즉, 다음과 같이 멤버들이 각각 공간을 차지하지만 공용체는 모든 멤버가 공간을 공유한다. 즉, 공용체는 멤버 중에서 가장 큰 자료형의 공간을 공유한다. 현실에서 예를 들자면 물건이 하나 들어있는 선물상자와 비슷하다. 같은 크기의 상자지만 들어있는 물건의 종류가 다른 것 처럼. 공용체 만들고 사용하기 union 공용체이름{ 자료형 멤버이름; }; 공용체는 정의만 해서 사용할 수 없고 따로 변수로 선언해서 사용해야한다. #define _CRT_SECURE_NO_WARNINGS // strcpy 보안 경고로 인한 컴파일 에러 방지 #include #inlcude // strcpy 함수 union Box{ short candy;..

[ C ] 14. goto에 관하여

[ goto에 관해 ] goto는 별다른 제약 조건 없이 원하는 부분으로 이동할 수 있기 때문에 초보 때는 goto를 남발하는 경우가 많다. 그러다 보니 처음에는 goto는 가급적 사용하지 말라고 한다. 하지만 goto를 적절히 활용하면 중복되는 코드를 없애고 코드를 좀 더 간결히 만들 수 있을 것이다. 특히 에러처리에 매우 유용하기 때문에 리눅스커널에서도 자주 쓰이며 for, switch 등 중첩 반복문에 많이 쓰이는 것을 알아두자. # 스파게티 코드 스파게티 코드는 `goto`를 과도하게 사용해서 프로그램의 흐름이 마치 스파게티 면발처럼 꼬여있다는데서 붙여진 이름이다. 그래서 스파게티 코드는 가독성이 떨어지고 유지보수가 매우 힘들다. goto와 레이블 #define _CRT_SECURE_NO_WARN..

[ C ] 13. 함수 포인터 배열 활용하기

[ 함수 포인터 배열 활용 ] 함수 포인터 배열 사용하기 #define _CRT_SECURE_NO_WARNINGS #include int add(int a, int b){ return a + b; } int sub(int a, int b){ return a - b; } int mul(int a, int b){ return a * b; } int div(int a, int b){ return a / b; } int main(){ int funcNumber; // 함수 번호 int num1, num2; int (*fp)(int, int) = NULL; // int형 반환값, int형 매개변수 두 개가 있는 함수 포인터 선언 printf("함수 번호와 계산할 값을 입력하세요: "); scanf("%d %d %..

[ C ] 12. 함수와 가변인자

[ 함수와 가변인자 ] printf, scanf와 같이 매개변수의 개수가 정해지지 않은 개수가 있다. 이렇게 매번 함수에 들어가는 인수(argument)의 개수가 변하는 것을 가변 인자(가변 인수, variable argument)라고 한다. 함수에서 가변인자를 정의할 때는 고정 매개변수가 한 개 이상 있어야 하며 고정 매개변수 뒤에 ...을 붙여 매개변수의 개수가 정해지지않았다는 표시를 해준다. 단, ...뒤에는 다른 매개변수를 지정할 수 없다. 반환값 자료형 함수이름(자료형 고정매개변수, ...){ } #include // args는 고정 매개변수 void printNumbers(int args, ...){ printf("%d ", args); } int main(){ printNumbers(1, 1..

[ C ] 11. 함수와 배열

[ 함수와 배열 ] 함수에서 배열을 매개변수로 사용하면 연속된 값을 전달할 수 있꼬, 전달한 배열의 요소를 함수 안에서 변경할 수 있다. 1차원배열 매개변수 함수에서 배열을 매개변수로 사용하려면 ( )(괄호)안에서 매개변수 이름 뒤에 [ ](대괄호)를 붙이거나 매개변수를 포인터로 지정해줍니다. 대괄호를 포인터로 지정하기 반환값자료형 함수이름(자료형 매개변수[]){ } 반환값자료형 함수이름(자료형 *매개변수){ } #include void printArray(int arr[], int count){ // 배열의 포인터와 개수를 받음 for(int i=0; i

[ C ] 10. 함수와 포인터

[ 함수와 포인터 ] void 포인터 매개변수 사용하기 void 포인터 매개변수를 사용하면 자료형 변환을 하지 않아도 모든 자료형을 함수에 넣을 수 있다. 이번에는 char, int, float형을 매개변수로 받아서 값을 서로 바꿔보겠다. #include enum TYPE { TYPE_CHAR, TYPE_INT, TYPE_FLOAT }; void swapValue(void *ptr1, void *ptr2, enum TYPE t){ switch(t){ case TYPE_CHAR:{ // 문자면 char *로 변환한 뒤 역참조하여 값을 서로 바꿈 char temp; temp = *(char *)ptr1; *(char *)ptr1 = *(char *)ptr2; *(char *)ptr2 = temp; break..

[ C ] 09. 전처리기 ( if, ifdef, elif, ifndef, define, endif )

[ 전처리기 ] 일반적인 if조건문과의 차이는 일반 if조건문이 FALSE일 경우, 실행이 되지 않을 뿐 컴파일은 된다면, #if가 0이라면 컴파일 자체가 되지않는다. #include int main(){ if(0){ printf("실행되지는 않지만 컴파일은 됨\n"); } #if 0 printf("컴파일 자체가 안됨\n"); #endif return 0; } => 전처리기의 특성을 이용한 것이다. 전처리기는 실제 컴파일이 수행되기 전에 실행되어 소스에 치환되는 데 #if가 0일 경우에는 소스에 삽입 되지 않는다. 즉 #if는 if와 다르게 조건에 따라 소스코드를 삽입하거나 삭제하기 위해 사용되는 지시자이다. #include #define NUM -3 int main(){ #if NUM printf("i..

[ C ] 08. 구조체

[ 구조체 ] 구조체는 struct 키워드로 정의한다. struct 구조체이름{ 자료형 멤버이름; ... }; // 구조체는 정의만 해서 사용할 수가 없다. 구조체도 변수로 선언해서 사용한다. struct 구조체이름 변수이름; ex. #define _CRT_SECURE_NO_WARNINGS // strcpy 보안 경고로 인한 컴파일 에러 방지 #include #include // strcpy 함수가 선언된 헤더 파일 struct Person{ // 구조체 정의 char name[20]; // 구조체 멤버 1 int age; // 구조체 멤버 2 char address[100]; // 구조체 멤버 3 } int main(){ struct Person p1; // 구조체 변수 선언 // 점으로 구조체 멤버에..