Objective-C의 기능 추가

1. Nullability annotations 
2. Generics 



안녕하세요 야곰입니다 :)

Swift 2.0이 오픈소스화 되면서 관심이 많이 쏠리고 있습니다.


그러나 기존 Objective-C 프로그래머들 사이에서는 Swift에 따라 변화되는 다양한 모습들이 부담으로 다가오기도 합니다. Swift 언어 문법과 기능들에 더 잘 맞춰주기 위하여 기존의 API들이 변경되기도 하고, Objective-C의 문법적 기능들과 키워드들이 몇몇가지 추가되기도 했습니다. 그에대해 간략히 살펴보는 시간을 가져보도록 할게요.


# 해당내용은 2015년 6월 말에 작성된 내용으로, 애플에 의해 추후 변동의 여지가 충분히 있음을 미리 알립니다.


# Nullability

Swift는 지난 포스팅에 말씀드렸듯 자료형에 굉장히 민감합니다. 더불어 nil에 대해서 Objective-C와 완전히 다른 대응체계를 가졌죠. Swift 에서는 nil이란 녀석에도 굉장히 민감합니다. 그래서 그런 Swift의 특성에 맞도록 Objective-C의 기능이 추가되었습니다. 바로 nullability라는 기능인데요, 한 번 살펴보죠. Nullability 기능은 Xcode 6.3 / Swift 1.2 버전부터 정식 지원합니다.


weakstrong, __weak__strong 이라는 키워드 기억하시나요? ARC 때문에 생겨난 새로운 키워드였죠. 이와 쓰이는 위치가 비슷합니다. (예를 든 것일뿐 weak와 strong 키워드와는 전혀 상관이 없습니다)


Nullability 기능으로 새로 생겨난 키워드는 nullable, nonnull, null_unspecifiednull_resettable 등입니다.


- nullable : 해당 항목이 null일 수 있다. 즉, Swift의 옵셔널 [?] 항목입니다.

- nonnull: 해당 항목이 null일 수 없다. 즉, Swift의 논옵셔널 항목입니다.

- null_unspecified : 해당 항목의 null 여부가 지정되어있지 않다. 즉, Swift의 암시적 추출 옵셔널 형식 [!] 항목입니다.

- null_resettable : 해당 프로퍼티가 기본값을 가지고 있어 nil일 수 없을 경우에 사용합니다.

                               즉, nil을 할당하면 즉기 기본값으로 초기화되는 프로퍼티에 사용할 수 있습니다. 

                               Swift에서는 암시적 추출 옵셔널 형식 [!] 으로 표현됩니다.


* nullability 키워드를 별도로 지정하지 않는 경우 null_unspecified가 기본입니다.

** nullable, nonnull, null_unspecified는 Objective-C 프로퍼티와 메소드, C와 블럭 포인터 등 

     전반적으로 모두 사용가능하지만, null_resettable은 Objective-C 프로퍼티에만 사용 가능합니다.


일단 메소드에 쓰이는 예를 살펴보죠. UIViewController의 한 메소드입니다. Swift 코드와 Objective-C 코드를 살펴보면 기존의 API와 다르게 nullability 관련 키워드가 Swift의 옵셔널 형식에 맞게 반환자료형 또는 전달자료형 뒤에 삽입되어 있음을 확인할 수 있습니다.


[ nonnullnullable의 API 적용 예 ]

[ null_unspecifed의 프로퍼티 적용 예 ]


위에서 nullability 관련 키워드를 설정해 주지 않는 경우 기본적으로 null_unspecified가 기본값으로 적용된다고 말씀드렸는데, 기본값을 변경할 수 있는 메크로가 존재합니다. NS_ASSUME_NONNULL_BEGIN과 NS_ASSUME_NONNULL_END. 이렇게 한 쌍으로 존재합니다. 저 한 쌍의 매크로 안쪽에 해당하는 항목들은 기본적으로 nonnull 옵션이 적용됩니다.

스크린샷을 보시면 실제로 Swift에서 어떻게 적용이 되는지도 확인하실 수 있을겁니다.



[ Objective-C 코드에서 NS_ASSUME_NONNULL_BEGIN과 NS_ASSUME_NONNULL_END의 적용 예 ]



[ 위의 Objective-C 코드로 작성된 내용을 Swift 코드에서 확인 ]



null_resttable에 관련된 프로퍼티를 찾아보았으나 찾지 못했습니다. 애플이 제공한 null_resettable에 관한 문서설명에는 아래 스크린샷과 같이 나와있지만 실제 tintColor는 null_resttable이 아니었습니다 :) 참고로 알아두시면 될 것 같습니다.



null_resttable에 대한 설명 ]




# Generics


Objective-C에서 제네릭이 추가되었다고하여 찾아보았는데, 아마도 Swift의 콜렉션 타입(배열, 딕셔너리, 세트)를 위해 반영이 된 것 같습니다. Objective-C 에서는 배열(NSArray), 딕셔너리(NSDictionary), 세트(NSSet)에 자료형에 상관없이 한 콜렉션에 여러가지 객체형태를 넣어줄 수 있었죠. 즉, myArray라는 NSArray에 문자열도, 숫자도, 뷰 객체도 한 번에 들어갈 수 있었다는 이야기입니다. 그러나 Swift에서는 하나의 콜렉션에는 하나의 자료형밖에 담지 못합니다. Array도, Dictionary도, Set도 전부 담게되는 자료형을 명시해 주고, 그 자료형과 맞지 않으면 넣을 수 없었습니다. 이런 차이를 극복하기 위해 Objective-C에 기능을 추가했군요. 저는 Objective-C의 콜렉션이 자료형과 상관없이 넣을 수 있어서 참 강력하다고 생각했는데, 개인적으로는 아쉽습니다. Objective-C의 generics은 Xcode 7 / Swift 2.0 부터 지원합니다.


스크린샷을 보시면 어떻게 상호 호환되는지 확인해 보실 수 있습니다. __kindof 키워드는 그 클래스와 하위 클래스까지 호환됨을 의미합니다. 실질적으로 Swift의 코드에 미치는 영향은 없습니다.


[ Objective-C 코드에서 Generics의 적용 예 ]


[ 위의 Objective-C 코드로 작성된 내용을 Swift 코드에서 확인 ]



애플이 단지 Swift를 밀어주기 위해 Objective-C를 변경 하는 것인지, 아니면 두 언어의 상생을 위하여 Objective-C를 조금 희생시키는 것인지는 두고봐야 할 것 같습니다.
 

# 오늘은 6.25 한국전쟁 발발일입니다. 오늘만이라도 뼈아픈 민족상잔의 비극을 잊지않고 되돌아 보는 시간이 되면 좋겠습니다.

[역사를 잊은 민족에게 미래는 없습니다]

by yagom

facebook : http://fb.yagom.net

facebook group : https://www.facebook.com/groups/yagom/

twitter : http://twitter.yagom.net ( @yagomsoft )

p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   



저작자 표시 비영리 변경 금지
신고
Posted by yagom

# 재미있는 언어 Objective-C
여러분들께서는 오브젝티브-C를 어떻게 생각하시나요? 언어의 역사와 배경을 아는 것이 정말 무의미해 보일지 모르겠지만, 오브젝티브-C의 탄생 배경을 살펴보면 재미난 점도 많고, 사용하면서 부딪힐 의문에 대해서도 더 많이 이해하게 될 수 있습니다.
그럼 오브젝티브-C는 어떻게 태어났는지, 왜 제대로 알고 써야 할지 생각해 볼까요?

# Objective-C는 어떻게 탄생하고 발전해왔을까?
오브젝티브-C는 ‘객체 지향 프로그래밍 C언어 [Object-Oriented Programming in C, OOPC]’라는 이름으로 시작된 언어입니다. 즉, C를 객체 지향 언어로 발전시킨 것으로, 1983년에 발표되었습니다. 당시 사람들은 구조적 프로그래밍  습관에 따라 프로그래밍을 하였는데, 풀어내야 할 문제들이 많이 생겨나자 그 해결책으로 객체 지향 프로그래밍  연구를 활발히 하던 시절이었습니다.

애플사에서 나온 스티브 잡스는 넥스트사를 설립한 후 오브젝티브-C의 사용 허가를 받았습니다. 그는 회사를 꾸준히 발전시켜 넥스트스텝이라는 객체 지향형 운영체제에 사용하기 위하여 AppKit과 Foundation Kit 등을 개발하였습니다. 이것이 현재 애플 운영체제의 전신이 되었습니다. 그 후 넥스트는 애플에 합병되었고, 애플은 넥스트에서 쓰던 툴들을 기반으로 Mac OS X라는 운영체제를 출시하였습니다. 오늘날 애플의 Cocoa API 대부분은 이에 기반을 두었죠(애플 운영체제의 클래스 접두어가 대부분 NS인 것이 바로 이 때문입니다).

애플은 2006년 애플 세계 개발자 회의Apple Worldwide Developers Conference, WWDC에서 ‘현대적인 가비지 콜렉션, 문법 기능 향상, 런타임 성능 개선, 64비트 지원’을 포함하는 오브젝티브-C 언어의 리비전Rivision으로 오브젝티브-C 2.0 공개하였습니다. 즉, 우리가 현재 배우고 사용하고 있는 오브젝티브-C는 오브젝티브-C 2.0이죠.

# 왜 Objective-C의 특성을 살려야 할까?
앞에서 언급했듯이 오브젝티브-C는 조금은 독특한 역사를 가지고 있으며, 객체 지향의 특징을 구현하기 위하여 많은 고민을 거듭하여 발전한 언어입니다. 절차 지향 언어인 C에서 파생된 언어이고, 자세히 파헤쳐보면 100% 객체 지향 언어라고 하기에는 무리가 있지만, 저는 객체 지향 특성을 제대로 활용할 수 있는 몇 안 되는 언어 중에 하나라고 생각합니다. 또한, 같은 객체 지향 언어라 하더라도 C++, Java와는 조금 다른 특성들을 많이 갖고 있기에 기존에 개발하던 개발자들이라도 배워야 할 필요가 분명히 있습니다.

게다가 오브젝티브-C를 사용하는 것은 대부분 애플 기기 기반의 애플리케이션을 제작하려는 목적이므로 당연히 애플이 제공한 프레임워크 및 킷을 활용하여 제작할 것은 자명한 사실이죠.

지금에 비하여 처음의 Cocoa API는 오브젝티브-C의 특성을 잘 살리지 못했었습니다. 하지만 지금은 API의 특성을 이해하지 못하면 사용하기 어려울 정도로 오브젝티브-C의 특성들을 많이 활용하고 있습니다. 또한, 프로토콜(특히 Delegate), 카테고리, 블록, GCD 등 오브젝티브-C의 특징을 살린 API와 패턴들이 점점 많아지고 있습니다. 그러므로 좀 더 안정적이고, 유연하고, 빠른 애플리케이션 개발을 위하여 오브젝티브-C의 특성을 알아야 한다고 생각합니다



