본문 바로가기
  • 그냥 하자
iOS

Chap5-1. NSMutableArray, NSArray, 배열의생성과요소접근, 배열, NSMutableData, NSData, NSMutableString, NSString, NSValue, NSNumber

by Mash 2012. 3. 26.
반응형

이 글은 아래의 출처를 수정하여 작성한 글 임을 밝힌다. 
<출처 : http://wwwww.kr/30792>


일반 value형 변수 -> 객체
NSNumber * num1 = [NSNumber numberWithInt : 100]; // autorelease이기 때문에 이대로 놔두면 알아서 소멸됨
NSNumber * num2 = [[NSNumber alloc] initWithInt : 100]; //alloc이면 release를 사용자가 해야 함

int a = [num1 IntegerValue]; //정수를 가져올 때

[num2 release]; //이렇게 나중에 릴리즈 해줘야 함
[num1 compare:num2]; //값을 비교해 줌
작으면 NS
같으면 NSOrder
크면 NSOrderDecending

== : value형에서는 value비교, 참조형에서는 id비교

 


NSNumber 클래스 클러스터
- 기본 데이터 타입을 저장할 수 있는 클래스입니다.
- NSArray 같은 데이터를 저장하는 배열은 값들이 모두 객체이어야만 합니다.
이런 경우 기본 데이터 타입의 변수들은 저장할 수 없습니다.
이런 경우에 사용할 수 있는 클래스가 NSNumber 클래스입니다.
생성할 때는 numberWith자료형 메서드를 이용하고 초기화할 때는 initWith자료형(alloc이 먼저 나와야 함) 메서드를 이용합니다. 
- 값을 가져올 때는 자료형value 메서드가 있습니다.
- 문자열로 값을 리턴하는 stringValue 메서드도 존재합니다.
- 값을 비교 해서 리턴해주는 compare: 메서드와 값이 동일한 지 확인할 수 있는 isEqualTo:와 같은 메서드가 존재합니다.

01.#import <Foundation/Foundation.h>
02.int main(int argc, char *argv[])
03.{
04.NSAutoreleasePool *pool = [NSAutoreleasePool new];
05.NSNumber *objNum;
06.NSInteger n;
07.// numberWithInt를 이용해서 100이라는 값을 갖는 NSNumber객체를 생성
08.// alloc이나 copy가 아니므로 autorelease된 객체를 가리키게 됩니다.
09.objNum = [NSNumber numberWithInt:100]; //autorelease된 객체. 비추
10.// 객체에서 정수 값을 리턴받아서 n에 대입
11.n = [objNum integerValue];
12.NSLog(@"n:%i",n); // n값을 출력
13.objNum = nil; //objNum을 다 쓰면 nil
14.// alloc과 init을 이용해서 생성 - 반드시 프로그래머가 release
15.objNum = [[NSNumber alloc]initWithDouble:0.7]; //alloc 한 것은 원하는 시점에 release가능. 추천
16.NSLog(@"실수 데이터:%f", [objNum doubleValue]);
17.[objNum release];
18.[pool drain];
19.return 0;
20.}

결과
2010-11-10 09:42:31.437 Test[535:a0f] n:100
2010-11-10 09:42:31.439 Test[535:a0f] 실수 데이터:0.700000

 

NSValue
- 구조체를 객체화 시켜주는 클래스
- NSNumber와 비슷해보이고 보통 활용가치가 높지 않음
- 특정한 구조체들에 대한 정의를 가진 클래스 클러스터
- NSPoint: 좌표 구조체(x, y로 구성)
- NSSize: 크기 구조체(width와 height로 구성)
- NSRect: 사각 영역 구조체(NSPoint origin과 NSSize size로 구성)
- NSRange:범위 구조체(NSUInteger location과 NSUInteger length로 구성) - 검색 시 위치와 길이를 가져옴
- valueWith구조체이름 으로 생성하고 initWith구조체이름 으로 초기화
- 구조체이름Value로 구조체의 값을 리턴합니다.

