이전 글: 2. 함수와 변수에서 계속 배열 선언 int arr[3]; int len = 3; int arr2[len]; int arr3[3] = {1, 2, 3}; int arr4[] = {1, 2, 3}; // 컴파일러에 의해 자동으로 3 삽입 int arr5[5] = {1, 2, 3}; // 나머지 부분은 0으로 채워짐 !! 배열의 크기를 벗어난 인덱스에 접근해도 컴파일 에러가 발생하지 않는다. 컴파일러는 배열 접근에 있어서는 유효성 검사를 진행하지 않기 때문이다. 이 경우, 할당하지 않은 메모리 공간을 침범하게 되므로 반드시 주의해야 한다. int arr[3]; arr[3] = 10; // 컴파일 에러를 발생하지 않는다. 배열의 이름을 대상으로 하는 sizeof 연산의 결과는 '바이트 단위의 배열의..
이전 글: 1. 프로그램의 기본 구성과 기본 자료형에서 계속 printf \ = escape squence 서식문자 %d char, short, int 부호있는 10진수 정수 %ld long 부호있는 10진수 정수 %lld long long %u unsigned int %o unsigned int 8진수 정수 (%#o 로 출력하면 07과 같은 식으로) %x, %X unsigned int 16진수 정수 (%#x 로 출력하면 0x7과 같은 식으로) %f float, double %lf long double %e, %E float, double 10진수 방식의 부동소수점 실수 %g, %G float, double 값에 따라 %f, %e 중 선택 %c char, short, int 값에 대응하는 문자 %s ch..
이전 글: C 프로그래밍 요약 노트에서 계속 프로그래의 기본 구성 int main(void) { return 0; // 정상 종료 코드 0 } 변수와 연산자 '값을 저장할 수 있는 메모리 공간에 붙은 이름, 혹은 메모리 공간 자체를 가리켜 변수라 한다.' int num; int : 정수의 저장이 가능한 메모리 공간을 할당 num : 그리고 메모리 공간의 이름을 num이라 한다. "변수를 선언만 하고 초기화하지 않으면 쓰레기 값지 저장된다." #include int main(void) { int num1; num1=0; int num2; // 컴파일 에러가 발생할 수 있다. 가능하면 선언은 가장 앞쪽에 둔다. num2 =0; } 기본 자료형 int, float 등 자료형을 나눈 것은, 정수냐, 실수냐에 따..
발생일: 2013.01.18 키워드: C, C 언어, C 프로그래밍, C Programming, 열혈강의 C 프로그래밍 문제: 에버노트를 정리하다가, 예전에 열혈강의 C 프로그래밍를 읽으며 작성했던 노트를 발견했다. 다시 읽어보니 전체 내용을 가볍게 훑어보기 좋을 것 같아 따로 정리했다. 해결책: 읽기 편하게, 적당한 단위로 나눠봤다. 그렇지만, 각 챕터의 구분이 명확하지 않을 수 있고, 내용 또한 상세하지 않을 수 있다. 이미 C 언어를 알고 있지만, 가물가물할 때 빠르게 읽어보는 용도로 활용하면 적합할 것 같다. C 프로그래밍 요약 노트 1. 프로그램의 기본 구성과 기본 자료형 2. 함수와 변수 3. 배열과 문자열 4. 포인터와 배열 5. 다차원 배열과 포인터 6. 함수 포인터와 void 포인터 7...
발생일: 2016.04.01 키워드: UIView, tag, 태그 속성, 태그 프로퍼티 문제: 재사용되지 않는 UITableViewCell 에 특정 데이터를 담아뒀다가 꺼내쓰려고 한다. 기존 코드의 구조 상 UITableViewCell 을 상속할 수 없는 상태라서, 다른 방법이 있나 찾아봤더니 UIView 에 tag 라는 프로퍼티가 있다. 여기에 데이터를 담아뒀다가 꺼내쓰면 어떨까? 해결책: UIView 의 tag 프로퍼티에는 특정 뷰를 구분하기 위한 NSInteger 형의 고유값을 할당할 수 있다. 검색해보니, Mike Weller 라는 개발자의 글 중 tag 프로퍼티 활용에 대한 좋은 글이 있고, 나도 동의한다. 저자는 tag 프로퍼티는 뷰를 구분하기 위한 목적으로만 사용해야지, 데이터를 저장하는 용..
발생일: 2016.04.04 키워드: NSAssert, Assertions, NS_BLOCK_ASSERTIONS 문제: NSAssert() 를 실행해도 콘솔에 출력되지 않는다. 해결책: 빌드 설정에 NS_BLOCK_ASSERTIONS 매크로가 설정되어 있었기 때문이다. 빌드 설정에서 매크로를 제외하니 의도한 대로 실행된다. 논의: NS_BLOCK_ASSERTIONS 매크로가 있을 경우, NSAssert() 구문 자체가 실행되지 않으므로 함수 내에서 조건형의 함수를 호출하지 않도록 주의한다. - (void)checkValid { ... self.isValid = YES; } - (void)doSomething { ... NSAssert([self checkValid], @"..."); if (self.is..
발생일: 2016.04.40 키워드: tag, interface builder, 태그 속성, 태그 프로퍼티, viewWithTag 문제: xib 파일에 UIView 의 태그 프로퍼티를 할당하고 코드에서 해당 뷰를 가져오려고 한다. 해결책: Table View Programming Guide for iOS에는 태그를 사용해 테이블셀의 레이블을 설정하는 예제가 있다. 인터페이스 빌더의 Attributes inspector 에서 Tag 항목에 값을 설정해주면 된다. 코드에서는 아래와 같이 viewWithTag: 로 설정한 태그 값으로 가져올 수 있다. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPat..
발생일: 2016.03.22 키워드: AutoLayout, 오토레이아웃, 컨스트레인트, constraint 문제: 구현하려는 뷰는 상황에 따라 보이거나 보이지 않고, 상하 여백 또한 변한다. 처음엔 뷰의 hidden 속성을 NO 로 할당하는 것으로 처리했는데, 숨겨진 이후에도 여전히 높이는 유지되어 있는 것 같다. 어떻게 하면 될까? 해결책: 뷰에 height 컨스트레인트를 준 후, 컨스트레인트의 값을 0으로 설정한다. 이 방법이 가장 컨트롤하기 쉬운 방법으로 보인다. 추가로, - 내가 처리하려던 뷰는 UILabel 이었는데, height 를 0으로 할당할 땐 텍스트의 값도 초기화해줘야 한다. - 컨스트레인트를 업데이트할 때엔 UIView 의 updateConstraints 메서드에서 처리해주는 것이 적..
발생일: 2016.03.23 키워드: UITableViewCell, Selection, selectionStyle 문제: 테이블뷰의 셀 터치 시, 포커스되면서 배경이 회색으로 설정된다. 배경과 동일한 컬러의 View도 보이지 않게 되더라. 포커스된 걸 없애고 싶다. 어떻게 하면 되지? 해결책: UITableViewCell 에 선택되었을 때의 설정을 위한 옵션이 있다. 인터페이스 빌더에서는 아래와 같이 Selection 옵션을 None 으로 설정하면 되고, 코드로 추가하는 경우라면 selectionStyle 옵션을 UITableViewCellSelectionStyleNone 상수로 정의해주면 된다. - (void)awakeFromNib { self.selectionStyle = UITableViewCell..
발생일: 2016.03.23 키워드: UITableViewCell, reuseIdentifier, identifier, NSBundle mainBundle, loadNibNamed, registerNib, forCellWithReuseIdentifier 문제: 코드 리뷰를 받아보니, 내가 테이블뷰셀의 Reuse Identifier 설정을 빼먹었었다. deque 할 땐 정의했었는데 xib 에서 작성하는 걸 누락했는데, 종종 발생하는 실수라고 한다. 해결책: xib 로 테이블뷰셀을 만들고, 아래와 같이 NSBundle 의 loadNibNamed 로 xib를 불러오는 방식으로 구현했다면, - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAt..