'Objective C/C언어 기능'에 해당되는 글 17건

  1. 2010.07.20 마치기 전에 체크해보자
  2. 2010.07.18 오브젝티브 C가 동작하는 방식
  3. 2010.07.18 공용체(union)
  4. 2010.07.18 typedef
  5. 2010.07.18 복합구조체와 배열
  6. 2010.07.18 전역구조체
  7. 2010.07.18 구조체
  8. 2010.07.18 sizeof
  9. 2010.07.18 Pointer 연산식
  10. 2010.07.18 Pointer and Array
  11. 2010.07.18 복합 구조체
  12. 2010.07.18 Call by value와 Call by reference
  13. 2010.07.18 Pointer와 함수
  14. 2010.07.18 Pointer와 구조체
  15. 2010.07.18 Pointer
  16. 2010.07.18 Function
  17. 2010.07.18 Array
1 컴파일과 인터프리터의 차이점

2 @Class지시어와 #import의 차이점

3 category와 protocol은 무엇인가?

4 멀티쓰레드 프로그램에서 원자성(atomic)과 비원자성(nonatomic)은 무엇인가?

5 autorelease pool의 drain발생 시점은 언제인가?

6 각 클래스의 인스턴스 객체의 소유개념은 무엇인가?

7 왜 클래스가 자신의 객체를 소유해야 하는가?

8 shallow copy와 deep copy는 무엇인가?

9 key - value 코딩은 무엇인가?

10 람다(lambda)에 대한 설명과 활용사례는 무엇인가?


대략 마치기전에 위에 10가지 정도는 다시 생각해 봐야 하지 않을까 싶어서 적어봤습니다.
사실 위에 10문제는 아이폰 경력 개발자 면접시에 제가 자주 질문하는 내용이기도 합니다~ ㅎㅎㅎ
Posted by 정윤수 버터백통

 지금까지 다루어 배열, 구조체, 문자 스트링 상수, 공용체 이들은 객체가 아니다.

 또한 Foundation프레임 워크에서 제공하는 기능, 특히 메모리 할당과 같은 기능을 사용할 없다.

 이는 메모리 활용 관리가 어렵다는 것이다.

 

 ############### 오브젝티브 C 동작하는 방식 ###############

 1) 인스턴스 변수는 구조체에 저장된다.

- 클래스와 그에 속한 인스턴스 변수를 정의하면 변수 들은 구조체에 저장된다.

- 객체는 인스턴스변수로 구성된 구조체이다.

- alloc으로 객체를 생성하면 구조체로 메모리 공간에 예약된다.

 

 2) 객체는 포인터이다.

 - Fraction * myFraction 같이 객체는 포인터이다.

 - myFraction = [Fraction alloc]; 으로 Fraction클래스(구조체) 리턴받아 myFraction 할당한다.(객체 생성)

 - 할당받은 myFraction Fraction 복사체이다

 - 원본과 별개의 메모리공간을 가지고 있으므로 원본 같은 것을 변수로 담고있는 들과 충돌이 나지 않는다.

 

 3) 메서드는 함수이다. 메시지 표현식( [myFraction add] ) 함수 호출이다.

 - 오브젝티브C 구조가 남다르기 때문에 메서드와 함수의 형태가 뚜렷하지만 둘은 같은 구조를 갖는 함수이다.

 - ) 프로그램에서 함수는 일반적인 함수의 형태를 갖고있다그러나 .m 에서의 메서드는 일반적인 함수와 형태가 다르지만 함수이다.

 

 - 메시지 표현식은 함수호출이다. 마찬가지로 다른 언어와 달리 함수 호출의 형태가 독특하며 명칭또한 다르다(메시지 표현) 그러나 함수호출과 같은 기능이다.

 

4) id객체는 포인터이다.

 - id객체는 포인터이므로 데이터 타입이나 객체 자유롭게 할당할 있다.

 

5) 모든 객체에는 꼬리표가 있다

- 모든 객체는 루트에서 상속받은 potected 정의된 isa 멤버(4바이트) 갖는다. 사실상 이것을 통해 객체를 분류하고 식별한다.

 