01.#import <Foundation/Foundation.h>
02.int main(int argc, char *argv[])
03.{
04.NSAutoreleasePool *pool = [NSAutoreleasePool new];
05.NSPoint location = {100, 200};
06.NSValue * value = [NSValue valueWithPoint:location]; //location을 NSValue로 만듬.
07.NSLog(@"x좌표:%f y좌표:%f", location.x, location.y);
08.NSLog(@"x좌표:%f y좌표:%f", [value pointValue].x, [value pointValue].y); //객체에서 얻어온 좌표
09.[pool drain];
10.return 0;
11.}

결과
2010-11-10 09:46:57.313 Test[616:a0f] x좌표:100.000000 y좌표:200.000000
2010-11-10 09:46:57.315 Test[616:a0f] x좌표:100.000000 y좌표:200.000000

 
NSString
- C언어의 문자열은 char를 기준으로 한 ASCII 문자열입니다.
- Objective-C언어의 문자열 클래스가 제공하는 문자열은 unichar 유니코드 표준에 따른 멀티바이트 문자
- 유니코드를 나타낼 때 @를 붙여서 표현합니다.

 

1. String 클래스의 종류
- NSString: 내용을 변경할 수 없는 문자열 클래스
- NSMutableString: 내용을 변경할 수 있는 문자열 클래스
NSString 객체에 문자열을 대입할 때는 문자열 상수의 경우 일반 value형 변수처럼 직접 대입이 가능하며 리턴도 가능합니다.
- 출력할 때 %s를 사용하면 안됩니다. -> %s는 NULL을 만날때까지 출력하므로.
ex) %s, @"abcd" => 시작하자마자 NULL을 만남.
- %s를 사용하게 되면 주어진 주소부터 ascii 문자(8비트) 단위로 읽어서 null을 만날 때까지 문자열을 출력하므로 이상한 문자열을 출력하게 될 것입니다. 이 때는 %@를 이용해서 출력해야 합니다.
- %@를 이용하게 되면 지정된 인스턴스에 description 메시지를 전송하여 그 메시지의 수행 결과를 리턴 받아서 출력하게 됩니다.

01.#import <Foundation/Foundation.h>
02.int main (int argc, const char * argv[])
03.{
04.NSAutoreleasePool *pool = [NSAutoreleasePool new];
05.NSString *str = @"Programing is fun";
06.//유니코드를 %s를 이용해서 출력하게 되면 첫번째 바이트가 00(NULL)일 가능성이 있어서
07.//출력되지 않을 가능성이 있다.
08.NSLog(@"C Style:%s", str); // %s로 출력
09.NSLog(@"Objective-C:%@", str); // %@으로 출력
10.[pool drain];
11.return 0;
12.}

결과
2010-11-10 09:55:33.572 Test[730:a0f] C Style:
2010-11-10 09:55:33.574 Test[730:a0f] Objective-C:Programing is fun


2. NSString 의 인스턴스 생성과 문자 코드 변환
+(id) stringWithString:(NSString *)nsstring : NSString으로 인스턴스를 생성해서 리턴

-(id) initWithString:(NSString *)nsstring : NSString으로 초기화(alloc)

-(NSUInteger)length : 문자의 개수 리턴

-(id) initWithUTF8String:(const char *)bytes : 널 문자로 끝나는 형식의 C언어 문자열에서 정보를 복사한 후 초기화
 const char : c 문자열(UTF8String)

-(const char *)UTF8String : C언어 문자열을 가리키는 포인터를 리턴
 C문자열로 리턴

01.int main(int argc, char *argv[])
02.{
03.NSAutoreleasePool *pool = [NSAutoreleasePool new];
04.NSString * str1 = [[NSString alloc] initWithString:@"Hello"];
05.NSLog(@"%@", str1);
06.NSString * str2 = [[NSString alloc] initWithUTF8String:"Hello"]; //@을 안붙이고.
07.NSLog(@"%s", [str2 UTF8String]); //%s로 출력하기 위해서는 C문자열로 출력해야 함
08.[str1 release];
09.[str2 release];
10.[pool drain];
11.return 0;
12.}

