분류 전체보기 779

[ Coding Style Guide ] 05. C언어 - 주석

주석 주석은 코드의 가독성을 유지하는 데 매우 중요하다. 하지만 이와 별개로, 가장 좋은 주석은 코드 자체이다. 즉, 최대한 주석없이도 코드 만으로 이해할 수 있도록 코드를 작성한다. 타입과 변수, 함수 등에 이해할 수 있는 이름을 적용하는 것이 이상한 이름을 짓고 주석으로 설명하는 것보다 낫다. 주석을 작성할 때에는 그 코드를 보고 이해해야 하는 사람을 위해 성실하게 작성한다. 주석스타일 // 또는 / * * /를 사용하되 일관성 있게 사용한다. 되도록 //를 사용한다. 주석의 내용과 위치, 작성 방식에 일관성을 가져야 한다. 파일 주석 모든 파일의 시작 부분에는 라이선스 문구를 작성하고 그 뒤에 내용에 대한 설명을 작성한다. 라이선스 모든 파일은 라이선스 문구를 퐇마한다. 또는 동일 라이선스 범위를 ..

[ Coding Style Guide ] 04. C언어 - 변수범위

변수 범위 변수의 범위를 적절히 조점함으로써 코드의 가독성이나 성능을 높일 수 있다. 지역 변수 함수 내 변수는 가능한 한 좁은 범위에 둔다. C99 이상에서는 함수 어디에서나 변수 선언을 할 수 있지만, 변수를 가능한 한 국한된 범위로 선언하고 최대한 첫 번째 사용처에 가깝게 선언한다. 이는 읽는 사람이 선언을 찾고 변수의 타입과 초기값을 알아내는 것을 쉽게 한다. 되도록 선언과 동시에 초기화 한다. // 나쁨 - 선언과 초기화가 분리되어 있다. int i; i = f(); // 좋음 - 선언과 동시에 초기화 된다. int j = g(); for, if, while 문에서 조건검사에 사용되는 변수는 되도록 해당 라인에서 변수를 선언한다. 이 경우 해당 변수명은 코드의 다른부분에서 재 선언 가능하다. f..

[ Coding Style Guide ] 03. C언어 - 서식

서식 코딩 시 모두가 통일된 스타일을 사용하면 프로젝트를 파악하기 쉬워진다. 각자가 모든 서식 규칙에 동의하기 어렵고, 일부는 익숙해지는데 시간이 걸리지만, 프로젝트 구성원들이 규칙에 따라 코드를 작성함으로써 서로의 코드를 쉽게 이해하도록 하는 것은 중요하다 줄 길이 코드의 각 줄은 120 문자를 넘지 않게 한다. 문자형식 문자는 되도록 ASCII 문자를 사용하고, ASCII가 아닌 문자를 사용할 경우에는 UTF-8 형식을 사용한다. 들여쓰기 단계 당 2개의 스페이스로 들여쓰기(indentation) 하고 탭은 사용하지 않는다. 코드 상의 그 어디에서도 탭을 사용하지 않는다. 중괄호 중괄호로 묶이는 모든 코드블럭에서, 각 중괄호 "{", "}"는 구문에 따라 같은 줄에 작성하거나 줄바꿈하여 작성한다. /..