Posted by 정윤수 버터백통

***공용체(union)

공용체는 구조체와 동일한 구조를 가지고 있다.

공용체는 구조체와 달리 한번에 메모리만 사용가능하다.

- 여러 데이터 타입중 사용할 개를 선택하여 할당받은 메모리 공간을 사용한다.


union data {

int i;

char c;

float f;

};

union data x;

x.i = 10;

x.c = 'a';

x.f = 3.14;

//아래처럼 출력했을 경우 마지막에 선언된 3.14 정상적으로 출력된다.

NSLog(@"x.i=%i", x.i);

NSLog(@"x.c=%c", x.c);

NSLog(@"x.f=%f", x.f);//->정상출력

//각각 별도로 값을 주고 사용하기 때문에 정상적으로 값이 출력된다.

x.i = 10;

NSLog(@"x.i=%i", x.i);

x.c = 'a';

NSLog(@"x.c=%c", x.c);

x.f = 3.14;

NSLog(@"x.f=%f", x.f);



Posted by 정윤수 버터백통

 #### typedef : 프로그램안에서 내가 정의한 데이터 타입

 구조체를 제외한 대부분의 데이터 타입은 시스템에서 제공하는 기본 데이터 타입을 갖는다.

  기본 데이터 타입외에 나만의 데이터 타입을 만들기 위해서 typedef(type define) 사용한다.

 구조체도 데이터 프로토타입을 만들어 나만의 타입을 제공하지만 선언시 앞에 struct 프로토타입 이름을 붙여야 한다.

 typedef 사용하면 구조체에서 선언한 변수명을 데이터 타입으로 사용할 있다.




//date라는 변수명으로 sDate프로토 타입 선언하는 구조체

//구조체에 typedef 사용하여 변수 date 데이터 형으로 설정

typedef struct sDate {

int month;

int day;

int year;

} date;


//INT라는 변수명을 int데이터 형으로 설정

typedef int INT;


int main (int argc, const char * argv[]) {

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];


date today;

today.month = 6;

today.day = 15;

today.year = 2010;

NSLog(@"%i-%i-%i",today.month, today.day, today.year);

INT myInt = 100;

NSLog(@"%i", myInt);

    [pool drain];

    return 0;

}


Posted by 정윤수 버터백통
TAG typedef


복합구조체와 배열

struct date

{

int month;

int day;

int year;

};

struct time

{

int hour;

int minutes;

int seconds;

};

struct date_and_time

{

struct date sdate;

struct time stime;

};

int i=0;

//복합 구조체의 배열 선언

struct date_and_time days[10];

for( i=0; i<10; i++ ){

days[i].sdate.month = i+1;

days[i].sdate.day = (i+1)*3;

days[i].sdate.year = 2010;

days[i].stime.hour = 20;

days[i].stime.minutes = 30 * (i+1);

days[i].stime.seconds = 30 * (i+1) - 60;

NSLog(@"%i-%i-%i %i:%i:%i", days[i].sdate.month, days[i].sdate.day, days[i].sdate.year, days[i].stime.hour, days[i].stime.minutes, days[i].stime.seconds);

}

Posted by 정윤수 버터백통

#import <Foundation/Foundation.h>


//////////////////////날짜 구조체 선언


전역 구조체를 정의

 

struct date

{

int month;

int day;

int year;

};


/////////////////////내일 날짜를 구하는 함수 : 반환 값과 인수가 구조체인 struct date 함수

struct date dateUpdate(struct date today)

{


 구조체를 이용하는 함수는 컴파일러에게 

 미리 함수의 역할(인수와 반환값 ) 대한 

 프로토콜을 정의한다고 알려준다

 

int numberOfDays( struct date d );


struct date tomorrow;

if(  today.day != numberOfDays(today) ){

tomorrow.day = today.day+1;

tomorrow.month = today.month;

tomorrow.year = today.year;

//해의 마지막

}else if( today.month == 12 ){

tomorrow.day = 1;

tomorrow.month = 1;

tomorrow.year = today.year + 1;

//달의 마지막

}else{

tomorrow.day = 1;

tomorrow.month = today.month + 1;

tomorrow.year = today.year;

}

return ( tomorrow );

}