결과
2010-11-10 09:58:34.569 Test[768:a0f] Hello
2010-11-10 09:58:34.571 Test[768:a0f] Hello
 
 3. NSString의 내용 변경
기본적으로는 내용이 변경되지 않습니다.
내용을 변경하게 되면 메모리를 다시 할당받아서 사용하게 됩니다.
예제)

01.#import <Foundation/Foundation.h>
02.int main(int argc, char *argv[])
03.{
04.NSAutoreleasePool *pool = [NSAutoreleasePool new];
05.NSString *str = @"안녕하세요.";
06.NSLog(@"str의 현재 주소:%d",str);
07.str = @"Hello";
08.NSLog(@"str의 현재 주소:%d",str);
09.[pool drain];
10.return 0;
11.}

결과
2010-11-10 10:04:18.861 Test[837:a0f] str의 현재 주소:4176
2010-11-10 10:04:18.863 Test[837:a0f] str의 현재 주소:4240

 

 
-(NSString *)stringByAppendingString: (NSString *)nsstring : nsstring을 호출하는 인스턴스에 결합
NSString * str = @"Hello";
[str stringByAppendingString = @"World"];
NSLog (@"%@",str); // Hello 만 출력
string * temp = [str stringByAppendingString : @"World"];
[str release];
str = [temp retain];
[temp release];
NSLog (@"%@",str); // Hello 만 출력
str = [str stringByAppendingString = @"World"];
NSLog (@"%@",str); // Hello World 출력
[str release];

 

-(BOOL)isEqualToString: (NSString *)nsstring : 문자열의 값이 같은지 여부를 리턴
-(NSComparisonResult) compare: (NSString *)nsstring : 크기 비교를 해서 NSComparisonResult로 리턴 - 대소문자 구별
 (NSComparisonResult)caseInsensitiveCompare:(NSString *)aString : 크기 비교를 해서 NSComparisonResult로 리턴 - 대소문자 구별하지 않음
-(NSString *)uppercaseString : 대문자로 변환해서 리턴
-(NSString *)lowercaseString : 소문자로 변환해서 리턴
+(NSString *)stringWithFormat@”서식”, 데이터 나열 : 서식에 맞추어(데이터를 대입하고) 문자열을 리턴 (메모리로 내보냄)
 cf. NSLog:콘솔로 내보냄

1.CGPoint pt = {100,200};
2.NSLog(@"x좌표 : %f, y좌표 : %f",pt.x,pt.y); // 출력안됨
3.NSString *msg = [NSString stringWithFormat:@"x좌표 : %f, y좌표 : %f",pt.x,pt.y];

결과 : x좌표 : 100, y좌표 : 200

 

01.#import <Foundation/Foundation.h>
02.int main()
03.{
04.NSAutoreleasePool * pool = [[NSAutoreleasePool alloc]init];
05.int a =10;
06.float f = 10.7;
07.NSString *str = @"Hello World";
08.NSString *msg = [NSString stringWithFormat:@"\n정수:%d\n실수:%f\n문자열%@",a,f,str];
09.NSLog(@"%@",msg); //msg출력
10.[pool drain];
11.return 0;
12.}

결과
2010-11-10 10:07:29.859 Test[895:a0f] 
정수:10
실수:10.700000
문자열Hello World
  
4. NSMutableString 클래스 // 리터을 하지 않는다.
NSString으로부터 상속받아서 만들어지며 추가 및 삽입 및 삭제 등의 메서드가 추가되어 있습니다.
문자열의 내용을 변경할 수 있는 클래스
이 클래스의 인스턴스는 문자열의 내용이 변경되도 주소가 변경되지 않습니다.
+ stringWithCapacity: // 초기 사이즈를 정함 (속도 문제 때문에)
- initWithCapacity:
- appendFormat:
- appendString: //글자 추가
- deleteCharactersInRange: //Range에 있는 문자열 지움
- insertString:atIndex: // index에 문자열 추가
- replaceCharactersInRange:withString: // 바꿈
- replaceOccurrencesOfString:withString:options:range: // 바꿈
- setString: //이전내용을 지우고 바꿈
 
 

