콘텐츠로 건너뛰기
Home » C

C

Swift 타입으로 변형되는 C 타입들

Swift와 C의 데이터타입 호환
Swift는 기본적인 C 포인터 타입에 대해서는 내부적으로 자동으로 변환을 하게 된다. 예를 들어 const char * 타입의 인자를 받는 함수에는 Swift 문자열을 그대로 넣으면 된다. (이는 해당 C 라이브러리를 import 하는 과정에서 Swift가 C 함수의 인자 타입을 자동으로 변환해준다.) 그 외의 임의 포인터를 사용하는 함수라든지, C 포인터 데이터 타입을 Swift 코드에서 사용해야 하는 경우에는 각 포인터 타입을 Swift 타입으로 사용할 수 있다. 이미 이러한 예는 이전에 다룬 Swift에서 Sqlite 사용하기에서 다루고 있다. 더 보기 »Swift 타입으로 변형되는 C 타입들

Objective-C 래퍼를 통해 Swift에서 SQLite3를 사용하는 법

이 글에서는 Objective-C로 SQLite3 데이터베이스에 액세스하는 API를 래핑한 간단한 클래스를 작성해보겠다. 사실 Objective-C로 SQLite3를 사용하는 것은 C API를 그대로 사용하면 되는 부분인데, 이렇게 래퍼를 만들면 브릿징헤더만 작성해주면 래퍼 클래스를 Swift에서 그대로 사용할 수 있게 되기 때문에 좀 더 쉽게 사용할 수 있다.

Swift에서 C헤더를 바로 반입할 수 있기 때문에 이 방식은 오히려 번거로울 수 있다. (특히 스펙이 약간만 변경되어도 Objective-C 클래스를 수정해야 한다.) 선택은 각자가 알아서 하시면 되겠다.

더 보기 »Objective-C 래퍼를 통해 Swift에서 SQLite3를 사용하는 법

C로 간단한 TODO앱을 구현해보자.

C로 구현하는 간단한 Todo List 관리 앱

구조체 정보를 디스크에 기록하는 부분과 관련하여 두어개의 글을 쓴 적이 있는데, 오늘은 그 최종정리 편으로, C로 구현하는 간단한 TodoList 관리 앱을 만들어보도록 하겠다. 이 앱의 스펙은 다음과 같다.

  1. 각 할일은 구조체의 포인터를 사용, 객체처럼 다룰 수 있게 한다.
  2. 파일에 읽고 쓰는 것은 일련의 데이터 시퀀스를 저장하는 것이므로, 할일 목록 객체를 추가한다. 할일 목록 객체는 100개의 할일을 담을 수 있도록 한다.
    더 보기 »C로 간단한 TODO앱을 구현해보자.

긴 이름의 옵션을 파싱하는 C함수, getopt_long()

긴 이름 옵션 파싱함수

getopt() 함수는 비교적 사용이 쉬운데, 보통 명령행 유틸리티들은 옵션을 보다 명확하게 인지할 수 있는 긴 이름의 옵션들을 지원한다. 예를 들어 출력파일을 결정할 때 -o outfile로 쓰는 대신 --output outfile로 쓰게끔 허용하는 것이다. 이 기능은 getopt_long()이라는 함수를 통해 지원할 수 있다. 긴 이름 옵션은 하나의 문자열에 망라하기 어려우므로 별도의 구조체를 사용하여 옵션 정보를 마련해두고 이 구조체의 배열을 사용하는 방식으로 처리한다. 그러면서 인터페이스는 좀 달라지지만, 사용하는 방식은 거의 유사하다고 보면 된다.
더 보기 »긴 이름의 옵션을 파싱하는 C함수, getopt_long()

C/C++ : 가변 인수 매크로 함수 구현

va_args in c

예전에 가변 인수를 받는 C 함수를 만드는 법을 간단히 살펴본 적이 있는데, 오늘은 좀 더 자세히 알아보자.
C 언어에서 복수 인자를 받는 함수는 다음과 같이 선언한다.

반환형 함수명(고정인자[, 고정인자] ,....);

최소 1개 이상의 고정인자가 있고, 그 이후에 ...을 써서 추가적인 인자를 더 받는다는 것을 알려준다.
더 보기 »C/C++ : 가변 인수 매크로 함수 구현