제 생각들을 조금 정리해 보았는데, 여러분들의 생각은 어떠신지요?
많은 고수분들의 의견을 들어보고 싶습니다 ^^

P.S. 오브젝티브-C를 오브젝트C 라고 잘못 표현하는 분들이 종종 계십니다. 정식명칭은 'Objective-C[오브젝티브-C]'가 맞습니다.

by yagom

facebook : http://www.facebook.com/yagomSoft

facebook group : https://www.facebook.com/groups/yagom/

twitter : http://www.twitter.com/yagomSoft ( @yagomsoft )

p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   

 


저작자 표시 비영리 변경 금지
신고
Posted by yagom

오늘의 주제

1. NSDictionary, NSMutableDictionary
2. NSArray, NSMutableArray



열 한번째 시간입니다.^^

지난 번에는 상속이라는 또 하나의 중요한 개념에 대하여 알아보았습니다.
이번에는 Objective-C에서 가장 흔하고 많이 쓰이는 클래스 중에 자료를 보관할 수 있는 녀석들에 대해 알아보도록 하려고 합니다.

딕셔너리랑 배열인데요, 한 번 봅시다~
 
어휴~ 봄감기 때문에 아주 죽겠네요+_+

# NSArray

배열이란???
C를 배운 분들이라면 배열을 아실겁니다 ㅎ
하지만 여기서 말하는 녀석은 메소드까지 가지고 있는 클래스 입니다. 단순한 자료형이 아니죠~
뭐 약간의 사용개념을 보면 C의 Linked-List(연결 리스트)와 비슷하다고 생각하시면 되겠습니다~!

일단 아래 발로그린 배열을 보시죠..ㅋㅋㅋ

배열입니다.
C에서의 배열과는 달리 이녀석에는 어떠한 객체도 들어갈 수 있습니다.
C의 배열에서는 int형 배열이라면 저장되는 녀석들이 전부 int형이지만, Objective-C의 Array에는 객체 형태라면 무엇이든 들어갈 수 있습니다.

위의 그림의 배열에는 index 0번에 NSString의 객체가 들어가 있고 1번에 NSNumber의 객체가 들어가 있습니다. 그 뒤에 또 어떤 객체들이 들어올 수도 있습니다.

Objective-C에서 이렇게 index번호로 쭈욱 연결되 있는 녀석을 우리는 Array라고 칭합니다.

이와 같은 배열 클래스는 크게 두 가지로 볼 수 있는데요,

처음 생성시 배열을 만들어 주고 수정, 삭제가 불가능한 NSArray.

그리고 생성 후에 추가, 수정, 삭제가 자유로운 NSMutableArray가 있습니다.

NSMutableArray는 NSArray를 상속받아 사용하기 때문에 NSArray의 모든 메소드를 사용할 수 있으며 추가적으로 추가, 수정, 삭제 메소드가 있습니다.
자세한 설명은 저 아래에서 다시 할게요~

잠깐,,! 상속을 모르신다구요? 그럼 알고 넘어갑시다^^
2012/03/28 - [Objective-C] - Objective C <9>. 상속(1)
2012/04/10 - [Objective-C] - Objective C <10>. 상속(2) - 오버라이딩


# NSDictionary

딕셔너리란???

우리말로 하면 사전이라는 뜻이죠~

우리는 사전에서 무엇인가를 찾고자 할때, 해당하는 단어를 찾고, 그 단어를 찾아가서 그에 해당하는 내용을 가져오죠.

여기서의 딕셔너리도 마찬가지입니다.

여러 자료들을 하나의 딕셔너리에 넣어놓고 우리가 원하는 자료를 꺼내오고 싶을 때, 우리가 딕셔너리를 생성할 때 부여해준 key라는 녀석으로 검색을 하여 꺼내옵니다.

여기 아래의 허접한 그림을 함께 보시죠 ㅋㅋㅋ

위의 그림의 딕셔너리에는 세 개의 객체가 들어가 있습니다.

NSString의 객체는 name이라는 key값을 가지고 있고, NSNumber의 객체는 number라는 key값을 가지고 있습니다.
그리고 NSArray의 객체는 array라는 key값을 가지고 있네요.

이처럼 딕셔너리에는 다양한 종류의 객체가 들어가 있을 수 있으며, 각각의 객체는 고유한 key값을 가지고 있습니다.
그렇기 때문에 우리가 사전에서 어떤 단어를 찾아서 그 의미를 해석해 낼 수 있듯이, 컴퓨터는 딕셔너리 안에서 키값으로 원하는 자료를 찾아올 수 있는 것입니다.

즉, Array는 index 값으로 자료를 꺼내올 수 있지만, 딕셔너리는 index값이 없는 대신 key 값으로 자료를 꺼내올 수 있습니다.

딕셔너리도 배열과 마찬가지로 NSDictionary와 NSMutableDictionary로 나뉠 수 있습니다.

두 개의 차이점은 위에서 말씀드렸으니 아시겠죠?ㅎ

이렇게 자료들을 편하게 보관할 수 있는 두 클래스를 알아보았습니다.



그렇다면 이제 예제를 통해 익혀보도록 해요~

# 실습해보기 

새로운 프로젝트를 만들어 봅시다~
요로코롬 만들어 줍니다~


그리고 코드를 예쁘게 넣어줍니다~_~


자, 자세한 설명은 주석을 통해 달아놓았으니 참고하시기 바랍니다.

위에서 디버깅 로그를 보게되면 배열에 두 개의 객체가 들어가 있는 것을 볼 수 있고, 딕셔너리에 배열, 이름, 숫자 이렇게 세 개의 객체가 들어가 있는 것을 볼 수 있습니다.

그런데 배열에서는 우리가 넣어 준 순서대로 들어가서 로그에 찍히는데, 딕셔너리의 로그에는 우리가 집어 넣어준 순서대로 찍히질 않네요+_+

네, 그렇습니다. 딕셔너리는 기본적으로 우리가 넣어 준 순서대로 자료가 정리되어 있는 것을 보장하지 않습니다.
딕셔너리라는 주머니에 객체들이 막 널부러져 있는거죠~^^* 이 또한 배열과 딕셔너리의 차이점이 되겠습니다. ㅎ

자, 위에서 Mutable이 아닌 기본 클래스를 사용해 보았으니 이제 Mutable도 사용해 보아야 겠죠?
코드를 이쁘게 추가해 줍시다.

역시나 자세한 설명은 주석으로 들어가 있습니다~
우리가 처음에 생성해 주었던 배열과 딕셔너리에서 Mutable 녀석들로 객체의 내용을 복사해 온 후에 원하는 내용을 삭제 해 보았습니다.
물론 추가, 수정도 가능합니다~ 그것은 개발문서를 보고 여러분께서 직접 해보기실 권고드립니다^^

디버깅 로그를 살펴보면 우리가 삭제한 내용들이 나오지 않는 것을 확인할 수 있습니다.
이처럼 Mutable을 들어간다면 수정 가능한 녀석들이라고 보시면 되겠습니다.


자, 그런데 제가 위에서 설명드린 것만으로 이렇게 유용하고 좋고 깔쌈하고 이쁜 클래스들을 전부 알 수가 없습니다.
제가 일일히 다 설명을 할 수가 없으니까요^~^

그래서 우리에게는 개발문서가 존재합니다!!!ㅎㅎㅎ
자, 코드에서 alt 키를 누른 상태로 NSDictionary 위에 살포기 커서를 가져가면 밑줄이 생기죠? 클릭해 봅니다~
요렇게 아래 그림처럼 나올꺼예요~ 그렇다면 좀 더 자세히 알아보기 위해 Reference를 눌러봅시다~


이렇게 NSDictionary Class Reference가 나옵니다~
이 개발문서에서는 이 클래스에 관한 거의 모든 내용이 실려있습니다.
살펴보기 부터 시작해서, 가지고 있는 메소드와 변수 등등 모든 것이 나와있는 것이죠.

이렇게 메소드들도 쭈욱 써져 있고 (링크로 되어있기 때문에 누르면 메소드에 관한 자세한 설명을 볼 수 있습니다) 
많은 내용들이 담겨져 있어요. 제가 이걸 다 블로그에 설명 할 수는 없겠죠?ㅎ


딕셔너리만 보면 서운하니까 배열 클래스도 놀러와 봅니다.


이렇게 메소드의 역할별로 카테고리가 나누어져 메소드가 정리되어 있어 쉽게 원하는 메소드를 찾아 볼 수 있습니다~_~

NSMutableDictionary 클래스 레퍼런스를 봅니다.
아래쪽에 Subclassing Note 라고 나와있는 부분이 있는데, 거기 위쪽에 보면  inherits from NSDictionary 라고 써져 있는 것 보이세요?
즉, '이 클래스는 NSDictionary를 상속받았다' 라는 뜻이죠?
그러므로 이녀석은 NSDictionary의 메소드와 변수들을 사용할 수 있다는 뜻이겠죠~ 거기에 추가적으로 수정 기능이 덧붙여 진 녀석이죠^^*


그래서 이녀석의 메소드들을 보면 몇 개 없습니다. 왜냐면 나머지 사용 가능한 메소드들은 NSDictionary에서 찾아볼 수 있거든요^^

이처럼 개발문서를 보면 우리가 알고 싶었던 것 이상으로 자세한 내용들을 찾아볼 수 있습니다~

이 글을 읽었다고 끝나는 것이 아니라 개발문서에서 이런저런 메소드 들을 보고 직접 실습해 보시기 바랍니다~

오늘은 그럼 여기 까~~~~~~~지!

감기때매 헤롱헤롱 @_@

by yagom

twitter : @yagomsoft

p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   


↓↓↓저 열심히 썼는데 추천 한방 꾹 눌러주고 가시는 건 어떨까요? 로그인이 필요 없습니다. ^~^ 사랑합니다~ ↓↓↓ 

저작자 표시 비영리 변경 금지
신고
Posted by yagom



오늘의 주제

1. 오버라이딩(재정의)

열 번째 시간입니다.^^

상속의 개념에 대해서는 조금 잡히셨나요?
아직 잘 모르시겠다면 

2012/03/28 - [Objective-C] - Objective C <9>. 상속(1)

요기서 다시 한 번!


자 그럼 오늘은 상속에 대해서 조금만 더 알아봅시다 ㅎ
스따뚜~~~~~~~~~~~~


# 오버라이딩(재정의)?

오버라이딩 : 재정의

오버라이딩이 뭘까요?

