포인터는 메모리 주소를 저장하는 변수다. 포인터를 사용하면 메모리의 특정 위치에 있는 데이터에 직접 접근할 수 있다. 포인터는 데이터의 실제 위치를 참조하고, 이로 인해 프로그램이 메모리에서 데이터를 효율적으로 관리하고 조작할 수 있게 해준다.
포인터 변수를 선언할 때는 변수 이름 앞에 * 기호를 사용한다.
포인터 변수를 선언하고, & 연산자를 사용하여 변수의 주소를 포인터에 저장할 수 있다.
int value = 10;
int *ptr = &value; // value의 주소를 ptr에 저장
기본 데이터 타입은 포인터를 사용하여 메모리 주소에 접근하고, 그 값을 수정할 수 있다.
int value = 1;
int *ptr = &value;
*ptr = 10; // 포인터를 통해 value의 값을 10으로 변경
int value2 = 2;
ptr = &value2; // 포인터가 value2를 가리키게 됨
*ptr = 20; // 포인터를 통해 value2의 값을 20으로 변경
const int *num = &value; // 포인터가 가리키는 값이 상수
// *num = 2; // 오류: 포인터가 가리키는 값 변경 불가능
num = &value2; // 포인터가 다른 주소를 가리키게 할 수 있음
int *const number = &value; // 포인터가 상수
*number = 3; // 포인터가 가리키는 값 변경 가능
number = &value2; // 오류: 포인터 주소 변경 불가
NSString은 불변 객체이기 때문에 객체의 값을 직접 변경할 수 없다. 포인터는 다른 NSString 객체를 가리킬 수 있지만, 객체 자체는 변경할 수 없다.
💡 이 부분에서 왜 *str로 접근하지 못하는지 많이 헷갈렸는데, 기본 데이터 타입과 다르게 객체 타입은 객체를 직접적으로 조작하거나 그 내용에 접근할 수 없고, 포인터 연산을 통해 객체의 메모리 주소를 직접적으로 변경하거나 읽을 수 없다!
NSString *str = @"Hi";
NSLog(@"Original string: %@", str); // 출력 Hi
str = @"Hi~!"; // 포인터가 다른 문자열 객체를 가리킬 수 있음
NSLog(@"Updated string: %@", str); // 출력 Hi~!
//*str = @"Hi~!"; // 오류: 포인터를 통해 객체의 내용 변경 불가능
const NSNumber *num = @1;
NSLog(@"Original number: %@", num); // 출력: 1
// *num = @2; // 오류: 포인터가 가리키는 객체는 상수이므로 값 변경 불가능
num = @2; // 허용됨: 포인터가 가리키는 객체 변경 가능
NSLog(@"Updated number: %@", num); // 출력: 2
NSNumber *const num = @1;
NSLog(@"Original number: %@", num); // 출력: 1
// *num = @2; // 오류: 포인터가 가리키는 객체는 불변 객체이므로 변경 불가능
// num = @2; // 오류: 포인터 자체가 상수이므로 포인터를 다른 객체로 변경 불가능
NSMutableString은 가변 객체이므로, 메소드를 사용하여 객체의 내용을 변경할 수 있다. 포인터를 다른 NSMutableString 객체로 변경하는 것도 가능하다.
NSMutableString *muStr = [NSMutableString stringWithString:@"Hi"];
[muStr appendString:@"~!"]; // 메소드로 객체 변경
NSLog(@"Modified string: %@", muStr); // 출력 Hi~!
muStr = [NSMutableString stringWithString:@"Hi~~"]; // 포인터가 새로운 객체를 가리키게 됨
NSLog(@"Updated string: %@", muStr); // 출력 Hi~~
const NSMutableString *str = @"Hello";
// [str appendString:@" World"]; // 오류: 포인터가 가리키는 객체는 상수이므로 값 변경 불가능
str = @"New String"; // 포인터가 다른 객체를 가리킬 수 있음
NSMutableString *const str = [NSMutableString stringWithString:@"Hello"];
[str appendString:@" World"]; // 객체의 내용 변경 가능
// str = [NSMutableString stringWithString:@"New String"]; // 오류: 포인터 자체를 변경 불가능
Objective-C에서 alloc과 init 메소드를 사용하여 메모리를 동적으로 할당하고, dealloc 메소드를 사용하여 메모리를 해제한다. ARC를 사용하는 경우, 메모리는 자동으로 관리된다.
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 정수 값과 포인터 선언
int value = 10;
int *ptr = &value;
// 포인터를 사용하여 값 출력
NSLog(@"Value: %d", *ptr); // 출력 Value: 10
// 포인터를 사용하여 값 변경
*ptr = 20;
NSLog(@"Updated Value: %d", value); // 출력 Updated Value: 20
// NSString 객체와 포인터 사용
NSString *str = @"Hello, World!";
NSLog(@"String Length: %lu", (unsigned long)[str length]); // 문자열 길이 출력
}
return 0;
}