파일에서 한줄씩 읽어 들이기 – Objective-C

파이썬에서는 텍스트 파일을 가리키는 파일 객체는 파일 내용의 각 라인에 대한 이터레이터처럼 작동한다. 따라서 별다른 노력을 들이지 않고 for … in 구문을 통해서 텍스트 파일의 각 라인을 읽어서 처리하는 것이 가능하다. 이 기능의 멋진 점은 파일 객체가 느긋하게 동작하기 때문에 각 라인이 필요한 시점에 한 라인씩 읽어들인다는 것인데, 따라서 각 라인의 길이가 적절하다면 파일의 크기가 아무리 크더라도 안전하게 읽어들일 수 있다는 것이다. Objective-C에서 텍스트 파일은 보통 NSString의 stringWithContentOfFile: 메소드를 사용한다. 이 메소드의 문제는 파일을 한 번에 읽어들인 다는 점이다. 따라서… 더 보기 »파일에서 한줄씩 읽어 들이기 – Objective-C

GCC 관련 환경 변수

gcc나 clang 같은 컴파일러로 소스를 컴파일할 때, #include <stdio.h> 와 같이 표준 라이브러리 헤더를 반입하거나, 라이브러리 파일을 사용하는 경우에 컴파일러는 이들 파일이 어디에 있는지 어떻게 알 수 있을까? 커맨드라인에서 -I 옵션이나 -L 옵션을 사용해서 직접 지정할 수도 있겠지만, 보통 이렇게 하는 것은 별도의 서드파티 라이브러리나 자신이 직접 만든 라이브러리를 사용할 때 쓰는 방법이다. 컴파일러는 미리 약속된 몇 가지의 환경 변수를 통해서 이러한 경로들을 알게 된다. GCC가 사용하는 몇 가지 환경 변수들을 소개한다. 전체 내용은 이곳에서 확인할 수 있다. CPATH, C_INCLUDE_PATH… 더 보기 »GCC 관련 환경 변수

재귀호출과 피보나치 수열 탐구

재귀호출은 함수가 그 내부에서 자신을 다시 호출하는 것이다. 이는 언뜻 이상하게 보일 수 있고, 경우에 따라서는 의도치 않은 동작을 하게 할 수 있어서 일반적으로는 지양되는 방법이기는 하나, 대신에 코드가 짧아질 수 있고 실행 로직 자체가 어느 정도 제한된 경우라면 충분히 사용할 수 있다. 특히 하스켈과 같은 함수형 언어에서는 반복문을 돌리는 로직이 없기 때문에 재귀호출을 하는 함수를 자주 사용하게 된다. 더 보기 »재귀호출과 피보나치 수열 탐구

한 편으로 이해해보는 포인터(C)

C를 공부하는 많은 사람들이 입버릇처럼 ‘포인터는 어렵다’고 말한다. 기술적으로 포인터는 사실 단순히 메모리상의 주소를 가리키는 정수값일 뿐이다. 그런데 왜 이것이 어려울까? 사실 포인터 자체는 단순하지만, 포인터를 이해하기 까지에는 제법 많은 배경지식이 추가로 필요하기 때문일 것이다. 오늘 이 글에서는 각잡고 포인터를 이해하는데 필요한 내용들을 정리하여 전달하고자 한다.

더 보기 »한 편으로 이해해보는 포인터(C)

[C] 문자열 상수와 문자열 변수의 차이

문자열 상수와 문자열 변수 문자열을 초기화하는 다음 두 가지 방법은 거의 비슷해 보이지만 근본적으로 완전히 다른 동작을 한다. char *s1 = "abcdefg"; char s2[8] = "abcdefg"; 첫번째 s1은 프로그램이 로딩될 때 정적영역에 "abcdefg"를 저장한 다음 이 시작 주소를 s1에 대입한다. 문자열 포인터는 s1에는 나중에 다른 주소의 값을 대입할 수 있다. 즉, s1자체는 변경이 가능한 포인터 변수이지만, 지금 s1이 가리키고 있는 문자열은 문자열 상수이므로 이 문자열을 변경할 수 없다. 반대로 s2는 힙 영역에 메모리를 할당한 후 "abcdefg"를 이곳에 저장했다. 따라서 s2에… 더 보기 »[C] 문자열 상수와 문자열 변수의 차이