[ 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..

[ 기타 ] 03. 윈도우에서 작성한 파일을 리눅스에 올릴 때 생기는 ^M 제거하기

03. 윈도우에서 작성한 파일을 리눅스에 올릴 때 생기는 ^M 제거하기 윈도우에서 작성한 파일을 Unix/Linux상에 올리면 개행 문자가 깨져서 ^M가 보이는 경우를 봤을 것이다. 이것은 윈도우에서는 CRLF 가 개행인데 Linux/Unix에서는 LF가 개행이라 나타나는 현상으로 보면 된다. CR,LF 뜻 라인피드(LF : Line Feed) => 현재 위치에서 바로 아래로 이동 캐리지리턴(CR: Carriage return) => 커서의 위치를 앞으로 이동 설명은 이정도로 하고 제거 방법을 알아 보자 vi, vim에서 제거하는 방법 :%s/^M//g # 여기서 ^M은 ^+M이 아니고 Ctrl + v + m 이다. vi에서 입력한 각 명령어는 아래와 같다. : # vi, vim에서 명령어를 입력 :%s..

IT/[ 기타 ] 2021.01.20

[ 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 처럼 단어 여러개가 붙을때 맨 앞에오는 단어만 소문자로 표기하고, 뒤에오는 단어는 대문자로 표기하는 방법이다. (세단어 이상일경우도 맨앞만 소문자) ..

[ Embedded ] 23. HAL(하드웨어 추상화 계층)

HAL Hadrware Abstraction Layer (하드웨어 추상화 계층) 하드웨어 추상화 계층이란 컴퓨터 본체와 같은 물리적 하드웨어와 OS 같은 컴퓨터에서 실행되는 소프트웨어 사이의 추상화 계층이다. 이게 무슨말인가? 과거에는 운영체제의 커널이 하드웨어를 조작하기 위한 추상적 인터페이스를 제공하였다. System Call이라는 인터페이스가 있어서 하드웨어 I/O를 디바이스 노드에 실행하였다. 하드웨어 종류가 많지 않던 과거에는 이 방법이 나쁘지 않았다. 하지만 하드웨어 종류는 시간이 갈수록 늘어만 갔고 커널은 새로운 장치들을 인식하거나 변화된 상태를 인식하는데 많은 어려움이 따랐다. 그래서 하드웨어 차이에 상관이 없는 하드웨어 인식 방법을 개발하고자 하는 취지로 HAL은 연구되었다. 개발된 HA..

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

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

[ Linux Kernel ] 31. 메모리 맵 파일(mmap)

31. 메모리 맵 파일(mmap) 프로그래밍은 데이터를 입력받아 처리하고 출력하는 작업이고, 이 데이터는 파일로써 디스크에 존재합니다. 내가 만약 '회원명단.csv'란 엑셀 파일을 가지고 여러 데이터 처리 작업을 해야한다고 가정해봅시다. 그렇다면 해당 파일에서 '읽기', '쓰기'를 할 때마다 디스크까지 접근해야할텐데 이러면 속도가 너무 느리지 않을까요? 만약 그 파일이 디스크가 아닌 메모리에 있다면 접근 속도는 엄청나게 향상되지않을까요? 이러한 발상은 최소한의 디스크 접근을 위한 버퍼 입출력에서 한 단계 더 나아간 발상입니다. '버퍼'란 개념이 아닌 디스크-메모리간의 '페이지(page)' 개념을 활용한 방식으로, 프로세스의 가상 메모리 주소 공간에 파일을 매핑한 뒤 가상 메모리 주소에 직접 접근하는 것으..

[ Linux Kernel ] 30. 스트림(Stream)이란?

30. 스트림(Stream)이란? 우리는 프로그램을 실행할 때 키보드를 통해서 입력을하고 모니터를 통해서 출력을 하고 있죠? 우리는 별다른 무리없이 간단하게 입출력을 합니다. 생각을 해보면 키보드에서 입력을 받고, 하드웨어적인 부분을 처리하여야 입력이 되고 화면으로 출력이 되겠죠? 예로 A라는 문자를 눌렀다고 가정해봅시다. 그러면 키보드에서 신호가 나갈 것이고, 그것을 컴퓨터에서 처리하여, 출력장치인 모니터로 신호를 보내 결과적으로 화면에 A라는 문자가 찍힐 것입니다. 그러나, 우리는 이렇게 하드웨어적인 세세한 부분까지 신경을 쓰지 않습니다. 입출력을 도와주는 스트림(Stream)이란 녀석이 있기 때문이죠 스트림을 사용하는 입출력 장치(Input/Output Device)는 많습니다. 키보드나 모니터 뿐..

[ Linux Kernel ] 29. 버퍼 입출력 - 표준 입출력 라이브러리

29. 버퍼 입출력 - 표준 입출력 라이브러리 파일 시스템의 최소 저장 단위는 '블록'이라는 추상 개념입니다. 따라서, 모든 입출력 연산은 블록 크기의 정수배에 맞춰서 일어납니다. 단지 1Byte를 읽고싶다하더라도, 512Byte만큼(1블록 = 512Byte라 가정) 읽어와야한다는 얘기입니다. 또는 내가 단지 2.5블록만큼(대략 1250Byte) '쓰기' 연산을 하고싶다하더라도 3블록에 대해 '쓰기' 연산을 해야한다는 얘기입니다. 그런데 잘 생각해보면 사용자 애플리케이션에서는 512Byte 단위로 입출력 연산이 이루어지지 않는 경우가 대부분입니다. 보통 CSV 파일을 다루기 위해 '필드' 단위의 입출력 연산이 필요하다거나, JSON 파일을 다루기 ..

[ Linux Kernel ] 28. 가상 파일 시스템

프로그래밍을 하다보면 빠지지 않는 것이 파일 처리인데요, 혹시 파일 작업을 하기 위해 read(), write()와 같은 시스템콜을 사용하면서 "왜 매개변수로 어떤 파일 시스템인지 넘겨주지않지?"라고 생각해보신적 있으신가요? 사실 조금만 생각해보면 답이 금방나오는 질문입니다. 이유는 파일 시스템이 추상화되어있기 때문입니다. 구조를 표현하면 다음 그림과 같습니다. 파일 시스템간의 공통된 인터페이스를 둠으로써 얻는 장점은 여러 가지가 있습니다. 동일한 방법으로 접근이 가능하다. 파일 시스템간의 이식성이 좋아진다. 새로운 파일 시스템이 추가되더라도 설계를 변경할 필요가 없다.

[ Linux Kernel ] 27. 다중 입출력 - poll()

27. 다중 입출력 - poll() poll() 시스템콜은 유닉스 운영체제의 최초 상용화 버전 중 하나인 'Unix System V'에서 제공하는 다중 입출력 방식이었습니다. 리눅스에서 제공하고 있던 select() 시스템콜보다 더 좋았던 까닭에 리눅스에서도 poll() 시스템콜을 도입하였습니다. select() 시스템콜의 단점을 보완한 poll() 시스템콜이지만, 기존에 select()로 다중 입출력을 구현했던 개발자의 습관과 타 시스템으로의 이식성을 이유로 덜 사용된다고 합니다. #include int poll(struct pollfd* fds, nfds_t nfds, int timeout); struct pollfd { int fd; // 파일 디스크립터 short events; //..