지난번에 상속에 대해서 이야기 할 때, 자식은 부모에게 물려받은 것들을 필요에 의해 부분적으로 바꿔 쓸 수 있다고 했던 것 기억하시나요?

바로 그것을 말합니다.

메소드를 부모가 물려준 그대로 사용할 수도 있지만, 자신의 목적에 맞게 재정의해서 사용할 수 있습니다. 즉, 같은 이름의 메소드를 물려받은 녀석에서 덮어씌울 수 있단 말이죠~

너무 말이 어려운가요?

직접 해봅시다..ㅎ

지난번에 사용했던 자식클래스의 선언부로 와서 부모클래스와 동일한 이름의 메소드를 선언해 줍니다. 코멘트 설명 보세요 ㅎ

그리고 구현을 해줍니다~

자, 이제 메인으로 와서 메소드들을 호출해 봅니다~  역시나 설명은 코멘트로^^

요런 결과가 나옵니다~ 

아까 위에서 말씀드린 것 보고 예상하셨나요?ㅎ

자, 이렇게 상속에 대해서 간단히 알아보았습니다~

다음엔 뭘 해볼까나요 ㅎㅎ



by yagom

twitter : @yagomsoft

p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   


↓↓↓저 열심히 썼는데 추천 한방 꾹 눌러주고 가시는 건 어떨까요? 로그인이 필요 없습니다. ^~^ 사랑합니다~ ↓↓↓ 


저작자 표시 비영리 변경 금지
신고
Posted by yagom



오늘의 주제

1. 상속의 개념 


아홉번째 시간입니다.^^

Objective-C는 정말 오랜만이네요..^^

초코찌찌님의 요청으로 새로운 개념을 하나 가지고 왔습니다~

지난 번에는 메소드에 대해 알아보았습니다~
이번에는 클래스의 상속에 대해 알아보도록 합니다.^^

이 포스팅은 지난 

2012/01/30 - [Objective-C] - Objective C <5>. 클래스와 객체(인스턴스)<1>

2012/02/05 - [Objective-C] - Objective C <6>. 클래스와 객체(인스턴스)<2>

이 두개의 포스팅 지식을 필요로 합니다~

다 알고 계신가요?ㅎ

그렇다면 고고고고고고고고~~~~~~무비무비무비~~~~~~


# 상속이란?

상속이란 무엇일까요?

저는 쉽게 한마디로 말하면, 클래스의 확장 이라고 표현하고 싶네요.

즉, 이미 만들어져 있는 클래스에서 내가 원하는 부분을 추가하거나 변경하여 새로운 클래스를 생성할 수 있습니다.
 
하지만 여기에도 규칙이 있기 마련이죠..^^

상속에서는 부모클래스와 자식 클래스라는 개념을 가지고 말을 합니다.

자식 클래스는 부모 클래스를 상속 받는다고 표현합니다.

상속 받는다는 것은 원래 클래스에 추가나 변경을 한다고 말씀드렸죠?

그렇다면 부모클래스와 자식 클래스 중에 더 확장된 클래스는 무엇일까요?

네, 바로 자식 클래스이죠~

부모클래스 보다 자식 클래스가 더 덩치가 크다 이말입니다^^ (사실 그렇지 않을 수도 있습니다만, 개념상 편하게 이렇다고 합시다 ㅎ)

그림에서 보다시피 부모가 자식에게 자신의 대부분의 것을 물려줍니다.


자식은 물려받은 그것들에서 마음에 들지 않는 것이 있으면 바꾸기도 하고, 더 필요한 것이 있으면 추가하기도 합니다.

자 대충 감이 오시나요?

상속을 받게되면 부모 클래스의 헤더에 선언된 메소드와 변수가 자식에게 상속됩니다.
물론 모두 상속되는 건 아닙니다. 부모클래스에서 상속해주지 않겠다고 선언해 준 녀석이 있다면 그 녀석들은 상속되지 않습니다.

그럼 실질적으로 상속이 어떻게 되는지 한 번 볼까요?

아래 그림을 보면, 우리가 만들었던 클래스 입니다.
이 클래스를 만들때 대화상자에서 Sub class of... NSObject라고 했던 것 기억하시려나 모르겠습니다^^
지금 MyFirstClass.h 헤더파일을 보게되면 MyFirstClass는 NSObject를 상속받았음이 명시되어 있습니다.
그렇습니다. 모든 Objective-C의 class들은 기본적 NSObject를 상속받고 있습니다.
아래 그림처럼 직접적으로 받던지, 아니면 우리가 다음에 새로 만들어볼 MyFirstClass의 자식클래스처럼 다른 클래스를 거쳐 상속을 받던지간에 어찌되었든 상속을 받습니다.

자, 그럼 이 NSObject라는 녀석을 한 번 살표볼까요?

NSObject 에서 오른쪽 버튼 클릭을 하여 Jump to Definition로 향합니다^^

그러면 Foundation framework에 포함된 NSObject.h 파일에서 NSObject의 선언부를 볼 수 있습니다.

NSObject에 이런저런 많은 메소드들이 선언되어있네요^^

우리가 어떤 인스턴스를 만들어 줄 때, alloc , init 해줬던 것을 기억하시나요?ㅎ

고녀석들 요기있네요~~~~~~~~~ㅎㅎㅎ 말씀드렸듯이 모든 클래스들은 NSObject를 상속받기 때문에 어디서든지 alloc, init을 할 수 있는 것입니다.


# 상속 실습해보기

자, 대충 개념은 잡았겠다, 실습 한 번 들어가 봅시다 ㅎ

새로운 클래스를 만들기 위하여 New File... 합니다!


Cocoa의 Objective-C class를 선택해 주시고 Next~

자, 그 후에 여기서!! Subclass of MyFirstClass를 해 주는 겁니다!!

MyFirstClass를 상속 받겠다는 의미가 되겠습니다!!

그 후에 클래스명을 FirstChildClass로 합니다.

FirstChildClass.h로 이동해 봅니다.

MyFirstClass를 상속하고 있다고 명기되어 있습니다. 정말 딱 이거 하나 있는데 이 클래스에서 어떤일이 벌어졌을까요?ㅎㅎㅎ

심지어 구현부도 텅텅 비어있는 멍텅구리 같아 보입니다 ㅎㅎㅎ

자, 하지만 우리는 상속받고 있다는 것을 알기 때문에, 무작정 뭔가를 시도해 봅시다~

열시미 타이핑타이핑 ~_~ 자세한 소스 설명은 주석에 담겨있지요?ㅎ

짜잔~~~~~~~ 실행 결과입니다.

분명히 자식클래스는 속이 텅텅 비어있는 녀석 같아보였는데, 부모클래스에서 이미 만들어져 있는 메소드와 변수를 사용할 수 있었습니다.

캬~ 우리 모두 정말 부모님께 감사해야 합니다...ㅋㅋ


여하간 이것으로 상속에 대한 개념을 좀 알아봤습니다. 횡설수설이라 이해가 잘 되실지는 모르겠네요ㅠ_ㅠ

혹여나 이해가 되지 않는 부분 또는 잘못된 점이 있다면 댓글 부탁드립니다~^^

그럼 뿅!!!!!!!!!!!!!


by yagom

twitter : @yagomsoft

p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   


↓↓↓저 열심히 썼는데 추천 한방 꾹 눌러주고 가시는 건 어떨까요? ^~^ 사랑합니다~ ↓↓↓ 


저작자 표시 비영리 변경 금지
신고
Posted by yagom

오늘의 주제

1. 메소드 선언하고 구현하기 
2. 메소드 인자 전달하기 

3. 반환값(return값)에 대해 알기 



여덟번째 시간입니다.^^
정말 오랜만의 포스팅입니다...ㅋ
오늘은 제 동생의 생일이랍니다!!!
뭐... 그렇다구요 ㅋㅋㅋㅋㅋㅋ

지난 번에는 이름짓기에 대해 조금 알아보았습니다.
처음부터 이름을 잘 짓는 습관이 필요합니다.
귀찮다고 a, b, c 이런식으로 이름 지어놓으면 같이 일하는 동료는 물론 자신 스스로도 하루만 지나도 코드를 읽을 수 없습니다...ㅋㅋ

자 그럼 잔소리 생략하고 설명 들어갑니다~

참..! 이거 보시기 전에 지난 포스트 2012/02/05 - [Objective-C] - Objective C <6>. 클래스와 객체(인스턴스)<2> 를 보고오시기를 추천드립니다^^
스따뚜~~~~~~~~~~~~


# 메소드의 모든 것

지난번에 쓰던 FirstProject를 계속 사용하도록 하겠습니다.
물론 없으신 분들은 매우 간단하므로 클래스 하나만 만들어 주시고 네모 박스 친 코드들만 다시 작성하셔도 무방합니다^^.
MyFirstClass에 인스턴스 메소드 세개를 만들어 줍니다.


자 이렇게 선언을 하는 것입니다.
 -(NSInteger) addTwoIntegerWithFirstInt:(NSInteger)firstInteger secondInt:(NSInteger)secondInteger;
메소드 기준으로 설명하겠습니다.

메소드 맨 앞의 - 는 이것이 인스턴스 메소드 라는 것을 말해주는 것입니다.
처음 괄호 안의 자료형은 이 메소드의 반환값(리턴값)의 자료형을 의미합니다. 이 메소드의 반환값은 NSInteger 자료형을 가지고 있군요. 자세한 설명은 아래에서 하겠습니다.
그 다음에 오는 것은 이 메소드의 이름입니다. 이 메소드의 이름은 addTwoIntegerWithFirstInt 입니다. 정확히 말하자면 addTwoIntegerWithFirstInt: secondInt: 입니다.
그리고 땡땡이 뒤에 오는 녀석들은 이 메소드에 들어가는 인자의 자료형과 이름을 뜻합니다. NSInteger자료형을 갖는 firstInteger와 secondInteger라는 이름을 가진 두 개의 인자가 전달되어 들어오네요. 이 역시 자세한 설명은 요 아래.

자, 그럼 반환값과 인자가 무엇이냐?

우리가 밥을 먹는다고 생각해 봅시다. 밥도 먹고 국도 먹고 반찬도 먹습니다. 이것을 인자라고 생각합니다.
그리고 우리는 뱃속의 여러 장기들에서 이 음식들을 소화하고 분해하고 찌꺼기는 분류해서 대변(똥ㅋㅋㅋㅋㅋㅋㅋㅋㅋ)으로 변환하여 배출합니다.

조금 감이 오시나요?
메소드는 어떤 특정한 일을 하는 마술상자 같다고 표현합니다.
여러 인자들을 받아들여서 이것을 메소드 고유의 특정한 방법을 거치고 가공하여 다시 뱉어냅니다. 이것이 메소드의 역할입니다.

그래서 받아들이는 값들을 인자값, 그리고 뱉어내는 값들이 반환값입니다.