///////////////////////매달 몇일이 있는지 찾는 함수

int numberOfDays( struct date d )

{

BOOL isLeapYear( struct date d );

int answer;

int daysPerMonth[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30 ,31 };

아래 YES, NO int 정의한 define이다.

 

if( isLeapYear (d) == YES && d.month == 2 ){

answer = 29;

}else{

answer = daysPerMonth[ d.month - 1 ];

}

return ( answer );

}


//////////////////////윤년인지 구하는 함수

BOOL isLeapYear( struct date d )

{

if( (d.year % 4 == 0 && d.year % 100 != 0) || d.year % 400 == 0 ){

return YES;

}else{

return NO;

}

}




////////프로그램 부분

int main (int argc, const char * argv[]) {

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

//시세템에게 구조체를 이용한 함수의 프로토콜을 알려준다.

struct date dateUpdatestruct date today);

struct date thisDay, nextDay;

NSLog(@"Enter today's date (mm dd yyyy with out zero : 06 -> 6) :");

scanf("%i%i%i", &thisDay.month, &thisDay.day, &thisDay.year);

nextDay = dateUpdate( thisDay );

NSLog(@"Tomorrow's date is %i-%i-%.2i", nextDay.month, nextDay.day, nextDay.year % 100 );

[pool drain];

    return 0;

}













Posted by 정윤수 버터백통

구조체(structure) 배열과 같이 데이타 그룹을 설정하는 수단이다

배열은 같은 데이터 티입으로만 그룹이 지정되지만 

구조체는 다른 데이터 타입으로도 그룹을 만들 있다.

또한 구조체는 인스턴스 변수처럼 만들어 사용하는 것이 아니라 

프로그램에서 사용할 새로운 데이터 타입을 설정하는 것이다.

따라서 구조체를 설정하고 나면 이를 사용할 변수를 만들어 사용한다.

-- 구조체 선언

새로운 데이터 타입을 생성하는 단계

여기서는 메모리에 할당하지 않는다.

date라는 새로운 데이터는 month day, year 담고있다.

구조체인 경우 마지막 중괄호 닫고 ; 으로 마무리해야 한다.

struct date {

int month;

int day;

int year;

};

-- 변수 선언

구조체로 선언한 새로운 데이터 타입을 사용한다.

실제로 변수가 선언되면 메모리를 할당받는다.

변수 today안에는 month, day, year 포함된다.

struct date today;

-- 변수의 데이터 접근

변수에 포함된 3개의 데이터 속성에 접근하기 위해서는 . 연산자를 사용한다.

today.month = 6;

today.day = 8;

today.year = 2010;

NSLog(@"Today's date is %i / %i / %.2i" , today.month, today.day, today.year % 100 );

Posted by 정윤수 버터백통

sizeof 자료형의 길이를 바이트 단위로 얻을 있다.

가령 int형의 인스턴스를 sizeof 사용하여 구하면

4라는 값을 구한다. 4바이트를 의미한다.

또는 int ary[] = {1,2,3,4,5,6,7,8};

에서 ary 값을 구하면 32바이트라고 있다.

이는 4바이트씩 8개가 들어가므로 32바이트를 할당받은 것이다.


sizeof 역으로 배열의 길이를 있다.

위에 ary 길이를 알아본다면 아래와 같다,

sizeof(ary)/sizeof(int)

이는 배열에 할당된 바이트에 배열원소의 자료형으로 나누면

간단히 배열의 길이를 있다.

구조체배열에서는 자료형이 여러가지 있으므로

까다로운 작업이 있어야 것이다.

 


int sum_ary( int * n_ary, int index )

{

int i, sum=0;

for( i=0; i<index; i++ ){

sum += *(n_ary + i);

}

return sum;

}


