BLOG main image
LEEEJONG (165)
IT (53)
주관적평가 (31)
창작공간 (80)
110,076 Visitors up to today!
Today 47 hit, Yesterday 63 hit
daisy rss
tistory 티스토리 가입하기!
'Objective-C'에 해당되는 글 2건
2017.09.05 18:00


Objective C 코드를 보다보니 말도안되는 Syntax가 많이 보인다.


그중 제일 이해안되는 [] 대괄호에 대해 고수분들께 문의했고

오늘 배운것을 정리해본다.


일단 예제소스를 써보자

UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(23,28,258,20) ];



이게 문제의 출발이다

이 말도안되는 소스는 대체 무엇인가

일단 여기서 왼쪽절은 titleLabel이라는 UILabel 포인터 변수를 선언한거다. 여기까지는 소양



우측 UILabel alloc 은 내가 알고있는 객체지향 개념으로는 new라고 보면 된다고 하셨다.

메모리를 할당해야 그 포인터 주소가 나오니까 그걸 alloc (메모리할당) 한거다.


그럼 그렇게 나온 놈한테 initWithFrame을 한거로 봐야한다.


나눠보면

UILabel *titleLabel = [UILabel alloc];

[titleLabel initWithFrame:CGRectMake(23,28,258,20)];


이렇게 나뉘어진다.


그래 위에문장은 그렇다고 치자 뭐 완벽하게 이해되는건 아니지만


그럼 아래문장에 대괄호는 왜친건데?


라고 질문이 출발하니


그에대한 답은 '메시지'의 개념을 이해해야 한다고 하셨다. 그리고 [] 대괄호로 묶는건 인자? 라고 봐야된다고도 하셨다.


titleLabel이라는 놈한테 initWithFrame[] 을 한거다

내가 아는 문법으로 바꾸면

titleLabel.initWithFrame()


이렇게 바꿀수 있다는거다.


CGRectMake()를 해서 나온 사각형을 initWithFrame에 보내고 그걸 할당한 UILabel 포인터변수에 넣은거다.


음.. 정리를 해도 말로 표현이 잘 안되는데 이 그지같은 형태의 근원은


우리가 갖고있는 일반적인 개념으로는 각 객체의 함수를 실행시킨다. 라는 생각을 갖고있는데


C에서는 우린 그 일을 수행할 놈한테 메시지를 보내고, 그 처리는 그쪽에서 알아서 하게 한다... 메시지를 보낸다는 부분이 포인트다.


이게 큰 차이점이라고 한다.


자 결론

[] 대괄호는 파라미터를 보내는거 정도로 기억해라 like ()




그럼 적용을해보자


[self addSubView:mMyVariable];


이놈을 해석하면

self.addSubView(mMyVariable); 


이렇게 되는거다




번외편


- (id)initWithFrame:(CGRect)frame withInfo:(Weather *)info

{

//BlahBlah

return self

}



뭐 이런 함수


젤 위에보면 -가 붙는데

-는 보통 함수같은데 쓰고 가끔보이는 +는 static 함수 같은데 쓰인다고 한다.

대충 난 -만 쓰면 될거같다.


(id)를 리턴하는 initWithFrame함수인데 인자로 CGRect타입의 frame과 withInfo라는이름의 Weather 포인터 info를 받는다.


뭐 이정도로 봐야될거같다.


[]를 할때 변수가 하나만있으면 땡땡이: 콜론 을 생략하는 이상한 요상한 법칙이 있다고 한다.


일단 오늘은 여기까지 정리하고 넘어간다.

Name
Password
Homepage
Secret
2017.09.05 14:02


몇 해 전 iOS앱개발을 시작하면서부터 궁금했던 NSString/ NSLog / NS블라블라 의 정체를 우연히 

Objective C 입문서에서 발견해서 그 내용을 옮겨본다.


이전에 이야기했듯이 오브젝티브씨는 아주 약간 특별한 양념을 친 C와 같기 때문에 원한다면 NSLog대신 printf를 그냥 쓸 수도 있다. 그러나 시간과 날짜가 함께 출력되는 기능이나 새 라인 문자를 자동으로 넣어주는 등 부가적인 기능이 있으니 NSLog를 사용하기를 추천합니다.


NSLOG라는 함수 이름이 좀 낯설게 느껴질 수 있다. 함수 이름의 NS는 무슨 의미일까? 읽더보면 코코아의 모든 함수 상수 타입 이름에  NS가 앞에 붙는 것을 볼 수 있다. 이 접두사는 함수가 다른 툴킷에서 온 것이 아니라 코코아에서 왔다는 것을 알려준다.


이런 접두사는 같은식별자가 두 개의 다른 대상에 쓰일 때 결과적으로 큰 문제가 되는 이름 충돌 (name collisions) 사태를 막는데 도움이 된다. 만일 코코아가 Log()라는 이름의 함수를 가지고 있다면 이를 잘 알지 못하는 프로그래머가 어딘가에서 만든 Log라는 함수와 이름이 충돌할 수 있다. Log함수를 가지고 있는 프로그램이 코코아를 포함하면 XCode는 L:og가 여러번 정의되었다고 투덜댈 것이고 에러가 나타난다.


이제 접두사를 사용하는 것이 왜 좋은지 알게 되었다. 그런데 이번에는 다른 의문이 생길 것이다. 예를 들어, 왜 cocoa를 접두사로 쓰지 않고 NS를 사용했을까?  NS접두사는  이 툴킷이 NextSTEP이라고 불리며 NeXT Software의 제품이었던 때로 거슬러 올라간다. NextSTEP을 위해 이미 작성된 코드와으이 호환을 유지하기 위해 애플은 NS 접두사를 계속 쓰고 있다.

중략


그래서 우리는 여기서 개발할때 접두사로 NS를 써서는 안된다.


출처: 오브젝티브 C 아이폰과 맥 OSX 개발을 위한 / 마크 달림플, 스콧 내스터 지음 / 이종웅, 박세현 옮김 / apress, bj퍼블릭 23페이지


자 요약들어간다.


NS는 NextSTEP 회사이름이고, 걍 스트링 인티저 로그 뭐시기 등등에 NEXTSTEP에서 뭐 추가해서 만든 NS블라블라 클래스가 있고 거기에 추가 기능들이 들어있으니 우리는 그걸 사용한다.

뭐 이런느낌으로 받아들여야 겠다.


걍 내가 인지하는 int string 등은 C의 함수형이라고 이해하고 넘어가야겠다.


이걸읽는 Swift개발자님들 짜증나시죠

그냥 String 을 쓸때 NSStirng으로 치환해서 사용해야한다.. 정도로 외워두고 갑시다.


정리끗

Name
Password
Homepage
Secret
prev"" #1 next

티스토리 툴바