하지만, 사람과는 약간 다르게 메소드라는 녀석은 먹지 않고도 뱉어낼 수 있고, 먹어도 뱉어내지 않을 수도 있습니다.
인자값이 없는 메소드도 있고, 리턴값이 없는 메소드도 있다는 말이죠..^^
또, 먹지도 뱉지도 않는 메소드들도 있습니다.

먹는게 없는 메소드는 인자가 없구요, 뱉는게 없는 메소드는 반환값 자료형의 종류가 void로 표기되어 있습니다.

이런 저런 메소드들을 보다보면 자연스레 알게되실거예요~

자, 그럼 본격적으로 메소드 구현을 해 봅시다.
헤더에서 정의해준 모양을 따와서 구현파일(.m)에서 구현합니다~


어...? 근데 이렇게만 해놓으니 왼쪽에 노란 삼각형 알림이 뜹니다.
눌러보면 이 메소드는 반환값이 있어야 한다고 친절히도 알려줍니다.
그렇습니다. 반환값이 명시된 메소드는 꼭 반환(똥을 싸야...)한다는 뜻입니다~ㅋㅋ
하지만 맨 아래 printFoo라는 메소드는 먹지도 뱉지도 않는 녀석이기 때문에 알림이 뜨지 않네요~^^

그럼 이쁘게 메소드를 구현해 볼까요?
자세한 설명은 주석에 있으니 잘 읽어보세요^^



자 클래스에 메소드를 구현했으니 이제 main에서 써봅시다~
자세한 설명은 주석에 써져 있습니다..^^


짠~ 결과화면 입니다.


여러분들의 예상과 맞았나요?
맨 마지막의 printFoo 메소드는, 제가 귀찮거나 깜빡했거나 해서 해보지 않은 것이 아니라 여러분들을 위해 남겨 놓았습니다.ㅋㅋㅋ
(양심이 있다면 이런소리 못하지..ㅋㅋㅋㅋㅋㅋㅋㅋㅋ)

여튼, 한 번 printFoo 메소드도 호출하여 결과를 보시기 바랍니다~

이상 메소드에 대해서 알아봤습니다~!

또 뭘 하면 좋을까요?ㅎㅎ



by yagom

p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   

↓↓↓저 열심히 썼는데 추천 한방 꾹 눌러주고 가시는 건 어떨까요? ^~^ 사랑합니다~ ↓↓↓
저작자 표시 비영리 변경 금지
신고
Posted by yagom


오늘의 주제

1. 명명법

일곱번째 시간입니다.^^

두 번에 걸쳐 클래스와 객체에 대하여 알아보았습니다.
이해가 잘 가시는지요?
정말 중요한 것이니 꼭 이해하고 넘어가셔야 합니다~!

이제 클래스랑 객체가 뭔지 알게 되었으니 그녀석들의 이름은 어떻게 지어야 하는지 알아보는 시간을 가져보도록 할게요^^
출바알~~~~~~~~~


# 이름짓기

오늘은 클래스, 인스턴스, 메소드 등의 이름을 어떻게 지어야 할까에 대한 이야기를 해볼까 합니다.

이름짓기... 참 어렵죠 ㅎㅎ

오죽하면 프로그래머가 이름짓기의 도사라는 말이 나올까요-ㅋㅋㅋ

사람 이름은 돈까지 내면서 짓곤 하는데... 이녀석들도 우리의 혼을 불어넣어 만드는 녀석들이니 그만큼 깔쌈하게 이름을 지어줘야 하지 않겠습니까?ㅋㅋ

농담이구요~

이름을 짓는 방법에 대해 따로 이야기 하는것은, 여기에도 규칙이 존재하기 때문입니다.

규칙이 중요한 이유는~

다른사람들의 코드를 해석해 낼 때, 그 사람이 규칙에 맞게 코딩을 했고, 내가 규칙을 알고있다면 금방 이해할 수 있습니다.

또한, 다른사람들과 협업할 때, 내가 규칙에 맞게 코딩을 한다면 협업을 하기 쉽죠.

게다가 규칙에 따라 코딩을 하면 나중에 코드가 길~어지고 복잡해 졌을때, 이녀석이 클래스인지, 변수인지, 메소드인지 등등 분간하기 쉬워지겠죠?

개발문서를 볼때, 또는 샘플코드를 볼때 모두 마찬가지 입니다~

뭐 여튼... 이러저러한 이유로 왠만하면 규칙에 맞게 쓰는 것이 좋습니다^^

자, 그럼 규칙을 간단히 설명해 드릴게요.

아주 기본적인 것들만 알려드리구요...

자신의 필요에 의해서 자신만의 규칙을 사용하는 경우도 있습니다.

좀 더 자세한 내용이 필요하시다면 책을 참고하시면 더더욱 좋습니다^^

일단! 기본적으로 Objective-C에서는 이름 중간에 언더바( _ ) 를 거의 사용하지 않습니다.

단어와 단어 구분을 소문자 대문자로 하지요.

만약 이름을 '내 이름' 이라고 짓고 싶다면 myName 이런 식으로 명명한다는 뜻이죠.

또 이녀석이 String이라는 것을 강조하고 싶다면 myNameString 이런식으로 명명하기도 합니다.

또한, 이름을 지을때에는 나중에 보더라도 이녀석이 뭐하는 녀석인지 알기 쉽도록 직관적으로 만들어 주는 것이 좋습니다.

NSArray *a;

NSArray *nameArray;

어떤가요? 아주 단적인 예지만, 이렇게 차이를 낼 수 있습니다.

이게 아주 기본적인 규칙이구요~

일단 캡쳐화면을 보면서 아래 설명과 비교하면서 보세요^^



$ 클래스

클래스의 이름은 기본적으로 대문자로 시작합니다.

위에서 클래스 이름은 무엇일까요?

MyFirstClass 였죠?ㅎ

이렇게 클래스 이름은 대문자로 시작을 하고, 단어가 연결되는 부분에서 새로 대문자를 써줍니다.

$ 인스턴스 변수 등 변수

변수명은 기본적으로 소문자로 시작합니다. 물론 전역변수 지역변수 등에 따라 차이를 두기도 하지만, 일단 변수는 소문자로 시작한다고 생각하시면 됩니다.

위에서 보시다 시피 myName, mySecret 등등 변수명은 소문자로 시작하게 됩니다.

$ 메소드

메소드 이름도 변수명과 같이 소문자로 시작합니다.

myFirstMethod, itIsClassMethod와 같이 메소드들은 소문자로 시작하는것을 기본으로 합니다.


이정도 입니다...

정말 내용은 별거 없는데 잔소리만 엄청나죠?ㅎㅎ

그만큼 무엇이든간에 기본이 중요합니다.

저런 사소한 습관과 기본지식의 차이로 나중에는 엄청난 차이를 불러일으킨다는 사실을 잊지 마세요^^

그럼 오늘 포스팅은 여기 까~~~~~~아지~~~~~

다음에 뵙도록 해요^^
 

by yagom

p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   


↓↓↓저 열심히 썼는데 추천 한방 꾹 눌러주고 가시는 건 어떨까요? ^~^ 사랑합니다~ ↓↓↓ 
저작자 표시 비영리 변경 금지
신고
Posted by yagom

오늘의 주제

1. Class 만들어보기 
2. Class Method, Getter, Setter, Instance Method... 



여섯 번째 시간입니다.^^

지난 번에클래스와 인스턴스에 관한 개요를 알아보았습니다.
하지만, 말로만 듣고는 잘 감이 안오시지요?
물론 이번 포스팅을 보아도 아리송 하실 수 있습니다.
정말 짧은 코드이지만 많은 내용이 담겨져 있으니 이번 포스팅도 보고 또 보셔야 할 듯 합니다^^
정말 중요한 것이니 몇 번을 보고, 다른 싸이트를 검색하고, 직접 계속 둘러보면서 꼭 몸으로 익히도록 하세요~!

자 그럼 오늘은 직접 클래스를 한 번 만들어 보도록 합시다~
출바알~~~~~~~~~~~~


# Class 만들어 보기


자... 새로운 프로젝트를 만들고 아래 그림처럼 새로운 클래스 생성을 위해 New File...을 선택합니다~


자, 그 후에는 Objective-C class라는 녀석을 선택 한 후 Next ~!



자, 클래스 이름은 MyFirstClass로 만들어 주겠습니다. Subclass of 란에는 NSObject를 선택해 주세요~


저장경로는 그대로 놔두고 Create~!


자~ 새로운 클래스가 생성되어있습니다!!


# Class Method, getter, setter, Instance Method...

자동으로 생성된 코드를 한 번 봅시다요~
Foundation헤더가 자동으로 import되어있구요~
@interface MyFirstClass : NSObject

@end

이렇게 생성되었네요~
우리 사용자 인터페이스 뭐 이런말 많이 하잖아요? 인터페이스 뭐 감이 오시죠?
클래스의 요모조모를 만들어 줄 수 있는 영역입니다.
@end는 말그대로 끝!
그러니까 저 빈 공백 사이를 우리가 채우게 되면 클래스의 모양을 완성하는 것이라는 느낌이 오지 않나요? 오홍홍
 : NSObject의 뜻은 NSObject의 Subclass라는 이야기 입니다. NSObject를 상속받은 것이지요... 뭐 더 자세한 것은 다음에 설명해 보도록 할게요..^^
 


자 내용을 채워넣어 봅니다...
빨간 네모박스대로 코드를 넣어봅시다..^^  




자~ 이제 코드 설명 들어갑니다~

중괄호 { } 안에 들어가 있는 세 녀석들이 있습니다.
이녀석들을 instance variable 즉, '인스턴스변수'라고 합니다.
지난 번에 설명드렸던 것 중에 틀 안에 클래스마다 가지고 있는 특징들을 저장하는 빈공간들이 있다고 설명드렸을 거예요~
이녀석들이 그 녀석들입니다.
인스턴스는 클래스의 틀을 가지고 만들어 지는 거잖아요? 지금 우리는 클래스 틀을 만드는 중이구요~
그래서 인스턴스가 새로 똻!!!!! 만들어지면 저 세 녀석들을 가지고 태어납니다. 물론 저 세 녀석들은 텅텅 빈 멍텅구리이지요^^
저기 세 녀석들에 뭐가 들어가냐에 따라서 이 인스턴스는 다른녀석들과 겉모양과 틀은 같아도 내용이 다른 인스턴스(객체)가 되는 것이랍니다.
이녀석은 하나의 integer변수와 두개의 string을 가지고 있네요~