int main (int argc, const char * argv[]) {

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

int ary[] = {1,2,3,4,5,6,7,8}; 

int serve_sum;

NSLog(@"sizeof(ary)=%i",sizeof(ary) );

//32 출력 이는 4바이트씩 8개이므로 1바이트씩 32바이트를 출력

//배열 ary 원소구간을 자료형으로 나누면 정확한 배열의 길이를 있다.

NSLog(@"index of array=%d", sizeof(ary)/sizeof(int) );

//8 출력

//길이 8 배열을 4 입력하여 더하므로 36 출력

serve_sum = sum_ary(ary, sizeof(ary)/sizeof(int) );

NSLog(@"sum of array's factors : %d", serve_sum);

[pool drain];

    return 0;

}

Posted by 정윤수 버터백통

 *** 포인터 연산식

1) *(pt + i); 현재 가리키는 위치에서 i번째 위치의 값을 참조

2) *(++pt) 또는 *(pt++) : 현재 가리키는 위치에서 1증가 위치로 포인터가 이동

 

int ary[2] = {1,2};

int * p_ary = ary;

NSLog(@"ary address = %x", &ary);

NSLog(@"p_ary address = %x", p_ary);

//둘다 bffff4f0 출력 배열도 포인터이고 0번째 원소를 가리킨다.

//포인터에 배열(포인터) 대입했으므로 0번째 원소의 주소지가 대입된다.

NSLog(@"ary[0] = %i", ary[0]);

NSLog(@"*(p_ary) = %i", *(p_ary));

//둘다 1 출력

NSLog(@"ary[1] = %i", ary[1]);

NSLog(@"*(p_ary + 1) = %i", *(p_ary + 1));

//둘다 2 출력 : int형이므로 4바이트가 증가한 뒤의 주소지의 값을 참조

//배열도 포인터이기 때문에 다음과 같이 포인터 연산 표현이 가능하다.

NSLog(@"*(ary + 1) = %i", *(ary+1));

//2 출력


Posted by 정윤수 버터백통


 배열은 포인터이고 배열의 이름은 0번째 원소의 주소지를 가리킨다.

 또한 배열의 이름은 언제나 0번째 원소를 가라키는 변경불가능한 상수이다.

 ex) ary[] = {1,2,3,4,5};

ary = &ary[0];//배열의 0번째 주소지를 표현

*ary = 1; //0번째 주소지의 값을 표현

 

 반면 포인터는 언제나 주소지를 변경할 있는 변수이다.

 

    int a[5] = {1,2,3,4,5};

NSLog(@"*a=%i",*a);

int * pa;

pa = a;//또는 pa = &a[0];

NSLog(@"a[0] = %d a[1] = %d a[2] = %d a[3] = %d a[4] = %d",a[0],a[1],a[2],a[3],a[4]);

NSLog(@"pa[0] = %d pa[1] = %d pa[2] = %d pa[3] = %d pa[4] = %d",pa[0],pa[1],pa[2],pa[3],pa[4]);

int b[] = {6,7,8,9,10};

pa = b;

NSLog(@"pa[0] = %d pa[1] = %d pa[2] = %d pa[3] = %d pa[4] = %d",pa[0],pa[1],pa[2],pa[3],pa[4]);

NSLog(@"**************************************************************");

/*

**** 포인터의 연산

1) 포인터가 가리키는 값을 증가 혹은 감소시키는 연산

2) 포인터가 가리키는 대상원소를 증가 또는 감소 : 자료형의 크기만큼 증가한다.

) int 4바이트 만큼 증가

char형도 자료형의 크기만큼 1바이트 증가

double형은 8바이트 만큼 증가

*/ 

int * ptr1;

char * ptr2;

double * ptr3;

NSLog(@"ptr1번지=%d, ptr2번지=%d, ptr3번지=%d, ", ptr1, ptr2, ptr3);

//ptr1번지=0, ptr2번지=0, ptr3번지=0, : 초기값을 주지 않아 전부 0으로 보여진다.

NSLog(@"ptr1번지=%d, ptr2번지=%d, ptr3번지=%d, ", ptr1++, ptr2++, ptr3++);

//ptr1번지=0, ptr2번지=0, ptr3번지=0: 마찬가지로 초기값이 없어 0이지만 증가 값은 다르다

