이 글은 아래의 출처를 수정하여 작성한 글 임을 밝힌다.
<출처 : 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"