중괄호가 닫히고 @property라는 녀석들이 있네요.
이 property와 다음 그림의 구현파일에서 볼 수 있는 @synthesize라는 녀석과 짝을 이루어서 자동으로 접근자 메소드 들을 생성해 주는 역할을 합니다.
말로만 해서는 잘 이해가 안가시죠?ㅎ 접근자(getter, setter)녀석들을 직접 만들어 쓰는게 정말 귀찮거든요..^^ 그것은 이따가 구현파일 보면서 다시 설명해 드리도록 하지요~
그리고 property옆쪽 괄호 안에 들어가 있는 녀석들은 이 변수들을 꺼내 쓰고 집어넣을때 등등 뭐 이녀석들을 어떻게 관리할지 명시해 주는 옵션 같은 녀석들인데요, 지금은 일단 넘어가도록 합시다^^ 이것만 해도 골치아프잖아요~ㅎㅎ 

그 아래에는 메소드들이 명시되어 있는데요, 일단 메소드에 대해 간략하게 이야기 해보자면,
메소드라는 녀석들은 무엇인가를 수행하는 역할을 합니다.
쉽게 설명을 해서 전자레인지는 우리가 차가운 음식을 집어넣고 버튼을 누르면 데워서 뜨거운 음식으로 만들어 줍니다. 즉, 찬음식을 데워서 뜨거운 음식을 만드는 일련의 과정을 수행하는 역할을 하지요.
메소드도 우리가 메소드에게 일할거리를 던져주면 메소드의 고유한 역할들을 수행합니다.
감이 오시나요?ㅎ
여튼, 여기 헤더파일(.h)에서는 이런 메소드가 있다~ 정도만 말해주고, 그녀석들의 역할을 구현파일(.m)에서 명시해 줍니다.


다시 돌아와서 @property아래에보면 - 로 시작하는 메소드 들이 쭈욱 나열되어 있습니다.
요녀석들을 우리는 '인스턴스 메소드'라고 부릅니다.
요녀석들은 클래스라는 틀에서 찍혀 나온 후에만 동작하는 녀석들입니다.
즉, 인스턴스에서만 작동하는 녀석입니다.

그 아래에 보면 +로 시작하는 '클래스 메소드'가 보입니다.
이녀석도 메소드이긴 하지만 좀 독특한 녀석입니다. 클래스라는 틀이 하나의 인스턴스를 찍어내기도 전에 뭔가의 역할을 할 수 있는 녀석입니다.
잘 이해가 안가시죠? 자동차 공장에서 차를 만드는 생산라인에서 뭔가를 할 수 있다... 즉, 만들어지는 차가 아닌 생산라인 자체에서 뭔가를 수행한다는 의미로 받아들이시면 될 듯 합니다. "차 생산을 시작해라!" 라는 명령 같은 것이 되겠죠?ㅎ
그렇다면 자동차안에 있는 고유의 특성들(인스턴스 변수들)은 이 클래스 메소드 안에서 쓰일 수 없겠군요^^

말이 참 어렵지요? 헷갈리기도 무지하게 헷갈리구요...ㅎㅎ

그럼 이제 구현파일로 가서 이 메소드라는 녀석들이 무엇을 하는 녀석들인지 속삭여 줄 때가 되었네요 ㅎ


자, @synthesize라는 녀석은 @property와 짝을 이뤄서 getter와 setter를 자동으로 만들어 준다고 말씀드렸어요~
@property에서는 변수형, 변수명을 모두 명시해 주지만, @synthesize에서는 변수명만 기재해 줍니다.
@property에서 토스~ @synthesize에서 스파이크~ ㅋㅋㅋ 농담입니다~~~~~~

여튼 아래에 보시면 아까 헤더파일에서 정의해 주었던 메소드들이 하는 역할들이 쭈욱 나열되어 있는 것을 볼 수 있으실 거예요~

캡쳐 화면에서 오타가 있습니다.
인스턴스를 설정해 준다. 인스턴스를 반환한다. (x)
인스턴스 변수를 설정해 준다(setter), 인스턴스 변수를 반환한다(getter). (o)

여튼 메소드들의 역할들은 주석으로 설명을 달아놓았으니 대충 짐작하시리라 믿습니다.
그래도 혹시몰라 다시 간략히 설명하자면

호출한다라는 것은 그 메소드에게 일을 명령한다는 것으로 해석하시면 되겠습니다.
즉 myFirstMethod라는 인스턴스 메소드를 호출하면 NSLog를 남기는 역할을 수행하는 것입니다.

다음에 setMySecret:이라는 인스턴스 메소드를 호출하면 mySecret라는 인스턴스 변수에 secret이라는 녀석을 통해 받아온 값을 저장해 주는 역할을 수행합니다. 이러한 형태를 우리는 setter라고 부릅니다. mySecret이라는 녀석을 setting해주는 녀석이라 이말이죠 ㅎ. 메소드에 대해서는 다음번(바로 다음번)에 자세하게 다룰 것이므로 잘 모르겠어도 '이 메소드는 mySecret이라는 녀석에 뭔가를 집어넣는 녀석이구나' 라고 생각하세용~

다음은 mySecret이라는 녀석의 값을 알아보는 메소드 입니다. 메소드 이름도 getMySecret이네요^^
mySecret의 내용을 불러오는 메소드 입니다. 이런 형태의 녀석을 getter라고 하죠~

자, 이렇듯 mySecret이라는 하나의 녀석을 넣고 빼고 하려면 복잡하고 귀찮게 두개의 메소드를 따로 만들어 줘야 하는데, 그 수고를 덜어주는 녀석들이 바로 @property, @synthesize 되겠습니다^^ 조금 감이 오실까요?ㅎ 요~ 밑에 가시면 좀 더 이해가 가실거예요~

마지막으로 itIsClassMethod라는 클래스 메소드가 구현되어 있습니다.
사실 클래스 메소드는 이런 시시한 역할을 하지는 않지만, 예를 들어보기 위해 제가 만들어 본 것입니다..ㅎㅎ
어쨌거나 저쨌거나~ 위에서 말했든 이녀석은 +로 시작을 하므로 클래스 메소드이고, 인스턴스가 되기도 전에 호출이 가능 합니다~
호출하면 로그를 남기는 역할을 수행하는군요~

이렇게 구현파일 탐험이 끝났습니다~ㅎㅎ

그럼 이렇게 만들어진 클래스를 직접 구워 삶아 보아야 겠지요?ㅎ

main구현파일로 가봅시다~!


네, 또 한바탕 타이핑 합니다 ㅎㅎ
참참참, 스크린샷에 빼놓은 부분이 있는데요, #import "MyFirstClass.h" 해주셔야 합니다~
import뒤에 누구는 <> 해주고 누구는 "" 해주냐구요?ㅎ
<>를 해주는 녀석은 기본 헤더파일, "" 해주는 녀석은 우리가 직접 만들거나 외부에서 가져온 헤더파일 이라고 이해하시면 쉽겠습니다~

여튼 메인 안에 작성해 봅시다요~
(꼭 autoreleasepool 안에 작성하지 않으셔도 됩니당..ㅋㅋ)

뭐 여튼 그럼 이제 코드를 한 번 뜯어봅시다~
일단 코멘트를 보고 한 번 이해해 보려 노력해보세요~

메소드를 호출하는 방법입니다.
[클래스 또는 인스턴스의 이름 (띄어쓰기) 메소드 이름]

이런식이죠
[MyFirstClass itIsClassMethod]
아까 말씀드렸듯이, 우리는 아무런 인스턴스 생성도 하지 않았지만 클래스 메소드를 호출했습니다.

그 아래에는 인스턴스를 선언하고 초기화 합니다.
MyFirstClass *instance ;
'instance라는 이름을 가진 MyFirstClass 클래스의 인스턴스를 만들어라' 라는 의미입니다.
거기에 [[MyFirstClass alloc] init] 이라고 있는데, 이 alloc과 init이 대표적인 클래스 메소드가 되겠습니다...ㅎㅎ
이 의미는 MyFirstClass를 메모리에 할당하고 초기화하여 인스턴스를 생성한다.. 뭐 이런 의미입니다!
깊이들어가면 한도끝도 없어서... 뭐 이런 의미^^

그렇다면 MyFirstClass *instance = [[MyFirstClass alloc] init]; 이라는 녀석은 instance라는 인스턴스에 MyFirstClass라는 클래스를 초기화하여 집어넣어 주어라. 정도의 의미가 되겠습니다~

여튼 이렇게 우여곡절 끝에 인스턴스가 생성되었습니다.

그럼 이제 이 인스턴스(객체)안에 특징(내용물) 즉, 인스턴스 변수들을 세팅해 줘 봅시다.

myName이라는 인스턴스 변수에는 yagom이라고 넣어 주었습니다. 

그리고 NSString클래스의 인스턴스 변수 name이라는 녀석에다가 instance 인스턴스의 myName이라는 인스턴스 변수의 내용을 불러와서 집어넣어 줍니다.

그런데 여기서 잠깐!! 우리는 myName이라는 녀석의 getter와 setter를 만들어주지 않았는데요???
그렇죠!?
바로 @property와 @synthesize 녀석들이 자동으로 만들어 주었기 때문입니다~!

아래에 몇줄도 다 같은 내용들입니다~
주석을 잘 읽어 보시구요..^^
혹여나 이해가 안가는 부분은 댓글 주세요 ㅎㅎ

자, 그럼 대망의 결과를 확인해 볼까요?ㅎㅎㅎ


이런식으로 로그들이 찍히네요~!

정말 자세히 쓰면 한도끝도 없고, 간단히 쓰려니 간단히 쓰는것도 어렵네요..^^
지루하고 힘드셨을텐데 여기까지 읽어주셔서 감사합니다!!
여기까지 읽으신 분이 계실지도 의문이네요^^
혹여나 읽으셨다면 힘내라고 댓글 하나만 ...!! 넙죽넙죽...

정말 오래걸렸네요^^
다음에 또 알찬 내용으로 다시 올게요~
부족한 부분은 댓글 꼭 주시구요~!

뿅~!

by yagom

p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   


↓↓↓저 열심히 썼는데 추천 한방 꾹 눌러주고 가시는 건 어떨까요? ^~^ 사랑합니다~ ↓↓↓
저작자 표시 비영리 변경 금지
신고
Posted by yagom

오늘의 주제

1. Class? Object? 


다섯 번째 시간입니다.^^

이제까지는 정말 Objective C를 배웠다고 하지도 못할 정도로 아주 기초적인 내용을 다루어 보았습니다.
지난 번에는 실수 표현방법에 대해 알아보았습니다.
조금 도움이 되셨는지요??
나중에 언젠가는 꼭 필요한 날이 올테니 알아두시길~!^^ 
지금부터 몇 번에 걸쳐 포스팅할 내용들(클래스, 메소드, 인스턴스 등등)의 내용만 이해를 하신다면,
"나 Objective C 70%는 이해했어" 라고 말하실 수 있을거예요.
정말 중요한 것이니 몇 번을 보고, 다른 싸이트를 검색하고, 직접 계속 생각하며 익히도록 하세요~!
iOS Dev 포스팅의 클래스와 객체 챕터를 인용하여 조금 더 설명을 추가하여 보았습니다.