/*

int 4바이트 만큼 증가

char형도 자료형의 크기만큼 1바이트 증가

double형은 8바이트 만큼 증가한 것이다.

*/

//마지막에 null문자인 \0 삽입하여 원소마지막을 알림

char arry[6] = {'K','o','r','e', 'a', '\0'};

char * p_arry = arry;

NSLog(@"memory address = %x", p_arry);

NSLog(@"*p_arry = %c", *p_arry);

//K 출력 : 0번때 우너소의 값을 출력

NSLog(@"*(++p_arry) = %c", *(++p_arry));

//o 출력 : 0번째원소에서 ++ 의해 포인터는 1번째 원소를 가리킴

NSLog(@"*(++p_arry) = %c", *(++p_arry));

//r 출력 : 1번째 원소를 가리키는 ++ 에의해 2번째 원소를 가리킴

NSLog(@"*(p_arry+1) = %c", *(p_arry + 1));

//e 출력 : 2번째 원소(r) 가리키나 + 1 의해 다음 원소의 값을 출력

NSLog(@"*(p_arry+2) = %c", *(p_arry + 2));

//a 출력 : 2번째 원소(r) 가리키나 + 2 의해 4번째 원소의 값을 출력

Posted by 정윤수 버터백통
TAG Array, pointer

/*

구조체안에 구조체를 이룬 복합 구조체 

*/ 

//날짜 구조체 선언

struct date

{

int month;

int day;

int year;

};

//시간 구조체 선언

struct time

{

int hour;

int minutes;

int seconds;

};

//복합 구조체 선언

struct date_and_time

{

struct date sdate;

struct time stime;

};

//복합구조체를 사용할 변수

struct date_and_time today;

today.sdate.month = 6;

today.sdate.day = 9;

today.sdate.year = 2010;

today.stime.hour = 20;

today.stime.minutes = 43;

today.stime.seconds = 28;

NSLog(@"print of today : %i-%i-%i %i:%i:%i", today.sdate.month, today.sdate.day, today.sdate.year, today.stime.hour, today.stime.minutes, today.stime.seconds);

Posted by 정윤수 버터백통



call by value : 함수의 인수값으로 값으로만 넘겨 함수에서 복제되어 사용되나 원래의 변수 값에는 영향이 없다.

call by reference : 인수로 주소지를 넘겨 넘어가는 주소지의 자체를 바꿀 있다.

 

참고) 배열은 복사 없다. 배열 자체가 포인터 이므로 call by reference 형태로 개발되어야 한다.

 




// 값을 바꾸는 함수

void swap_call_by_value (int a, int b) {

//넘어온 인수의 값은 a,b 복사된다.

    int c;

    c = a;

    a = b;

    b = c;

}


// 값을 바꾸는 함수

void swap_call_by_reference (int *a, int *b) {

//넘어온 주소지의 자체를 변경하기 때문에 원본의 값도 바뀐다.

    int c;

    c = *a;

    *a = *b;

    *b = c;

}


int main (int argc, const char * argv[]) {

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];


int i, j;

    i = 1;

    j = 2;

//call by value

//함수 안에서만 값이 사용되고 리턴 되입되지 않아 원본의 값에는 영향을 미치지 않는다.

    swap_call_by_value(i, j);

    printf("%d , %d \n", i, j);

////////////////////////////////////// 초기화

i = 1;

j = 2;

//call by reference

//실제 넘어가는 변수의 주소지가 넘어가고 가공되므로 원본의 변수값도 수정된다.

swap_call_by_reference(&i, &j);

    printf("%d , %d \n", i, j);

    [pool drain];

    return 0;

}

Posted by 정윤수 버터백통

인수값을 포인터로 받는 함수. 실제로 값을 deep copy하여 새로운 연산을 하는 것이 아니고 편의상 함수로 연산 부분을 따로 만들어 제공한다. 개인적으로는 많이 사용하게 된다.


/*

 넘어온 포인터가 가리키는 값을 서로 바꾸어 준다.

*/ 

void exchage( int * pint1, int * pint2 )

