Objective-C (포인터)

이한솔·2024년 7월 30일

Objective-C 문법 🍎

목록 보기
6/12

포인터

포인터는 메모리 주소를 저장하는 변수다. 포인터를 사용하면 메모리의 특정 위치에 있는 데이터에 직접 접근할 수 있다. 포인터는 데이터의 실제 위치를 참조하고, 이로 인해 프로그램이 메모리에서 데이터를 효율적으로 관리하고 조작할 수 있게 해준다.

포인터 선언과 초기화

포인터 변수를 선언할 때는 변수 이름 앞에 * 기호를 사용한다.
포인터 변수를 선언하고, & 연산자를 사용하여 변수의 주소를 포인터에 저장할 수 있다.

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에서 allocinit 메소드를 사용하여 메모리를 동적으로 할당하고, 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;
}

0개의 댓글