힘겨운 발걸음을 한 번 떼어 볼까요?
스따뚜~~~~~~~~~~~~

Objective-C는 '객체지향언어'입니다.

객체지향언어는 객체지향 프로그래밍을 지향하는데요...

아.. 처음 보는 분들은 도무지 무슨말인지, 뭔소린지 도통 모르시겠죠?ㅎㅎ

사실, 모든 것을 시작을 할 때 기초를 탄탄히 다지고 하는것도 좋지만 전 지금 여러분들이 프로그래밍에 대한 지식이 전무하다고 생각을 하고 진행해 볼 생각입니다.

일단, 머리아프게 생각하지 맙시다..ㅎㅎ

지금 기초부터 정말 탄탄히 다지고 싶은분들은..

객체지향언어, 객체지향 프로그래밍, Objective-C, 객체, 인스턴스, 메소드, 클래스에 대해서 역사부터 차근차근 공부하고 오시길 바랍니다. 그러면 조금 더 이해가 잘 갈 수도 있어요^^

하.지.만...

공부하고 되돌아 오시는 분들은 그렇게 많지 않을 것 같네요.ㅎㅎ

하다가 분명히 지칠 것 같아요^^..

그냥 간단간단하게 알아두고 차근차근 한 번 생각하며 나가 봅시다~

일단 저만 믿고 와보시라니까요^^~


# Object와 Class란?

클래스. 우리나라 말로 바꿔보면, 등급? 교실? 종류? 도대체 뭘까요? 흠... 그냥 클래스입니다. 뭐 어떻게 표현할 방법이 없네요 ㅋㅋㅋ
굳이 하나 정하자면 종류??? 
Object란..? 
한글로 하면 객체입니다.

그렇다면 객체란 무엇일까요??
우리는 객체를 '내 차(My Car)'라고 생각해 봅시다.
여기석 클래스라는 녀석도 등장을 하는데, 클래스는 공장의 '생산라인'이라고 생각합시다.
공장의 생산라인에서는 똑같이 생긴 차량을 우리가 필요한 만큼 만들어 냅니다. 
이것이 클래스와 객체간의 관계입니다.

 



그림에서 보는 것과 같이..(발로그려서 죄송...ㅋㅋ) 생산라인에서 똑같이 생긴 자동차를 뽑아냅니다.
하지만 차량마다 번호가 다르고 탑승하는 사람도 제각각입니다.
이처럼 클래스는 어떠한 객체가 가지는 특정 모양에 대한 내용을 담고 있습니다.
그리고 객체는 찍혀나온 녀석이고, 우리는 그 안에 객체마다 클래스 형식에 맞춰 내가 원하는 내용들을 채워 넣을 수 있습니다. 
 

다른 방법으로 표현하면 클래스는 붕어빵을 찍어내는 쇠로된 틀이고,
오브젝트는 그 틀에서 찍혀나오는 붕어빵으로도 비유할 수 있겠습니다.
또한, 붕어빵에 넣어주는 앙금에 따라 팥앙금을 가지는 붕어빵이 될 수도, 피자맛 붕어빵이 될 수도 있죠.
겉모양은 같은데 말예요^^


또 다른 방법으로 설명해보면...
사람을 하나의 클래스로 본다면, 
우리 하나하나는 객체인 것입니다.
그리고 우리는 한 명 한 명 다른 이름을 가지고 있고, 피부색도 다르고, 성격도 다르고, 직업도 다르지요?
전부 사람이라는 같은 틀 안에서 우리는 각각 개성을 가지는 객체가 되는 것이지요^^

강아지도 강아지라는 클래스에서 나오는 객체이지만
종에따라서 색도 크기도 성격도 가지가지 입니다.
 
이제 프로그래밍에서 우리는 창조주가 되는 거에요.
사람의 틀을 가지는 클래스를 만들 수 있고, 
그 틀에는 인종, 성격, 생각 등 다양한 내용을 채울 수 있는 공간을 만들어 두는거죠.

그 후에 우리는 우리가 창조해 놓은 틀(클래스)를 이용해서 사람을 하나하나 찍어내어 만듭니다.
사람 하나를 만들어 놓고,
이름이라는 특징에는 야곰 이라고 채워 넣고
인종이라는 특징에는 황인종을 채워 넣고
외모라는 특징에는 잘생기고, 키크고...
성격이라는 특징에는 사랑스럽고 멋지고 센스있고 착하고 젠틀하다 라는 내용을 채워넣곸ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
생각이라는 특징에는 프로그래밍, 프로그래밍, 프로그래밍... 뭐 이딴것들을 채워 넣습니다.
이렇게 해서 야곰이라는 이름을 가진 객체가 탄생하는 것입니다.
하지만 이 틀(클래스)는 영원불변 하므로 언제든지 이 틀을 사용하여 또다른 사람을 만들어 낼 수 있는 것입니다.
이렇게 따지면 장동건, 원빈, 이승기... 뭐 다들 저랑 같은 틀에서 나온 사람이라 이거죠^^ㅋㅋㅋㅋㅋㅋㅋ
 

조금 이해가 가시나요? 이해가 지금 당장 가지 않으셔도 좋습니다~!
그냥 읽어두세요!!
걱정하실 필요 없구요~ 서서히 시간이 지나고 가끔씩 제가 클래스니 변수니 이런말을 무의식중에 할 때 마다 한 번씩 와서 다시 봐주세요^^ 이해가 잘 안가시면 구글에서 검색해 보시면 도움이 되는 자료들이 많을 거예요~
 
그리고 인스턴스(Instance) 또는 인스턴스변수라는 이름도 종종 보게 되실텐데요, 이녀석은 다름이 아니라 객체를 지칭하는 말입니다. 인스턴스 = 객체라고 생각하시면 됩니다.
 
그럼 여기서 대충 클래스, 객체(인스턴스)의 관계에 대하여 알아보았습니다. 책에서 보면 원론적인 내용들이 굉장히 많아서 헷갈리는 경우도 많고, 요거만 보다가 지쳐 쓰러지는 경우도 있으니.. 일단 여기서 잠시 접어둡시다~ 사실 이게 다예요^^;

정 더 궁금하시다면... 대충 흝어보고 오세요~
http://ko.wikipedia.org/wiki/%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D
http://ko.wikipedia.org/wiki/%EC%98%A4%EB%B8%8C%EC%A0%9D%ED%8B%B0%EB%B8%8C-C
http://www.webdoor.org/xe/135
http://kldp.org/node/108983
별 내용은 없을거예요~

객체지향언어는 왜 사용하는지, Objective-C는 왜 C랑 다른지... 등등은 C를 배우지 않으신 분들이 아니라면 굳이 여기서 설명해 드릴 필요는 없을 것 같아요^^
다음 번 정도에 객체지향언어의 특징과 왜 객체를 사용하는지 정도에 대해서 간략히 설명해 드릴게요. (만약 제가 깜빡하고 안하면 댓글 남겨주세요..ㅎㅎ)

by yagom

p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   


↓↓↓저 열심히 썼는데 추천 한방 꾹 눌러주고 가시는 건 어떨까요? ^~^ 사랑합니다~ ↓↓↓
저작자 표시 비영리 변경 금지
신고
Posted by yagom


오늘의 주제


1. 실수 표현 방법


네 번째 시간입니다.

이번에는 사실 그다지 중요하지 않은 포스팅입니다.
그냥 해보는 깨알같은 팁!?ㅋㅋㅋ
서론 필요 없고 실습 시작입니다~!

# 실수 표현 방법

일단 새로운 프로젝트를 만들고 아래와 같은 코드를 입력하여 봅니다.


결과 출력 화면입니다.



간단하게 코드를 설명하자면...

일단 printf안에 %%라고 표현 한것은 로그에 %가 찍히게 하기 위함입니다...
뭐~ 그냥 그렇다구요 ㅎㅎ

%lf는 double형 실수를 표현하기 위한 출력 형식 지정자라는 것은 알고 계시죠?ㅎㅎ
그냥 %lf하면 컴파일러나 프로세서마다 다르겠지만 3532.0483940000... 이런식으로 대책없이 나오는 것이 보통입니다. 
그래서 좀 더 깔끔하게 출력을 하고 싶으신 분들이 있으실 겁니다.

%.3lf 라고 해주면 소수점 3자리 까지만 출력하라는 의미입니다.

마찬가지로 %.9lf해주면 소수점 9자리까지 출력하라는 의미입니다. 당연히 자리수가 없으면 나머지 자리에 0을 채워넣고 출력해주죠.

%10.3lf의 뜻은 총 10개의 칸에 표현하되 소수점은 3자리만 표현하라는 의미입니다. 물론 점(.)도 한 칸을 차지합니다. 다시 쉽게 설명하면 정수자리 6개와 소수자리 3개를 표현 할 때 이런식으로 작성하여 줍니다.

하지만 %3.3lf와 같이 부족한 칸 안에 표현하라고 하면 무시하고 그냥 원래대로 표기해 버립니다.

%10lf 하게되면 총 10개의 칸에 수를 표현하라는 의미입니다. 하지만 입력되어있는 숫자가 정수자리 4자리 + 점 1자리 + 소수자리 6자리 = 총 11자리 이기 때문에 10칸을 초과하죠? 그래서 그냥 무시하고 출력해 버립니다. 

하지만 %15lf하면 총 11자리 중에 4칸이 남기 때문에 좌측에 공백을 4칸 남기고 출력을 해 줍니다.

%-15lf 하면  총 15칸을 쓰지만 좌측정렬을 하라는 의미입니다.

%+15lf는 의미가 없습니다... 이상한 출력이 되지요?ㅎ 기본적으로 우측 정렬로 되어있기 때문에 의미 없는 표현이 되겠습니다..^^

별 의미 없어보이지만, 나름 팁이라고 생각하고 한 번 쯤 봐두시는 것도 나쁘지 않으실거예요^^

참, double형 뿐만 아니라 float형에서도 lf만 f로 바꿔서 해보시면 됩니다.ㅎ

이상 깨알같은 팁 포스팅이었습니다~!

다음에 뵈어요^^

by yagom

p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기  


↓↓↓저 열심히 썼는데 추천 한방 꾹 눌러주고 가시는 건 어떨까요? ^~^ 사랑합니다~ ↓↓↓ 

저작자 표시 비영리 변경 금지
신고
Posted by yagom


오늘의 주제


1. 변수 알아보기


세 번째 시간입니다.

