Objective C로 프로그래밍 할 때 const를 많이 사용합니까?


답변:


21

Objective-C 객체가 작동하는 방식으로 인해 const시행을 포기하고 프로그래머를위한 표기법이 시작됩니다. 이 프로그램을 고려하십시오 :

int f(const int x) {
    return ++x;
}

int main(int argc, char *argv[]) {
    @autoreleasepool {
        int x = 3;
        NSLog(@"%d", f(x));
    }
    return 0;
}

실제로 컴파일되지 않습니다 (clang을 사용하고 있습니다) : 컴파일러는 기본 C 유형을 수정하려는 시도를 감지하고 오류를 발생시킵니다. 그러나 이제이 프로그램과 비교하십시오.

NSMutableString *f2(const NSMutableString * const x) {
    [x appendString: @" world!"];
    return x;
}

int main(int argc, char *argv[]) {
    @autoreleasepool {
        NSMutableString *x = [@"Hello" mutableCopy];
        NSLog(@"%@", f2(x));
    }
    return 0;
}

함수에 상수 객체에 대한 상수 포인터가 전달 되더라도 객체를 변경하는 것은 여전히 ​​가능합니다.

객체 지향 프로그래밍에서 객체의 지속적인 특성을 유지하는 가장 좋은 방법은 객체를 불변으로 만드는 것입니다. 즉 상태를 변경할 수있는 메소드를 제공하지 않습니다. 위의 함수가 NSString대신 인수를 사용 하고 변경 가능한 복사본 대신 NSMutableString리터럴을 전달 했다고 상상해보십시오 @"Hello". 이제 합리적으로 말하면 전달 된 객체 [*]를 변경할 가능성이 없습니다. 오브젝티브 C는 달리, 그 생각을 시행 중 어떤 방법이없는 const또는 final다른 객체 지향 언어에서 객체 참조.

비교를 위해 constC ++에서 완전히 다르게 작동합니다. constC ++ 객체에 대한 참조를 얻으면 const해당 객체에 대한 멤버 함수 만 호출 할 수 있습니다. 이러한 함수는 const변경하지 않거나 mutable클래스 디자이너 가 명시 적으로 표시 한 멤버 변수 만 수정하여 객체 의 밝기를 유지합니다 . 따라서 Objective-C MutableString와 동등한 C ++ 유형이 있다고 가정하십시오 NSMutableString. 위의 예제와 동등한 내용은 다음과 같습니다.

MutableString& f3(const MutableString& x) {
  x.appendString(" world!");
  return x;
}

이것은 분명히 컴파일되지 않을 것입니다 : 연산 이 appendString()아닌 것 외에도 const함수는 const을 요구하는 타입 참조에서 한정자를 제거합니다 const_cast.

[*] 일부 왜곡 된 방법이 있기를 기대하지만, 이제 우리는 "영리한"일을함으로써 다른 프로그래머를 방해하려는 한 프로그래머의 영역에 들어 섰습니다.


감사. 따라서 const 수정자를 통한 수정을 막을 방법이 없습니다.
user4951

권리. 컴파일러는 여전히 const장식을 의미있는 것으로 취급 하므로 경고를 억제하기 위해 별칭이나 캐스트와 같은 왜곡을 얻지 만 이러한 왜곡의 결과로 프로그램의 동작에는 변화가 없습니다.

5
나는 constObjective C에서 객체에 대한 포인터다른 객체가리 키도록 할당되지 않았다는 것을 설명하는 데 여전히 유용 할 수 있다고 생각 합니다 . 즉, 항상 동일한 문자열이며 다른 문자열이 아니라는 NSString * const x것을 알고 x있습니다.
tboyce12

3

Objective C가 진행되는 한 프로그래밍하지 않으므로 질문에 대답 할 수 없습니다. 그래도 대답 할 수있는 질문은 " const목표 C로 프로그래밍 할 때 사람들 이 많이 사용해야합니까 ?"입니다. -하나는 "예"입니다.

Constness는 본질적으로 프로그램의 안정성과 유지 관리를 위해 사용되는 소프트웨어 보안 기능입니다. 많은 프로그래머들은 consts 의 가치를 실제로 인식하지 않고 자라며 언젠가 나쁜 일이 생길 때까지 "아하"순간- "아, 그게 const사용되는 것"입니다. 상수없이 프로그램을 작성하는 것은 전적으로 가능하며 그러한 프로그램을 신뢰할 수있게 만드는 것은 사실상 불가능합니다.

많은 코드 샘플은 실제로 프로그램이 아니라 특정 기능을 표시하도록 설계된 스 니펫입니다. const샘플이 만들려고하는 시점에서 방해가되므로 사용하지 않습니다 . 또 다른 유형의 코드는 배운 예제 또는 상수에 대해 알고 있으며 사용하기에 너무 게으른 예제를 기반으로하는 경험이없는 프로그래머가 작성한 코드입니다.


0

나는 objective-c를 오랫동안 사용하지 않았다.

그러나 나는 왜 아무도이 측면을 언급하지 않았는지 궁금합니다.

Objective-c는 이미 상수와 관련된 다른 것을 가지고 있습니다. 돌연변이

예를 들어, Nstring *은 상수 문자열을 가리 킵니다. 문자열을 수정하려면 NMutableString 또는 이와 유사한 것을 사용하십시오. NMutableString은 사람들이 문자열을 수정할 수있는 추가 메소드를 제공합니다.

이제 포인터 자체를 상수로 만들고 싶다면 어떨까요? 매우 큰 프로젝트를 코딩하는 동안 걱정할 필요가 없습니다.

그래서 나는 그것이 생각합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.