{

int temp;

temp = *pint1;

*pint1 = *pint2;

*pint2 = temp;

}



int main (int argc, const char * argv[]) {

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

//좋은 습관을 위해 함수선언부를 프로그램 초반에 설정하여 컴파일러에게 알린다.

int exchage(<#int * pint1#>, <#int * pint2#>);

int a=-10, b=10, * intPa = &a, * intPb = &b;

NSLog(@"a=%i, b=%i, intPa=%i, intPb=%i", a, b, *intPa, *intPb);

//함수에 포인터를 인수로 넘긴다.

exchage(intPa, intPb);

NSLog(@"a=%i, b=%i, intPa=%i, intPb=%i", a, b, *intPa, *intPb);

//함수에 주소지를 넘긴다. 주소지=포인터

exchage(&a, &b);

NSLog(@"a=%i, b=%i, intPa=%i, intPb=%i", a, b, *intPa, *intPb);

[pool drain];

    return 0;

}


Posted by 정윤수 버터백통

struct date {

int month;

int day;

int year;

};

struct date today;

struct date * datePtoday;

datePtoday = &today;

/*

간접 참조 연산자(*)보다 멤버연산자(.) 우선순위 이므로

소괄호를 사용하여 참조연산자 부터 실행하도록 한다.

*/ 

(*datePtoday).month = 6;

(*datePtoday).day = 10;

(*datePtoday).year = 2010;

NSLog(@"%i-%i-%i", today.month, today.day, today.year);

NSLog(@"%i-%i-%i", (*datePtoday).month, (*datePtoday).day, (*datePtoday).year);

//구조체 속성에 접근하는 새로운 방법 ->연산자. -> 통해 주소지에 저장된 값을 참조한다.

datePtoday->month = 7;

datePtoday->day = 25;

datePtoday->year = 2010;

    NSLog(@"%i-%i-%i", datePtoday->month, datePtoday->day, datePtoday->year);


Posted by 정윤수 버터백통


***** 포인터

1 포인터는 메모리의 주소값을 저장하기 위한 4바이트 변수(포인터의 크기가 4바이트인 이유는 32비트 컴퓨터의 주소체계가 32비트(4바이트)이기 때문)이다.

2 포인터 변수도 메모리에 할당된다.

3 & 주소연산자로서 변수의 주소지를 알아낸다.

4 * 메모리에 들어있는 값을 알아낸다.


앞서 scanf("%i" , &num);

경우 scanf뒤에 있는 &num num이라는 변수의 주소지를 담는 포인터를 선언한 것이며 

주소지를 참조하여 값을 간접적으로 저장한 것이다.

(일반 변수에 주소지만 저장하면 4바이트 참조 경로가 아닌 정말 주소지의 값만 저장되므로 나중에 참조 없다.)

 

변수 i 담긴 5 4바이트에 걸쳐 이루어진 값이다.

포인터 pi 담긴 값은 i 주소지의 시작값이고 그로부터 4바이트를 

참조하여 i 값을 알아낼 있다.

int i = 5;

int * pi = &i;

NSLog(@"%d %d", i, &i);

//5 -1073744472

/*

5 : i

-1073744472 : i 주소지

*/ 

NSLog(@"%d %d %d", pi, &pi, *pi);

//-1073744472 -1073744476 5

/*

-1073744472 : i 주소지를 담고있는 pi

-1073744476 : pi 주소지

5 : pi 담긴 주소지를 통해 들어간 i

*/ 

Posted by 정윤수 버터백통
TAG pointer

#import <Foundation/Foundation.h>


//자바와 같은 형태의 함수 선언

void printMessage(void)

{

NSLog(@"Program is fun");

}


int gcd( int u, int v )

{

int temp;

while( v != 0 )

{

temp = u % v;

u = v;

v = temp;

}

return u;

}


//배열을 인수로 받는 함수

int minimum( int value[], int numElements )

{

int minValue, i;

minValue = value[0];

for( i = 1; i < numElements; ++i ){

if( value[i] < minValue ){

minValue = value[i];

}

}

return minValue;

}


int main (int argc, const char * argv[]) {

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];


    //프린트 함수 호출

printMessage();

//최대 공약수 추출 함수

int result;

result = gcd(150, 35 );

NSLog(@"The gcd of 150 and 35 is %i", result);

result = gcd(1026, 405);

NSLog(@"The gcd of 1026 and 405 is %i", result);

NSLog(@"The gcd of 83 and 240 is %i", gcd(83, 240));

//최소값을 추출하는 함수

int testNum[5] = { 3,6,1,7,3 };

NSLog(@"miniNum : %i" , minimum(testNum, 5));

    [pool drain];

    return 0;

}