안녕하세요! 야곰입니다.ㅎㅎ
벌써 세 번째 시간이네요 ㅎㅎㅎ
Objective-C는 C를 기반으로 하며 이런저런것들이 추가되고 빠지고 한 것이기 때문에 C에서 기초되어 쓰이는 것들이 많습니다. 그래서 오늘은 C에서 나오는 변수들에 대해 조금 알아보겠습니다.
C가 그냥 커피라면 Objective-C는 T.O.P라 이거죠 ㅋㅋㅋㅋㅋㅋㅋ
 

긴말 필요없고 본론으로 들어가죠 ㅋㅋㅋ


# 변수가 뭐냐?

변수라는 것은 자료를 담아 둘 수 있는 기억공간이라고 생각하시면 됩니다.
컴퓨터는 무슨 일을 처리하기 전에 주기억장치, 즉, RAM에 정보를 올려놓고 맞춰진 스케줄 대로 CPU에서 연산처리 하게 됩니다.(물론 상세히는 좀 더 복잡하고 다를 수 있지만 대충 그렇다고 생각해 두세요 ㅎ)
CPU는 기억력이 없고 계산만 하다보니 처리해야 할 정보들을 기억해줄 녀석이 필요한데, RAM이 그 역할을 하는것입니다.
그리고 프로그래머가 RAM에 정보를 기억할 공간을 할당해 준 것이 변수입니다.
이제 우리는 변수를 하나의 박스라고 생각해 봅시다.

일단 주제와는 약간 벗어나지만 박스는 일단 우리가 사용하던 사용하지 않던간에 항상 공간을 차지하기 마련입니다.
그렇기 때문에 우리는 박스를 필요 이상으로 많이 만들거나 필요 이하로 너무 적게 만들지 말아야 합니다... 뭐 일단 잊어두세요 ㅎㅎㅎ 아직은 그리 중요한 내용이 아니지만, 메모리를 많이 낭비하지 않으려면 변수는 최대한 많이 쓰지 않는게 좋겠죠?ㅎ

서론이 길었습니다..

그런데 문제는 박스의 종류가 몇 가지 있다는 것입니다.
사과박스에는 사과를 담아야 하고(돈은 담지 말아야죠... 그쵸?ㅋㅋㅋ), 귤박스에는 귤을 넣어야 합니다.
겉모양과 내용물이 다르면 컴퓨터랑 사람이 모두 헷갈리잖아요^^

즉, 실수형 변수에는 실수가, 정수형 변수에는 정수가 들어가야 하는 것입니다.
C에서 많이 쓰이는 몇 가지 자료형에 대해 알아봅시다.

# 자료형의 종류

 변수형 크기(32bit 프로세서) 자료형 출력 형식 지정자 
 int 4byte  정수  %d
 float 4byte  실수  %f 
 double  8byte  실수  %lf 
 char 1byte  문자  %c

위의 표에 적혀있는 자료형의 크기는 상자의 크기로 생각하시면 될 것 같습니다. 즉, 메모리에 하나의 자료가 저장될 때 할당되는 메모리 크기입니다.
float과 double은 같은 실수형 표현인데 왜 크기가 다른지 궁금하실 텐데요, 간단합니다.
더 많은 메모리를 할당하면 더 큰 수를 표현할 수 있기 때문입니다.
지금 표에는 각 변수들이 표현할 수 있는 숫자의 한계를 적어놓지 않았는데, C관련 책자 보시면 나옵니다. 굳이 여기서는 깊고 심오하게 들어가지 않겠습니다 ㅋㅋ
메모리가 차지하는 크기가 클 수록 표현할 수 있는 숫자의 크기가 증가한다는 것을 기억하시면 되구요. 또한 변수의 크기가 클수록 연산하는데 시간이 더 오래걸립니다(보통 평균적으로..^^). 하지만, 우리는 지금 일단은 그런건 제껴둡시다! 나중에 다 알아서 깨닫게 되실테니..ㅎㅎ
참고로 정수는 우리가 말하는... 숫자, 즉 -3, -2, -1, 0, 1, 2, 3 등등등 요런 숫자들을 말하구요, 실수는 우리가 흔히 말하는 소수... 0.1, -94.0342, 5.34, 3.14 등등 이런 숫자들을 말합니다~
출력형식 지정자는 대표적인 것들만 적어 두었습니다. NSLog에 찍을 때 쓰는거 말예요 ㅎㅎ
물론 NSLog에만 쓰이지는 않습니다^^
더 자세히 알아보고 싶으신 분들은 http://blog.naver.com/corea139/50038232196 를 참고하시길 바랍니다!!

자, 이제 그럼 무작정 한 번 실습해 봅시다~!

일단 새로운 프로젝트를 생성해 줍시다~

 
그리고 아래와 같이 코드를 작성해 봅니다^^
코드 작성 위치는... 지난 번 포스팅을 참고하세요^^
main함수 안에 autorelease풀 안쪽에 작성하시면 됩니다~
함수가 뭐냐구요?ㅋㅋ
그냥 지난 번 포스팅 보고 눈치껏!!
제가 캡쳐를 잘못해가지고 못보여 드리는거 절대 아닙니다요(ㅠㅠ)ㅋㅋㅋㅋㅋㅋㅋㅋ
 


실행 결과 화면입니다.


설명을 하자면,
처음에 변수들을 주욱 선언해줍니다.
int는 자료형 val_integer는 그 변수(상자)의 이름입니다.
즉 정수를 담을 수 있는 상자 하나를 만든 거예요.
밑에도 똑같이 float을 담을 수 있는 상자를 만들거예요~ 이름은 val_float...
float은 더블과 차이를 두기 위해 실수 뒤에 f를 붙여줍니다. float에 담을 숫자라고 표현해 주는거죠~
자, 이해되셨나요? 그리고 등호를 붙이고 옆에 숫자를 쓴다는 것은 그 상자에 그것을 담아두고 싶다고 말하는 것입니다.

그렇게 해서 NSLog로 화면에 찍어보니 상자에 담긴 내용이 보입니다~
그런데 좀 이상한게 보이죠?
분명히 char (문자형, Character)는 %c로 표현한다고 했는데, %d로 찍어도 뭔가 나오네요~
char형에는 ASCII, 즉 아스키 코드에 해당하는 숫자가 들어가 있습니다...^^
그래서 C의 아스키 코드값에 해당하는 67이 출력되는겁니다.
그래서 지금 선언되어 있는 val_char를
val_char = var_char +1;
이라고 더해줘도 에러가 나지 않습니다.
또한 val_char = 99; 라고 대입해줘도 됩니다. 물론 %c로 출력해보면 ASCII코드 99에 해당하는 문자가 출력될 거예요~
반대로 정수형의 숫자를 문자로 찍어볼 수도 있습니다.
후우~

여기까지 이해가 되셨는지 모르겠습니다~
이해가 되지 않으시면 폭풍 댓글 질문 주세요~@_@

그리고 아래에 xxx_array[x] 라는 식으로 선언해준 변수도 보이시나요?
이것은 배열이라고 합니다.
배열은 나중에 좀 더 심도있게 포스팅 할텐데요~
여기서는 이런게 있다~ 라고 아시면 됩니다.

배열은 똑같은 자료형을 사용하는 상자들을 쭈욱~~~~~~ 붙여놓은 것이라고 생각하시면 됩니다. 무조건 동일형 자료들만 배열로 만들 수 있습니다~!
선언 방법은 자료형을 표기한 후 배열이름[칸수] 로 선언해 주시면 됩니다.
말로 설명하니 너무 어려우시죠?

간단히 int int_array[3] 이라고 선언하게 되면

 int_array[0] int_array[1]  int_array[2] 

이런식으로 변수들이 생기게 되는 겁니다.
배열의 숫자는 0부터 시작해요~ 헷갈리지 마세요~

배열을 사용하는 방법은 코드를 참고해 보세요 ㅎㅎ

물론 여기서 배열을 이해하지 못한다고 좌절할 필요 없습니다!
나중에 다시 배우면 돼요 ㅎ 배열 이해 안가시는 분들은 일단 배열은 패스하세요!

char형의 배열 맨 마지막을 보시면 \0 이라는 문자를 집어 넣어 놓은 것을 보실 수 있습니다.
char형의 배열은 문자 하나하나 따로 빼서 볼 수도 있지만, 길게 보면 하나의 문장으로 볼 수도 있기 때문에 여기서 이문장은 끝! 이라는 표시로 \0을 넣어주게 됩니다. \0은 null이라고 표현합니다. null이라는 것은 뭐... 없다.. 비었다.. 이런 뜻입니다. 일단 패스^^

그래서 char형 배열은 문장(string)으로 출력해 보고 싶으면 %s로 출력해 볼 수 있습니다.
이제 위에 코드들이 조금 이해가 가실까요?
잘 이해가 가지 않으시면 C 책 가지고 계신거 하나쯤 참고하며 보세요~^^
책만큼 많은 모든 내용을 담을수가 없네요 ㅎ 여기서는 꼭 필요한 내용만 콕 찝어서 말씀드리려고 해요~
물론... 잔소리와 잡소리와 부연설명 투성이지만...ㅋㅋㅋ

자, 그럼 변수안의 내용물을 조금 바꿔치기 해 보도록 할게요~!
변수에다가 다른 숫자들을 대입해 봅시다.
위에 작성하였던 코드 아래쪽에 추가적으로 작성해 주세요~!


변경 된 후에 찍히는 로그 입니다.


변수안에 다른 수를 대입해 주면 원래 있던 내용물은 없어지고 새로운 내용물이 채워지게 됩니다.
즉, 새로운 정보를 입력하면 지난 정보는 사라지고 새로운 정보가 입력되는 거죠^^

어떠신가요... 좀 이해가 되시나요?

후악후악 힘드네요 ㅋㅋㅋ

추가적으로 unsigned라는 녀석을 보게 되실텐데요.
이녀석은 부호를 사용하지 않겠다는 거예요. 즉, 정수에도 음의정수 양의정수가 있는데, 양의 정수만 사용하겠다는 의미입니다.
왜냐면 같은 메모리 4byte를 사용할 때, 양의 정수만 사용하면 더 큰 수까지 표현이 가능하기 때문에 사용하게 됩니다.
어쨋든 unsigned는 음이아닌 양의 수만 사용할 때 사용하시면 됩니다!
효율적인 사용을 위해서^^

으아~~~~~~
오늘은 이만해야 겠습니다.
머리가 아프시죠??ㅎ
근데 뭐 이것만 하면 C 1/3은 했다고 보시면 됩니다 ㅋㅋ
그만큼 뭐 별거 없어요~~~~~~~~~~
몇 번이고 보면서 생각해 보시기 바랍니다.

궁금하신 점은 폭풍 댓글 질문 해주세요^^