01.#import <Foundation/Foundation.h>
02.int main(int argc, char *argv[])
03.{
04.NSAutoreleasePool *pool = [NSAutoreleasePool new];
05.NSString *str1 = @"안녕하세요 반갑습니다.";
06.NSString *search, *replace;
07.NSMutableString *mstr;
08.NSRange substr;
09.mstr = [NSMutableString stringWithString: str1];
10.NSLog(@"%@", mstr); // 안녕하세요 반갑습니다.
11.[mstr insertString:@" 홍길동님" atIndex: 5]; //5자 앞에 홍길동님 을 출력
12.NSLog(@"%@", mstr);
13.[mstr insertString:@" 환영합니다." atIndex: [mstr length]]; // 15번째에 환영합니다. 를 집어넣음
14.NSLog(@"%@", mstr);
15.[mstr appendString: @" 어서오세요"]; //맨 뒤에다 어서오세요 를 붙임
16.NSLog(@"%@", mstr);
17.[mstr deleteCharactersInRange:NSMakeRange(10,6)]; // 10번째부터 6개를 지운다.
18.NSLog(@"%@", mstr);
19.substr =[ mstr rangeOfString: @" 환영합니다."]; // 환영합니다를 찾아서
20.if (substr.location != NSNotFound) //못찾은게 아니라면
21.{
22.[mstr deleteCharactersInRange: substr]; //찾은걸 삭제해라
23.NSLog(@"%@", mstr);
24.}
25.[mstr setString: @"Hello World"];
26.NSLog(@"%@", mstr);
27.[mstr replaceCharactersInRange:NSMakeRange(5,6) withString: @" mutable string"]; // 5번째부터 6글자를 mutable string으로 대체
28.NSLog(@"%@", mstr);
29.search = @" mutable";
30.replace = @" example";
31.substr = [mstr rangeOfString: search]; //search를 찾아라
32.if ( substr.location != NSNotFound)
33.{
34.[mstr replaceCharactersInRange: substr withString: replace]; //mutable을 example로 바꾸자
35.NSLog(@"%@", mstr);
36.}
37.search = @"a"//a자를 찾아서
38.replace = @"X"//X자로 바꿔라.
39.substr = [mstr rangeOfString: search];
40.while (substr.location != NSNotFound)
41.{
42.[mstr replaceCharactersInRange: substr withString: replace];
43.substr = [ mstr rangeOfString: search];
44.}
45.NSLog(@"%@", mstr);
46.[pool drain];
47.return 0;
48.}

결과
2010-11-10 10:24:54.559 Test[1026:a0f] 안녕하세요 반갑습니다.
2010-11-10 10:24:54.561 Test[1026:a0f] 안녕하세요 홍길동님 반갑습니다.
2010-11-10 10:24:54.566 Test[1026:a0f] 안녕하세요 홍길동님 반갑습니다. 환영합니다.
2010-11-10 10:24:54.566 Test[1026:a0f] 안녕하세요 홍길동님 반갑습니다. 환영합니다. 어서오세요
2010-11-10 10:24:54.568 Test[1026:a0f] 안녕하세요 홍길동님. 환영합니다. 어서오세요
2010-11-10 10:24:54.569 Test[1026:a0f] 안녕하세요 홍길동님. 어서오세요
2010-11-10 10:24:54.571 Test[1026:a0f] Hello World
2010-11-10 10:24:54.572 Test[1026:a0f] Hello mutable string
2010-11-10 10:24:54.572 Test[1026:a0f] Hello example string
2010-11-10 10:24:54.572 Test[1026:a0f] Hello exXmple string   
 
 
NSData
- NSData 클래스는 바이트 배열을 다루는 클래스입니다.
- 파일 입출력이나 네트워크에서는 문자열을 바이트 단위로 사용해야 하는 경우가 있습니다.
- 이러한 경우 NSString 만으로 모든 처리를 할 수는 없습니다.
- 이런 경우 사용되는 클래스가 NSData 클래스입니다.