Posted by 정윤수 버터백통
TAG Function

이번부터 다루는 내용은 프레임워크에서 지원하는 객체가 아닌 C에서 제공하는 내용이다. 오브젝티브C는 C/C++언어(기반)도 지원하므로 좀 더 깊이 있는 코딩을 위해서는 알고 가는것도 좋다.


C하부 객체를 이용하여 배열을 선언한다. 추후 프레임워크에서 제공하는 NSArray객체는 

훨씬 다루기 쉽고 편하게 설계된 객체이다

C에서 제공하는 배열은 객체에 [] 사용하여 배열의 길이를 정하고

해당 객체 타입만을 담을 있다.

 

한번 정해진 배열의 길이는 런타임 확장이 불가능 하다.

만약 확장한다면 가끔 정확히 값이 들어가지만 대부분 값이 잘못 들어가게 된다.

따라서 런타임 초기화 하고 싶으면 [] 값을 다시 초기화 하면 된다.

 

배열의 길이를 정하지 않고 {} 사용하여 초기화 하면 자동으로 배열의 길이가 정해진다.

//길이 10개의 int 담을 있는 배열을 선언

int intAry[10];

int i=0;

for( i=0; i<10; i++ ){

intAry[ i ] = i*2;

}

for( i=0; i<10; i++ ){

NSLog(@"intAry[%i] = %i" , i, intAry[i] );

}

//길이 5개인 char 배열생성 초기화(설정)

char letters[5] = {'a','b','c','d','e'};

for( i=0; i<10; i++ ){

NSLog(@"letters[%i] = %c" , i, letters[i] );

}

//////배열 크기 확장

letters[10];

for( i=5; i<10; i++ ){

letters[ i ] = letters[ i-5 ];

}

for( i=0; i<10; i++ ){

NSLog(@"letters[%i] = %c" , i, letters[i] );

}

//배열길이 무작위 초기화

float floatAry[] = { [7] = 5.7 , [4] = 10.3, [12] = 55.2 };

for( i=0; i<13; i++ ){

NSLog(@"floatAry[%i] = %f" , i, floatAry[i] );

}

//{} 다라 설정된 배열의 길이

char word[] = {'H','e','l', 'l', 'o', '!'};

NSLog(@"word : %s",word);

for( i=0; i<6; i++ ){

NSLog(@"word[%i] = %c" , i, word[i] );

}

//null값인 \0 대입하여 문자열을 만듬

char word2[] = {'H','e','l', 'l', 'o', '!', '\0'};

NSLog(@"word2 : %s",word2);

/////2차원 배열 설정 : 배열의 길이와 초기화

int int2DepthAry[3][5] = {

{1,3,5,7,9},

{12,56,89,34,67},

{4,13,5,32,24}

};

int j = 0;

for(i=0; i<3; i++){

for(j=0; j<5; j++){

NSLog(@"int2DepthAry[%i][%i] : %i", i , j , int2DepthAry[i][j]);

}

}

/////2차원 배열 불규칙 설정 : 선언되지 않은 곳은 0으로 초기화, 문자 배열은 ''으로 초기화

int int2DepthAryB[3][6] = {

{1,3,5,7},

{12,56,89,34,6,38},

{[0]=5, [4]=32, [5]=24}

};

for(i=0; i<3; i++){

for(j=0; j<6; j++){

NSLog(@"int2DepthAryB[%i][%i] : %i", i , j , int2DepthAryB[i][j]);

}

}

Posted by 정윤수 버터백통