자, 그럼 다음번에 뵙도록 하겠습니다 ㅎ


by yagom

p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기  


↓↓↓저 열심히 썼는데 추천 한방 꾹 눌러주고 가시는 건 어떨까요? ^~^ 사랑합니다~ ↓↓↓ 

저작자 표시 비영리 변경 금지
신고
Posted by yagom


오늘의 주제


1. 코드에 주석쓰기

두 번째 시간입니다.

안녕하세요! 야곰입니다.ㅎㅎ


# 주석

주석이 무엇인가 궁금하시죠?ㅎ
다른 블로그나 책에서 한 챕터를 잡고 주석을 설명하는 경우는 거의 없습니다만..
주석은 생각 외로 굉장히 중요한 역할을 하며, 프로그래밍의 첫 습관을 들일때 매우 중요한 녀석이라고 생각합니다. 물론 실무에서도 굉장히 중요합니다.
그래서 주석은 한 챕터로 잡고 설명하려 합니다!!
오늘 포스팅은 짧습니다만, 꼭 기억해 두셔야 할 포스팅입니다^^*

주석.. 코멘트.. 같은 말입니다!
주석은 코드에 아무런 영향을 미치지 않지만, 이 코드가 어떤 코드인지, 무슨 역할을 하는 것인지에 대한 설명을 적어놓는 메모 같은 것입니다.

그런데 이게 왜 중요하냐구요?
정말 간단한 프로그램이라면 굳이 필요 없을지도 모르지만, 나중에 백줄, 천줄, 만줄 ... 길어지는 프로그램이라면 내가 짜 놓고도 이 부분이 어떤 부분이었는지 기억하지 못하는 경우가 허다합니다 ㅋㅋㅋ
나는 기억력이 좋아서 아닐거라구요?
훗...!절대 그렇지 않습니다!
십수년 프로그래밍 한 고수분들도 꼭 적어두는 것이 주석입니다.
정말 코드 짜기도 바빠 죽겠는데 그런거 적을 시간이 어디있냐구요?
그래도 해야 합니다!!
나중에 현업에 가서 협업을 할때에도 굉장히 중요합니다.
내가 짜놓은 코드는 내가 해석하기 쉬울지 몰라도 다른 사람이 같이 일하면서 내 코드를 볼 때, 이해가 가지 않으면 일이 그만큼 늦어지고 심지어는 프로젝트가 망가지기도 하니까요.
제가 여기서 중요하다고 백만번 말해도 모자랄 만큼, 주석을 다는 것은 정말 중요한 습관입니다.
처음부터 주석을 다는 습관을 들여 놓으셔야지 나중에 후회하지 않고, 힘도 덜 드실것을 저는 장담합니다!!

이렇게 말하니까 주석 다는 것이 정말 어려운 것 같지만, 사실은 정말 간단합니다!
한 번 보시죠 ㅎㅎ

자... 화면에 보이는 저 녹색 글씨들 보이시죠? 저것들이 모두 주석입니다.
프로그램을 실행시켰을 때는 전혀 티가 나지 않지만, 작업하는 프로그래머는 보게 되는 저것이 주석입니다.
컴파일 할때 컴파일러가 주석은 모두 제외하고 컴파일 하게 됩니다.


위의 코드 실행 결과 화면입니다.
녹색으로 주석처리된 녀석들은 화면에 나오지 않죠???
코드 해석이 어려우시면 지난번 포스팅을 다시 한 번 보고 오세요^^


자... 조금 수정해서 보여드릴게요~!
어떻게 뭐가 달라졌는지 비교해 가면서 보세요^^


 결과 화면입니다~!

 
로그에 찍힌겁 보시면 깨알같은 팁도 있죠?ㅎㅎㅎ
여기에 직접 쓰지 않을테니 한 번 사용해 보세요^^ 


중요한 주석 처리하는 방법은 간단합니다!


// 주석......
이런식으로 주석을 작성하게 되면 한 줄이 주석처리 됩니다.
즉, 한 줄을 자신이 쓰고 싶은 말들을 써놓을 수 있죠.


또한, 
/* 주석...
여러줄
쓸 수 있는
주석... */ 


이런식으로 처리를 하게 되면 여러줄을 주석처리 할 수 있습니다.

참 쉽죠잉!?

위에 예시로 작성한 코드에서는 주석을 위나 아래에 달아놓았는데, 코드 바로 옆에 붙여 써도 무방합니다~
무슨말인지 잘 이해가 안가시면 직접 해보세요 ㅎㅎ
다시 한 번 말씀드리지만, 컴퓨터 안고장납니다잉 ㅋㅋ 폭발 안합니다잉 ㅋㅋㅋ
주석 다는 스타일을 같이 협업하는 사람끼리 정하거나, 자신만의 스타일로 작성해도 됩니다. 딱히 정해진 틀은 없어요^^ 

앞으로 제가 포스팅을 할 때 마다 주석을 일일히 달며 하지는 못할 거예요.
하지만, 여러분은 제 포스팅을 보며 공부 하실때마다 코드에 꼭 주석을 달아주세요!!
부탁드립니다~!
이것은 정말 중요한 습관임을 다시 말씀드립니다!
그래서 일부러 한 챕터를 내서 포스팅을 한거예요~

그럼 긴 잔소리는 여기까지만 하고 다음 번에 뵙도록 해요^^*

뿅!


by yagom

p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기  


↓↓↓저 열심히 썼는데 추천 한방 꾹 눌러주고 가시는 건 어떨까요? ^~^ 사랑합니다~ ↓↓↓
저작자 표시 비영리 변경 금지
신고
Posted by yagom


오늘의 주제


1. Hello, World 콘솔에 찍어보기


첫 번째 시간입니다.

안녕하세요! 야곰입니다.ㅎㅎ
iOS 개발 포스팅을 하다보니 조금 더 상세히 알고 싶거나, 기초를 좀 더 다지고 싶으신 분들이 있을 것 같아 이렇게 Objective-C 언어도 포스팅을 시작합니다.
사실 C 또는 C++만 잘 알고 있어도 iOS개발에 큰 무리는 없습니다.
물론 다른 언어를 써 보신분들도 마찬가지 일거구요.
절차지향적인 언어를 쓰던 분들은 헷갈리는 부분들이 있을텐데, 그것은 iOS 포스팅 중간중간 설명을 넣구요~
뭐, 여하튼!
절차지향 언어인 C언어를 하니 객체지향 언어인 Objective-C를 한 번 해볼까 합니다.
물론 C++, C#, JAVA 등등 많은 언어들이 있지만!
여기는 iOS 개발부터 시작한 블로그니깐욬ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
별다른 이유 없구요~ 한 번 해봅니다.
혹여나 필요한 다른 언어 있으시면 댓글 남겨주세요^^
잡소리 그만두고 이제 시작하도록 하겠습니다 ㅎㅎㅎ


# Hello, World !!
자, Objective-C 컴파일을 위하여 Xcode를 설치해 주세요~
 Xcode 설치 방법은 제 블로그 포스팅을 참고하시면 됩니다.

iOS개발하기 #1. 개발준비(1)  에서 '# Xcode설치' 를 참고하시면 되겠습니다^^


Xcode를 설치한 후 첫 실행화면입니다. 
Create a new Xcode project 를 선택해 줍니다.


여러 템플릿 중에 Mac OS X 템플릿 중 Application탭의 Command Line Tool을 선택하고 Next


Product Name을 MyFirstC로 지정해 주었습니다. 여러분들이 원하는 프로젝트명을 넣어주세요..^^
프로젝트는 하나의 프로그램이 완성되기 위한 단위라고 생각하시면 되겠습니다.
Type은 Foundation으로 지정해 줍니다.
Next를 누르시고 저장을 위한 위치를 지정해 주세요.

자, 프로젝트가 생성이 되었습니다.
대책없이 그냥 실행시켜 봅시다 ㅋㅋㅋ
화면 좌측 상단에 보시면 Run버튼이 있는데 클릭해 봅시다. 또는 단축키 커맨드+R입니다.


실행 결과 입니다.
뭔가 뿅 튀어나올 줄 알았는데 별거 없죠..?ㅋㅋㅋ
예.. 좀 시시하긴 합니다 ㅋㅋㅋ
화면 하단에 새로 올라온 창이 있는데, 디버그 영역입니다. 거기서 로그가 쫙 찍혀 나오는 곳이 디버그 콘솔입니다. 디버그 콘솔을 보면 뭐라뭐라 막 써있는데, 거기서 잠깐 보니 Hello, World! 라고 찍혀있는게 보입니다 ㅋㅋ
와우~
콘솔은... 음... 뭐 도스창, 아니면 터미널 등등 뭐 다 같은 개념으로 보시면 될거예요~
아! 디버그창이 제것과 같이 생기지 않았다면 화면 확대해서 잘 보세요 ㅋㅋ
제 디버그 콘솔 오른쪽 위에 보면 보기 옵션 버튼들이 있습니다.
두 개의 창이 나오는 가운데 녀석을 선택해 주세요~


근데 콘솔에서 우리는 Hello, World!만 보고 싶은데 시스템과 프로젝트 로그까지 찍혀나오니 어지럽지요?ㅎㅎ
그래서 우리가 보고싶은것만 보도록 합시다.
디버그 콘솔 왼쪽 위쪽에 All Output을 Target Output으로 변경해 줍니다.


그러고 나면 원하는 Hello, World!만 보여요 ㅎㅎㅎ


Xcode화면 좌측 파일 네비게션 영역에서 main.c파일을 클릭해 봅니다.


코드를 보면 NSLog(@"Hello, World!"); 이라고 작성되어 있을 텐데요~
아래 화면처럼 더 타이핑 해주고 실행해 봅시다.
아 그리고 줄마다 맨 끝에 붙는 것은 세미콜론 (;) 입니다.
우리가 글에서 쓰는 마침표라고 생각하시면 될거 같아요~
그렇다고 무조건 쓰는건 아니지만 대부분 코드안에서 줄이 끝날때 찍어주셔야 할거예요~


실행 결과 화면입니다.
별거없죠?ㅎㅎ 


  오늘은 간단히 콘솔화면에 출력하는거 하면서 놀아보았습니다 ㅎㅎ
그런데 화면에 보이는 초록색 글씨는 뭘까요?
하나도 안중요해 보여도, 무지하게 중요한 녀석중에 하나라고 할 수 있기에, 다음 번에는 그녀석에 대해 간략히 알아보도록 할게요~ 
다음번에 뵈어요^^* 

by yagom

p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기 


↓↓↓저 열심히 썼는데 추천 한방 꾹 눌러주고 가시는 건 어떨까요? ^~^ 사랑합니다~ ↓↓↓ 

저작자 표시 비영리 변경 금지
신고
Posted by yagom


티스토리 툴바