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

Learn C

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

난수생성을 위한 조금 더 나은 선택 – arc4random

전통적인 C 함수로 srandom, rand를 이용해서 난수를 생성하는 방법이 있는데, 보다 진보된(?)형태의 함수로 arc4random 함수가 있다. 이 역시 표준 C 라이브러리(libc)에 탑재되어 있다. (GCC 버전 요구사양은 잘 모르겠다.)

u_int32_t arc4random(void);

이 함수는 32비트 범위값 내에서 정수의 형태로 난수를 생성하며, rand(), randome() 함수에 비해 두 배의 범위를 가진다. 게다가 seed 값을 미리 정의해줄 필요도 없다.

더 보기 »난수생성을 위한 조금 더 나은 선택 – arc4random

Swift – Interacting with C Pointers

https://developer.apple.com/swift/blog/?id=6

Objective-C 및 C의 API들은 종종 포인터를 사용한다. Swift의 데이터 타입들은 포인터 기반의 Cocoa API들과 자연스럽게 어울리도록 디자인되었고, Swift는 포인터를 파라미터로 일부 다루고 있다.

포인터와 in/out 파라미터

C와 Objective-C의 함수는 복수의 값을 리턴하지 못하기 때문에 부가정보를 함수 외부로 내보내기 위해서 포인터를 사용한다. Swift는 이런 경우 inout 어트리뷰트를 가진 파라미터를 정의할 수 있어서 Swift에서는 & 문법을 사용하여 var 변수의 포인터를 넘겨줄 수 있다. 예를 들어 UIColorgetRed(_:green:blue:alpha:) 메소드는 4개의 CGFloat* 포인터를 받는데 이는 다음과 같이 사용하여 4개의 변수에 대해 각 컬러 값을 얻어낼 수 있다.더 보기 »Swift – Interacting with C Pointers

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

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

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

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

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

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

iOS 7 : UIDynamic의 이해

iOS 7에서 UIKit 에는 UIDynamic이라는 새로운 기술이 도입되었다. 이는 뷰에 대해 강체 물리(rigid-object physics)를 적용한 애니메이션을 구현할 수 있도록 한다. 뷰가 중력의 영향으로 떨어지거나 다른 뷰에 충돌하는 효과를 표현할 수 있다. 이는 이전에는 매우 복잡한 알고리듬을 적용하여 표현할 수 있었으나, UIDynamicItem은 매우 간단히 구현할 수 있다.
더 보기 »iOS 7 : UIDynamic의 이해

긴 이름의 옵션을 파싱하는 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

[ObjC] 윈도 + GNUStep + Clang 사용시 몇 가지 알아 둘 점

프로퍼티의 backing storage variable을 반드시 명시적으로 선언해야 함 말 그대로, 프로퍼티를 설정할 때 이 값이 담길 인스턴스 변수를 명시적으로 선언해야 한다. 옛날 iOS 관련 책을 보면 그런 식으로 코드가 되어있는데… @interface Person : NSObject { NSString *firstName, *lastName; } @property (copy, nonatomic) NSString *firstName; @property (copy, nonatomic) NSString *lastName; @property (readonly) NSString *fullName; @end iOS4로 넘어오면서 부터인가 변수를 중괄호 안에 선언해 줄 필요가 없어졌다. 이는 Objective-C 런타임이 자동으로 변수를 선언해주기 때문인데, GNUStep의 런타임은 아직 구형이라 변수는 선언해줘야 한다. (컴파일러가 해주는… 더 보기 »[ObjC] 윈도 + GNUStep + Clang 사용시 몇 가지 알아 둘 점