- (id)dataWithBytes:(const void *)bytes (NSUInteger)length : length 만큼 바이트를 할당해서 메모리를 할당
- (id)initWithBytes:(const void *)bytes length:(NSUInteger)length : bytes가 지정한 위치부터 length까지로 초기화
- (id)dataWithData:(NSData *)aData : aData를 복사해서 메모리를 할당
- (id)initWithData:(NSData *)aData : aData의 내용으로 초기화해서 리턴
- (NSUInteger)length : 길이를 리턴
- (const void *)bytes : 포인터를 리턴
- (NSString *)description : 문자열로 리턴
 

01.#import <Foundation/Foundation.h>
02.int main(int argc, char *argv[])
03.{
04.NSAutoreleasePool *pool = [NSAutoreleasePool new];
05.unsigned char buf[20];
06.NSString *message = @"Test Conversion";
07.const char *str = [message UTF8String];
08.NSData *myData = [NSData dataWithBytes: str length:strlen(str)];
09.[myData getBytes:buf];
10.int i;
11.for(i=0; i<[myData length]; i++)
12.{
13.NSLog(@"%c", buf[i]);
14.}
15.[pool drain];
16.return 0;
17.}

결과
2010-11-10 10:42:01.337 Test[1126:a0f] T
2010-11-10 10:42:01.339 Test[1126:a0f] e
2010-11-10 10:42:01.339 Test[1126:a0f] s
2010-11-10 10:42:01.340 Test[1126:a0f] t
2010-11-10 10:42:01.342 Test[1126:a0f]  
2010-11-10 10:42:01.342 Test[1126:a0f] C
2010-11-10 10:42:01.343 Test[1126:a0f] o
2010-11-10 10:42:01.343 Test[1126:a0f] n
2010-11-10 10:42:01.344 Test[1126:a0f] v
2010-11-10 10:42:01.344 Test[1126:a0f] e
2010-11-10 10:42:01.344 Test[1126:a0f] r
2010-11-10 10:42:01.345 Test[1126:a0f] s
2010-11-10 10:42:01.345 Test[1126:a0f] i
2010-11-10 10:42:01.345 Test[1126:a0f] o
2010-11-10 10:42:01.346 Test[1126:a0f] n
 
 

01.#import <Foundation/Foundation.h>
02.int main(int argc, char *argv[])
03.{
04.NSAutoreleasePool *pool = [NSAutoreleasePool new];
05.NSString *message = @"Test Conversion";
06.const char *str = [message UTF8String];
07.NSData *myData = [NSData dataWithBytes: str length:strlen(str)];
08.NSLog(@"myData:%@",myData); //myData를 아스키코드로 출력
09.[pool drain];
10.return 0;
11.}

결과
2010-11-10 10:46:04.114 Test[1294:a0f] myData:<54657374 20436f6e 76657273 696f6e>

 

 

NSMutableData

01.#import <Foundation/Foundation.h>
02.int main (int argc, const char * argv[])
03.{
04.NSAutoreleasePool *pool = [NSAutoreleasePool new];
05.NSMutableData *myData = [NSMutableData data];
06.char bytes[] = "Hello MutableData";
07.NSData *data = [NSData dataWithBytes:bytes length:15];
08.[myData appendData:data]; //NSMutableData에는 append기능이 있다.
09.unsigned char *buf;
10.buf = [myData mutableBytes];
11.NSLog(@"myData: \"%s\"\n", (char *)buf);
12.[pool drain];
13.return 0;
14.}

결과
2010-11-10 10:50:33.292 Test[1370:a0f] myData: "Hello MutableData"

반응형