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

Learn C

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

[C] 파일을 쪼개어 프로그램을 만들기

C는 언뜻 작은 프로그램을 만드는 데 적합해 보이는 언어이나, 실제로 많은 운영체제 혹은 프로그래밍 언어 등의 대규모 프로젝트가 “이식성”을 이유로 C로 만들어진다. 우리가 예제가 가득한 C 책에서 나 보는 것과는 달리, C프로그램은 실제로 여러 개의 파일로 나뉘어져서 만들어질 수 있고 한꺼번에 컴파일 되는 대신, 새롭게 업데이트된 부분만 컴파일해서 새로운 버전의 프로그램을 만드는 것이 가능하다. 어떤 계산 프로그램을 만들 때 특정 분야의 계산 로직을 다른 모듈로 구분했다고 하자. 대략적인 프로젝트의 구조는 다음과 같다. cal.c 는 계산기의 본체(main 함수가 있는)이고 hfcal.c 파일은… 더 보기 »[C] 파일을 쪼개어 프로그램을 만들기

Deep Copy

copy나 mutableCopy를 사용하면 객체의 사본을 만들 수 있다. 이는 같은 데이터를 가리키지 않고 별도의 할당된 메모리에 데이터를 복사하여 또 하나의 할당된 객체를 만들어주는 메소드이다. 통상 NSCopying 프로토콜을 따르면 복사가 가능하고, 그 중 변경이 가능한 mutable한 객체들은 mutableCopy를 제공한다. 문제는 어떤 객체가 다른 객체를 가리키고 있는 경우에는 포인터만 복사된다는 것이다. 예를 들어서 NSArray나 NSDictionary의 경우, 배열이나 사전 객체를 복사하면 하나의 사전, 배열이 추가로 생성되는 것은 맞다. 하지만 배열의 모든 원소는 원본 배열의 원소와 같은 포인터가 복사되는 것으로, 배열 그 자체는 사본이지만,… 더 보기 »Deep Copy

[Obj-C] NSObject 없이 새로운 객체를 만들기

Objective-C는 C의 수퍼셋(상위집합)이다. 따라서 Objective-C의 ‘이상하게 보이는 문법’을 제외하면 온전히 C코드만으로도 프로그램을 작성하는 것은 가능하며, 컴파일도 된다. 물론 이게 C 프로그램하고 다르냐면 그건 또 아니라고 하겠다만.

어쨌거나 현재 Objective-C가 널리 사용되고 있는 플랫폼은 애플의 OSX와 iOS 밖에 없다고 해도 과언은 아니다. 이 말은 곳 Cocoa(코코아는 Foundation과 Webkit 프레임워크의 합집합이다)가 곧 Objective-C의 기본 라이브러리와 거의 같다는 말이다. 특히 Foundation이 그렇다. Foundation에는 그 유명한 NSObject가 정의되어 있고, 실질적으로 프로그래머가 만들거나 혹은 이용하는 모든 클래스는 NSObject로부터 상속받은 객체들이다. (여기에는 예외가 하나 있는데, NSProxy 클래스는 NSObject로부터 상속받지 않는다.) 결국 NSObject 없는 Objective-C는 있을 수 없는 것인가?더 보기 »[Obj-C] NSObject 없이 새로운 객체를 만들기

[C] 동적으로 할당한 메모리 영역의 크기를 나중에 알 수 있게 하기

동적으로 할당받은 메모리의 크기를 구하기

sizeof 함수는 (정확히는 매크로 함수) 타입의 크기를 반환한다. 배열 이름은 배열의 시작번지를 나타내므로 포인터와 거의 동일하게 취급되고, 또 많은 서적에서 이 둘을 같은 것이라고 말하는데, 사실은 다르다. sizeof() 함수는 배열을 인자로 넣으면 배열의 크기를 알려준다. 따라서 배열의 요소의 개수는 sizeof(intArr) / sizeof(int)와 같은 식으로 구할 수 있다.
이와 반대로 동적으로 메모리를 할당받는 malloc 류의 함수는 포인터를 반환한다. 포인터는 unsigned long int형으로 시스템에 따라 4혹은 8바이트의 크기가 된다. 따라서 배열을 동적으로 할당하기 위해 메모리 할당 함수를 사용하면 sizeof(포인터이름)은 포인터의 크기를 반환하므로 배열의 요소의 개수를 알아낼 수가 없다.
사실 이미 메모리를 할당하는 시점에, 크기를 지정해 주었으므로 그 영역의 크기는 알고 있는 상황이지만 이 값을 변수에 담아서 계속 들고다니기란 조금 귀찮다. 여기서는 배열을 할당할 시에 그 크기를 나중에 알 수 있도록 하는 꼼수를 소개한다.더 보기 »[C] 동적으로 할당한 메모리 영역의 크기를 나중에 알 수 있게 하기

