본문 바로가기
프로그래밍 놀이터/iOS

[Effective Objective-C] #15 접두어를 사용해 네임스페이스 충돌을 피하라

by 돼지왕 왕돼지 2017. 8. 17.
반응형

 [Effective Objective-C] #15 접두어를 사용해 네임스페이스 충돌을 피하라


출처 : Effective Objective-C

c 함수, c 함수 접두어, duplicate symbol error, dynamic loader, Link, namespace conflict, stack trace, [Effective Objective-C] #15 접두어를 사용해 네임스페이스 충돌을 피하라, 네임스페이스, 네임스페이스 충돌, 동적 로더, 두글자 접두어, 디버깅, 라이브러리, 부가효과, 서드 파티 라이브러리, 세글자 접두어, 순수 c 함수, 실행 시간 로딩, 심벌 에러, 전역 변수, 전체 앱 다운, 접두어, 중복 심벌 에러, 최상위 심벌, 코드전반, 코코아


-

오브젝티브-C 는 내장(built-in) 네임스페이스 기능이 없다.

그렇기 때문에 일어날 가능성이 있는 충돌을 피하는 방법을 사용하지 않으면 이름은 쉽게 충돌한다.

앱에서 이름이 충돌하면 중복 심벌 에러(duplicate symbol error)가 발생하여 링크(link)가 되지 않는다.



-

링크가 안 되는 것보다 더 좋지 않은 상황은 중복된 것을 포함한 라이브러리 중 하나가 실행 시간에 로딩되었을 때다.

이 경우 동적 로더(dynamic loader)는 중복 심벌 에러와 마주치게 될 것이다.

그리고 아마도 전체 앱이 다운될 것이다.



-

이 문제를 피하는 한 가지 방법은 간단한 형태의 네임스페이스를 사용하는 것이다.

그 방법은 특정 접두어를 여러분이 만드는 모든 이름 앞에 붙이는 것이다.

접두어는 회사나 앱에 관련 있는 것을 골라야 한다.



-

접두어를 사용하더라도 여전히 충돌 가능성이 없지는 않지만 훨씬 줄어들 것이다.



-

코코아를 사용해 앱을 만든다면 애플이 모든 두 글자 접두어 사용을 예약했다는 사실을 알고 있어야 한다.

그래서 반드시 세 글자 접두어를 사용해야 한다.



-

접두어는 클래스에만 붙이면 안 되고 앱 내 모든 이름에 붙여야 한다.



-

중요하지만 가끔 간과되는 또 다른 잠재적인 충돌은 순수 C 함수 또는 여러분 클래스의 구현 파일 내에서 사용하는 전역 변수에서 발생한다.

이것들이 컴파일된 오브젝트 파일에서 최상위(top-level) 심벌로 보인다는 사실을 잊어버리기 쉽다.



-

구현 파일에 정의되어 있고, 헤더 파일에 선언되어 있지 않는데도 순수 C 함수는 최상위 심벌로 보인다.

이런 경우 컴파일 시에 링크 할 수 없다는 중복 심벌 에러를 볼 수 있다.

더 안 좋은 것은 다른 앱에서 사용할 수 있도록 여러분의 코드를 라이브러리로 배포했을 때다.


그래서 C 함수 역시 접두어를 항상 붙여야 한다.



-

접두어를 붙여서 구체화시켜 놓으면 백트레이스에서 이 심벌을 쉽게 볼 수 있으므로

어디서 문제가 발생했는지 쉽게 밝힐 수 있는 부가 효과도 있다.



-

서드 파티 라이브러리를 사용하는 여러분의 코드를 다른 앱이 사용하도록 배포할 때는 중복 심벌 문제를 특별히 주의해야 한다.



-

전체 코드를 뒤지면서 모든 이름을 변경하는 것은 매우 지루한 일처럼 보이지만 이름 충돌을 피하려면 신중해야 한다.

스스로에게 다음과 같이 물어볼 수 있다.

     모든 이름을 변경하는 것이 과연 필요한지

     충돌이 일어나는 Library 를 포함하지 않고 그냥 구현하여 사용하면 안 되는지.

     다른 세 번째 라이브러리를 사용할 가능성은 없는지?




기억할 점


회사와 앱 모두에 어울리는 클래스 접두어를 고르라.

그리고 코드 전반에 걸쳐 사용하라.


자신의 라이브러리에서 서드 파티 라이브러리를 사용한다면 그 라이브러리의 이름에 자신의 접두어를 붙여라.




반응형

댓글