콘텐츠로 건너뛰기
Home » Development » Learn C » Page 2

Learn C

C / Programming Language / C프로그래밍 / 포인터 / 변수형 / C언어의 이해 / 개념 / 컴파일러 / C 언어를 공부하고 연습하는데 필요한 모든 지식 / 제발 C언어 마스터하고 어쩌고 그딴 소리 좀 하지마세요 ㅈ나 없어보임

iOS에서 SQLite3 사용하는 방법 (Objective-C)

Swift3 버전에 대한 SQLite3 사용법은 이 포스트를 참고하시라.

예전에 쓴 글이 있기는 하지만, 그냥 요리법처럼 쓴 글이기도 하거니와 소스코드에서 뭔가 글자가 빠지는 등(syntax highlighter를 안써야 겠지만 기존 글 고치기가 귀찮아…) 문제가 많아 내용을 보충해서 다시 작성.
애플은 SQLite3를 직접 인터페이스하는 것보다는 코어데이터를 사용하라고 권장하고 있고, (실제로 있다가 빠진 것인지는 알 수 없으나 그런 주장을 하는 사람들이 종종 있다) 애플 개발자 문서에서도 관련 내용을 내렸다고 한다. (하지만 이는 사실이 아닐 거라 생각한다. 왜냐면 iOS에서 SQLite3를 인터페이스 하는 부분은 전적으로 libsqlite3를 사용하는 것이고, 이에 대한 문서는 SQLite3 홈페이지에 가면 있기 때문이다) 더 보기 »iOS에서 SQLite3 사용하는 방법 (Objective-C)

GCC 관련 환경 변수

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

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

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

[c/objetive-c] 불투명 타입

불투명타입(Opaque Type)

코어 파운데이션 관련 문서를 보면 불투명타입(Opaque Type)이라는 말이 자주 나온다. 코어 파운데이션에서 객체처럼 사용되는 모든 타입들은 불투명타입(CFArrayRef, CFStringRef 등등)이다. "불투명"하다고 해서 감이 쉽게 오지 않는데, 간단히 풀어 쓰자면 "내부의 데이터 구조를 들여다볼 수 없는 타입"이라고 보면 된다.

코코아에서 객체를 만들 때 인스턴스 변수는 기본적으로 protected 나 private으로 만들어지기 때문에 이러한 인스턴스 변수는 객체가 이를 읽거나 쓸 수 있는 메소드(accessor)를 제공하지 않는 이상 객체 속에 어떤 변수들이 있는지 외부에서는 알 수 없다.

더 보기 »[c/objetive-c] 불투명 타입

[Objective-C] NSInvocation 과 Forward

코코아 앱의 Undo/Redo 기능을 구현하는 부분을 보면, NSUndoManager-prepareWithInvocationTarget: 메소드를 사용해서 Undo 동작시에 호출될 메소드를 기록해두는 코드가 있다. 그런데 이 메소드의 원형을 보면 좀 이상한 부분이 있다. 실제로 Undo를 지원하는 기능을 구현하고 있는 간단한 코드를 보자.

-(void) getHigher {
    // undo 관리자에 실행취소를 위한 동작을 등록
    [[undoManager prepareWithInvocationTarget:self] getLower];  
    self.height -= 1.0;
}

-(void) getLower {
    [[undoManager prepareWithInvocationTarget:self] getHigher];
    self.height += 1.0;
}

-prepareWithIvocationTarget: 메소드는 자기자신, 즉 NSUndoManager의 인스턴스를 리턴한다. 그런데 이 되돌리기 관리자에게 getLower 를 호출한다?

더 보기 »[Objective-C] NSInvocation 과 Forward

(C/Objc) 함수 포인터와 코드 블럭

C언어에서 어떤 타입의 배열과 포인터는 다른 것이지만, 흔히들 혼용해서 사용하기도 한다. 이것은 배열의 이름 그자체가 배열의 시작번지를 나타내는 값으로 작동하기 때문이다. 그런데 함수에 대해서도 이와 비슷한 규칙이 성립한다. 프로그램이 실행되는 동안, 프로그램 내의 모든 실행코드들은 메모리에 올라와 있다. 이 말은 즉, 함수가 실행되기 위해서는 해당 함수의 실행코드가 메모리 상에 로드되어 있다는 말이고, 함수의 시작번지를 프로그램은 어떤식으로든 알고 있다는 것이다. 배열의 예와 마찬가지로 함수의 이름은 함수의 실행코드가 로드되어 있는 메모리 주소를 가리킨다. 그렇다면 임의의 T타입 배열의 이름을 T타입 포인터에 대입해서 그… 더 보기 »(C/Objc) 함수 포인터와 코드 블럭

[C/Objective-C] 블럭

Block

Block은 어디다 쓰나

블럭은 작업의 단위(= 코드 조각)을 캡슐화한 객체이고, 언제든 실행할 수 있다. 이는 포터블한 익명의 함수와 같아서 함수나 메소드의 인자로 넘겨지거나 반환될 수 있다. 또한 그 자체로 인자를 받을 수 있고 리턴 타입을 가질 수 있다. 블럭은 변수에 할당한 다음, 일반적인 함수 호출과 같은 방식으로 실행할 수 있다.

더 보기 »[C/Objective-C] 블럭

[Objective-C] 윈도에서 Objective-C 2.0 컴파일하기 (Clang)

Dev-CppGnuStep for win32를 사용하면 윈도 환경에서도 Objective-C 코드를 컴파일 할 수 있다. (GnuStep이 AppKit을 100% 지원하지는 않지만 흠흠..) 그런데 Dev-Cpp에서 사용하는 gcc는 Objective-C 2.0의 문법을 제대로 컴파일하지 못한다.
예를 들면 NSAutoreleasePool 객체를 사용하는 대신 @autoreleasepool{ } 블럭을 사용한다거나, @(23+1)과 같은 리터럴 문법, ^(void){ } 과 같은 코드 블럭은 컴파일 오류를 낸다. gcc 4.5부터인가 Objective-C 2.0을 지원한다고 하는데 MinGW의 최신 버전에서도 제대로 컴파일이 안된다.더 보기 »[Objective-C] 윈도에서 Objective-C 2.0 컴파일하기 (Clang)

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

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

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