[C] 함수로 전달된 포인터

포인터를 함수의 인자로 받는 경우, 함수내에서 원본을 변경하는가. 내용이 너무 두서 없어서 포스트 전체를 수정합니다. 처음 의문이 든 부분은, 문자열을 가리키는 포인터를 함수로 넘겨주고 문자열을 변형하면 포인터의 값이 변하는가?라는것이었는데. 이는 사실 그리 어려운 문제가 아니다. 포인터는 메모리의 주소를 가리키는 타입의 변수이고 이는 사실 unsigned int 나 unsinged int64 등의 정수형과 비슷하게 숫자를(메모리 번지도 결국 숫자값이므로) 담는 변수이다. 그리고 함수에 선언된 인자는 함수 내부에서만 사용하는 지역변수이고, 표준 타입의 변수를 함수에 전달하면 그 값이 인자로 선언한 변수에 들어가는데, 이건 그냥 변수의 값이… 더 보기 »[C] 함수로 전달된 포인터

[Cocoa / Objective-C] NSString의 문자열 뒤집기, 글자를 정렬한 문자열 구하기.

프레임워크에 당연히 있는 기능일 줄 알았는데 없더라… 그래서 자작. 짤막한 설명 문자열 뒤집기는 C문자열로 바꾼다음 포인터를 쓰는게 제일 깔끔할 것 같아서 그렇게 했다. -UTF8String 메소드는 const char 타입 포인터를 리턴하는데, 이걸 char 형으로 강제캐스팅하는 게 찜찜해서 strcpy로 복사했는데, 어디서 이 함수도 상당히 나쁘다고 쓰지 말라더라. (다른 뭐를 쓰라던데 그게 기억이 안나서 그냥 씀) malloc으로 할당한 메모리는 ARC의 관심밖이므로 철저히 free 해주는 나란 남자, 그런 남자… 문자열내 문자들을 사전순으로 정렬해주는 건 소인수 분해 따위나 할 때 쓸모가 있긴 있을텐데,  NSArray의 sortedUsingComparator:… 더 보기 »[Cocoa / Objective-C] NSString의 문자열 뒤집기, 글자를 정렬한 문자열 구하기.

C에서의 문자열 배열과 문자열 배열을 동적으로 할당하기

문자열의 배열을 2차원배열을 쓸 때의 문제점

C언어는 문자열을 다루는 자료형이 없다. 대신에  C에서 문자열은 널 문자로 끝나는 문자(char) 타입의 배열을 사용하여 저장한다.  만약 일련의 문자열 집합을 다루려면 문자열의 배열을 써야 할테다.  여러 개의 문자열을 배열에 담고 싶다면 이차원 배열을 쓰는 방법을 생각할 수 있는데,  이 경우 크기가 일정하게 고정된 영역을 여러 개 생성해야 하고, 만약 각 문자열의 길이가 제각각 다르다면 불필요하게 낭비되는 메모리가 제법 될 수 있다.

2차원 배열의 문자열 배열

2차원 배열을 사용하여 구성한 문자열 배열


메모리를 비롯하여, 부족한 하드웨어 자원을 알뜰 살뜰 아껴서 최대의 성능을 내기 위해 개발된 초기 C언어 관점에서 이러한 2차원 배열의 사용은 그리 추천하지 않는다.더 보기 »C에서의 문자열 배열과 문자열 배열을 동적으로 할당하기

[C] conio.h에 대해

conio.h 는 MS-DOS용 C컴파일러에 포함되어 있는 헤더파일로, 표준 C 라이브러리에는 포함되지 않고 있다. (따라서 여기서 정의한 함수를 표준 함수처럼 쓰면 다른 플랫폼에서는 심벌이 없다고 컴파일 되지 않는다.) 이 헤더에는 콘솔 입출력과 관련된 함수들이 정의되어 있다. 멤버 함수들 kbhit – 키보드가 눌려졌는지 확인 getch – 콘솔에서 버퍼나 에코(타이핑한 키가 화면에 표시)없이 한 개의 키 값을 입력 받음 getche – 콘솔에서 키보드 입력으로 한 개의 키 입력을 받음. 에코됨. ungetch – 키보드 버퍼로 문자 1개를 넣음 cgets – 콘솔로부터 문자열을 직접 입력… 더 보기 »[C] conio.h에 대해