# 재미있는 언어 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. 연이 2014.06.11 11:35  댓글주소  수정/삭제  댓글쓰기

    좋은정보감사합니다^^

  2. 푸나 2015.12.16 16:46  댓글주소  수정/삭제  댓글쓰기

    NSString NSArray이런것들에 왜 NS가 붙는지 궁금했는데 의문점을 한방에 풀어주시네요!
    많이 배우고 갑니다.


오늘의 주제

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. Favicon of https://bikiniline.tistory.com BlogIcon 비키니라인 2012.04.24 13:20 신고  댓글주소  수정/삭제  댓글쓰기

    으음. 그러니깐 딕셔너리는
    c++에서 구조체 같은 거군요 ~! ... 아닌가 ㅠ

    근데 궁금한게 NSArray 를 사용할때요
    2차 배열은 어떻게 만드는지 궁금하네요
    으음... 어차피 배열에는 객체가 들어가는 거니깐..
    2개의 원소를 갖는 배열 객체를 만들고 그 객체를 원소로 갖는 배열을 만들면 그게 2차 배열이려나 ㅎㅎ

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.04.24 18:04 신고  댓글주소  수정/삭제

      구조체와 생김새는 비슷하지만, 객체라는 큰 차이점이 있고, 내부에도 객체만 들어갈 수 있다는 점이 다르죠..^^
      Objextive-C 에서도 C의 거의 모든 기능을 사용할 수 있습니다. ㅎ 그러므로 C에도 있는 녀석을 굳이 새로 만들 필요는 없겠죠 ㅎ

      NSArray는 기본적으로 다차원 배열을 지원하지 않습니다만, Array의 각 인덱스에 Array를 넣어준다면 그게 다차원 배열이 되겠지요..ㅎㅎ

      항상 들러주시고 관심 가져 주셔서 고맙습니다^^

  2. Favicon of https://bikiniline.tistory.com BlogIcon 비키니라인 2012.04.25 15:23 신고  댓글주소  수정/삭제  댓글쓰기

    c++의 경우에,
    1. A라는 구초체를 만든다 struct A{ 어쩌고 저쩌고 ...};
    2. A형 배열을 선언한다. A array[10];
    이렇게 해두면 사용할때 array[4].어쩌고 = xxx ; 뭐 이런식으로 접근하기도 편하고 값을 바꾸기도 편한데..

    objective c 의 딕셔너리는 좀 복잡하네요...
    NSMutableDictionary형 배열을 만들고 초기화? 해주고... 포함된 객체에 접근하는거 까지는 별 차이 없는데
    내용을 바꿔주는게 복잡하네요 ...

    1. objectForKey메소드를 이용해 오브젝트를 불러온다
    NSNumber *temp2= [numberDic[[string integerValue]-1] objectForKey:@"appearanceCount"];
    2. 형변환을 해준다.
    int a = [temp2 intValue];
    3. 하고싶은 작업?을 한다.
    a++;
    4. 다시 객체화 시킨다.
    NSNumber *b = [[NSNumber alloc]initWithInt:a];
    5. 넣는다 -ㅅ-;;
    [numberDic[[string integerValue]-1] setObject:b forKey:@"appearanceCount"];

    C++의 경우 한줄이면 끝나는걸 무려 5줄씩이나 써야 하네요 ㅠ ㅠ

    질문 1. 이렇게 하는거 맞나요 ..? ㄷㄷㄷ 한두줄에 깔끔하게 끝나는 메소드가 따로 있는지 모르겠네요 ... ㅠ ㅠ

    질문 2. 선언부에서 NSMutableDictionary *numberDic[45];
    이런식으로 배열을 잡았습니다..
    에러도 안나고 워닝도 없고.... 제가 원하는 작업을 잘 수행하는데 이런식으로 써도 무방한가요 .. ?

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.04.25 16:13 신고  댓글주소  수정/삭제

      1. 네, 맞습니다...^^ 숫자를 객체화 시켜 사용을 할 때 불편함이 있지요..^^ 그래서 때에 따라 구조체를 사용하는 방법도 좋은 방법이라고 생각합니다! 각 언어마다의 특징이라고 이해하면 편할듯 하기도 하네요..ㅎㅎ 어떤 언어에서는 이런점이 편하고 이런점이 불편하고 그런것이 있으니까요 ㅎ
      위에서 말씀하신 점은 딕셔너리 보다는 NSNumber의 특성 때문이라고 보시면 될 듯합니다^^~

      2. 사용하신 방법은 딕셔너리 포인터를 C스타일의 배열로 선언하셔서 사용한 것입니다.
      물론 그렇게 사용하셔도 전혀 지장은 없습니다. 포인터 하나하나마다 딕셔너리를 할당하고 초기화 하셔서 사용하시면 됩니다. NSMutableArray를 사용해도 좋지만, 아마 사용하신 방법이 속도는 조금 더 빠를거예요~^^*
      NSMutableArray를 사용하시면 객체 추가 삭제가 훨씬 더 쉽기 때문에 추가 삭제가 필요하다고 하면 이 방법이 더 좋다고 볼 수 있구요... 뭐 다양한 메소드를 이용해서 필요한 기능을 쓸 수 있기 때문에 적절히 판단하셔서 사용하시면 되겠습니다~

      충분히 적절한 답변이 되었는지는 모르겠습니다만, 짧은 지식으로 말씀드렸습니다^^;

      더 부족한 점 있으면 말씀해 주세요~!

      비가 많이 오네요. 동동주에 파전이 땡기는 날입니다 ㅎㅎ

    • Favicon of http://soooprmx.com/wp BlogIcon sooop 2013.06.14 09:58  댓글주소  수정/삭제

      Objective-C에서는 리터럴로 좀 더 간단하게, 배열/사전/숫자(NSNumber) 객체를 초기화할 수 있습니다. 리터럴은 쉽게 말하자면 @"acb"와 같이 축약된 문법으로 NSString을 만드는 것처럼 많이 써왔던 거구요.

      NSArray *anArray = @[ @"a", @"b", @"c"]; // 끝에 nil을 넣지 않습니다.
      NSDictionary *aDict = @{ @"key" : @"value", @"key2" : @"value2" } ; // 키:값 의 순서로 씁니다.

      NSNumber *aNum = @(0.5); // [NSNumber NumberWithFloat:0.5f];와 동일

  3. 인절미후후 2012.06.08 11:03  댓글주소  수정/삭제  댓글쓰기

    이거 그동안 어렴풋이 알면서 쓰던건데 이렇게 정리해주시니 너무 감사합니다.
    제가 자바를 조금 공부했었는데 키와값으로 저장하는거니까 자바의 컬렉션 프레임워크로는 List랑 Map같네요
    뮤터블과 디폴트의 차이도 잘 알게 되었습니다.
    항상 보는쪽의 입장을 잘 배려해주시는 레퍼런스 참조하는 부분을 익숙해지도록 자주 보여주시는것도 너무 좋은 점 같네요.
    픽커뷰 보다가 넘어왔어요
    감사합니다.

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.06.08 13:26 신고  댓글주소  수정/삭제

      인절미후후님
      항상 격려의 말씀 남겨주셔서 제가 힘이 솟습니다.
      정말 고맙습니다^^*
      저도 항상 읽는 입장에서 어떻게 하면 쉽게 다가갈 수 있을까 고민을 합니다만... 쉽지는 않네요^^
      부족한 점은 지적해 주시고 필요한 부분은 꼭 말씀해 주세요. 부탁드립니다 ㅎ
      행복한 주말 보내시길...^^

  4. 중동백곰 2012.06.15 19:12  댓글주소  수정/삭제  댓글쓰기

    잘 보고 있습니다..
    저기 제목에서 NSArray, NSMutableDictionary <== 요거 NSMutableArray 가 아닐까 사료되옵니다..

  5. 네모누리 2012.07.17 11:07  댓글주소  수정/삭제  댓글쓰기

    정말 유용하게 보고 있습니다.
    더 이상 강의 안 올라오나요?

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.07.17 23:58 신고  댓글주소  수정/삭제

      네모누리님~
      관심 정말 고맙습니다 :-)
      요즘 제가 진행중인 프로젝트로 인해서 포스팅을 못하고 있는데 월말쯤 되면 다시 재개할 수 있을 것 같네요 ㅠ_ㅠ
      원하는 부분 있으시면 말씀해 주세요. 틈틈히 준비하도록 하겠습니다~!

  6. 나에게넌 2012.08.13 15:19  댓글주소  수정/삭제  댓글쓰기

    NSNotification 강의 보다가 중간에..링크 타고 발도장 찍습니다..꾸욱

  7. 첼로와짜짜 2012.11.27 14:42  댓글주소  수정/삭제  댓글쓰기

    다 읽었다ㅎㅎㅎㅎ 정말 도움 많이되었습니다. 감사합니다. 또 업데이트되면 들릴께요. 건강하세요.

  8. 2012.12.09 01:55  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.12.09 12:15 신고  댓글주소  수정/삭제

      이건 C 코드이고, 무엇을 도와달라는 말씀이신지 잘 모르겠네요;;;
      오브젝티브C는 C코드드를 그대로 사용 가능합니다

  9. 무민 2013.01.18 12:13  댓글주소  수정/삭제  댓글쓰기

    설명을 간단명료하게 잘해주셨어요. NSArray, NSDictionary... 다른곳에서 강좌를 봤지만 잘 이해가 안갔었는데 이곳에서 이해하고 갑니다. 고맙습니다.

  10. Favicon of http://www.facebook.com/younhak.kim.9 BlogIcon 꺼북대장 2013.01.28 00:58  댓글주소  수정/삭제  댓글쓰기

    딕셔너리에대해 보다 자세히 배우고 갑니다.
    ~감사합니다.
    새로운 강좌가 기다려집니다 ㅎㅎ

  11. 2013.02.19 21:37  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  12. 여의도 2013.02.20 02:25  댓글주소  수정/삭제  댓글쓰기

    답변 주셔서 감사드립니다. 말씀하신 대로 해보도록 하겠습니다. 당장해보고 싶지만,, 헐,,, 벌써 2시가 넘었네요.... 편히 쉬시구요~~

  13. 2013.02.20 12:57  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.02.20 14:16 신고  댓글주소  수정/삭제

      T_T 죄송합니다...ㅠ

      제가 지금 병상이라 맥을 사용하기가 어렵습니다...

      몸이 정상이 아니라 코드를 보기가 좀 힘들어요 ㅠ 힘들게 올려주신건데 정말 죄송합니다...ㅠ

  14. 여의도 2013.02.20 14:49  댓글주소  수정/삭제  댓글쓰기

    몸도 안좋으신데 실례가 많았습니다. 쾌차하시길 기원해 드려요,,
    질문드린 내용은 나름 해결해보고 좋은 소식 전해드리겠습니다.
    그럼 또 뵙겠습니다. 꾸벅..

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.02.20 15:19 신고  댓글주소  수정/삭제

      아닙니다..ㅠ
      오히려 제가 도움을 드리지 못해 죄송스러울 따름입니다 ㅠㅠ
      핵심 부분을 메일로 한 번 보내봐 주세요, 다시 한 번 보도록 할게요.
      yagomsoft@gmail.com

  15. 여의도 2013.02.20 17:32  댓글주소  수정/삭제  댓글쓰기

    염치불구하고 메일 보내드렸습니다. ^^

  16. 여의도 2013.02.20 21:54  댓글주소  수정/삭제  댓글쓰기

    명쾌하게 해결해 주셔서 감사드립니다!!
    다음에 또 부탁드릴것 같은데요? ....
    편히 쉬시구요!!

  17. 여의도 2013.02.21 16:43  댓글주소  수정/삭제  댓글쓰기

    메일에 이어서~~~~ ㅎㅎㅎ

    네,, 그렇군요,,,
    그럼, reloaddata를 사용하면 앱이 알아서 데이터를 계속 갱신해서
    화면에 뿌려주는 건가요? (그럼 좋겠네요,,, 당겨서 새로고침 이런거 구현안해도 되니... )
    아니면 앱이 실행되고 한번만 reloaddata가 되는 것인지요?
    ㅎㅎㅎ

    질문은 끝이 없네요...

    아, 생각난김에 당겨서 새로고침 커리큘럼은 어떠세요?
    굉장히 복잡한거 같더라구요..

    수고하시구요~~~~

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.02.21 19:13 신고  댓글주소  수정/삭제

      :)
      reload를 호출할 때 마다 갱신합니다.
      자동갱신은 하지 않구요...^^;
      지금은 몸이 좋지 않아서 당분간은 추가 연재 계획이 없습니다 ...ㅠ
      한 두 번 도큐먼트 관련해서 포스팅이 진행될지도 모르겠지만... 그 이상은 아직 계획이 없습니다 ㅠㅠ 죄송해요..

  18. Favicon of http://blog.naver.com/yunzeman BlogIcon 사운드오션 2013.02.22 10:42  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 저희는 온라인_모바일 게임 음원 및 효과음 제작 업체입니다. 저희도 블로그를 운영하는데 yagom님의 심도있는 강좌를 저희 블로그에도 게시 할 수 있을까 해서 문의드립니다.
    아울러 저희가 게시하는 사운드 게시물도 yagom님께서 퍼오셔서 서로 어플 개발자분들께
    좀 더 다양한 정보와 도움을 주고자 합니다. yagom님과 저희가 서로 winwin 할 수 있는 전략적
    파트너가 될 수 있을것 같습니다. 혹 어떠신지 답변 부탁드립니다. ^^ RSS 열린 이웃으로 추가하였습니다.

  19. Favicon of http://sharphail.tistory.com BlogIcon 샤해 2013.03.19 11:32  댓글주소  수정/삭제  댓글쓰기

    덕분에 개념을 확실히 잡을수 있었네요 ㅎㅎ
    다른분들의 comment들도 도움이 되었습니다.
    감사한 마음과 함께 링크좀 담아갈게요 '-'



오늘의 주제

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. Favicon of https://winplz.tistory.com BlogIcon 윈플. 2012.03.28 15:17 신고  댓글주소  수정/삭제  댓글쓰기

    쉽게 잘 설명하셨군요.
    아마 (2)에서는 overriding에 대해서 다루 실 것 같군요?

    나중에 기회가 되신다면
    @property 를 하게 될 때 사용되는 retain, strong, weak 등에 대해서 정리한번 해주시면 좋을 것 같습니다
    생각보다 이유도 모르고 사용하는 사람이 많더라고요

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.03.28 17:24 신고  댓글주소  수정/삭제

      와우~ 역시 고수님은 눈치가 빠르십니다..ㅎㅎ
      들켜버렸네요+_+ㅋ
      흠...
      @property에 관한 설명은 아직 후일로 생각중이었는데, 고려해 보겠습니다.^^*
      사실 이번에 iOS 5.0에서 키워드들과 역할들이 변화되면서 조금 조심스럽습니다~ㅎ

  2. hyung 2012.11.19 13:18  댓글주소  수정/삭제  댓글쓰기

    와.. 야곰님 책하나 내심이 어떠신가요..
    솔직히 오늘 아침에 야곰님이 기초부터 다시 해보라고 하셔서
    어느세월에 그걸 하나.. 프로젝트 빨리 못하면 주임한테 혼나는데
    이러고 있다가
    그래도 속는셈치고 아침부터 계속 개념만 보다가

    딱 이 글 봤는데

    상속? 뭐지 그게.. 이러다가 뭔가 이거다!! 라는 삘이 와서 해보니
    제가 저번주부터 야곰님을 달달 볶던 그 문제가 해결 됬어요 ㅠㅠㅠ 너무 잘되요 ㅠㅠㅠㅠㅠㅠㅠ 아 행복해 ㅠㅠㅠ
    이래서 뭐든 기본이 없으면 안되는 거구나 싶더라구요
    히히힛 아무튼 너무너무 감사 드립니다.
    지금 완전행복함
    비행기타고 한국 돌아가서 식사라도 사드리고 싶은 심정임 ㅠㅠ

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.11.19 15:39 신고  댓글주소  수정/삭제

      ^^~ 저는 거짓말 하지 않습니다...ㅎㅎ
      기초를 쌓는 것이 가장 빠른 지름길입니다!
      앞으로 iOS 뿐만 아니라 어떤 프로젝트를 하더라도 꼭 잊지 않으셨으면 좋겠네요 ㅎ 아무리 바쁘고 촉박해도 정도를 걷는 것보다 빠른 지름길은 없다는 것을 ^^

      p.s 밥은 지금보다 훨씬 저에게 고마움을 느끼게 되는 순간이 오면 그 때 사주러 와주세요...ㅎㅎㅎ 1년이고 10년이고 20년이고 진심으로 기다리겠습니다 :)

  3. hyung 2012.11.19 16:35  댓글주소  수정/삭제  댓글쓰기

    정말 감사합니다 블로그 돌아보니 저만 이렇게 감사를 느끼는게 아닌거 같네요
    전 아직 어려서 잘 모르겠지만, 일도 하시면서 이렇게 틈틈이 관리 하시기도 정말 너무 힘드실거 같아요
    저같은 배우는 입장의 사람은 감사할 따름 입니다

    그나저나 산넘어 산이라고 저녀석 해결 했더니 또 다른녀석이 말썽이네요 ㅋㅋ..
    정말.. 하나하나 기능이 붙으면 재밌지만 그걸 붙이기가 정말 힘드네요^^..;;
    아무튼 힘내서 꼭 완성시키겠습니닷!~

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.11.19 17:05 신고  댓글주소  수정/삭제

      네,^^* 힘내시고 꼭 원하는 바를 이루시길 바랍니다!
      또 궁금한 것 있으면 언제든 말씀하세요 :)
      p.s. 제가 아마(아니... 확실히?) 동생일 것 같다는 생각이...ㅋㅋㅋ

  4. 첼로와짜짜 2012.11.26 18:48  댓글주소  수정/삭제  댓글쓰기

    잘봤습니다. 근데 상속부터 예제 클릭이 안되네요. 작아서 글씨가 잘 안보이네요 T^T

  5. formathead 2014.03.18 11:11  댓글주소  수정/삭제  댓글쓰기

    열심히 공부하고 있습니다. 너무 초보라 어디서 부터 시작해야 할지 막막했던차에 도움이 많이 되고 있습니다.

  6. 2017.08.24 16:56  댓글주소  수정/삭제  댓글쓰기

    죄송한데........
    이미지 크게 보기가 안되서.... 캡쳐부분을 하나도 모르겠어여...ㅠㅠㅠㅠㅠㅠㅠ



오늘의 주제

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. chosamong 2012.08.25 14:59  댓글주소  수정/삭제  댓글쓰기

    근본이 되는 부분을 소홀히 하면
    모래 위에 지은 집(?)

    완성도 높은 소스는 이름에 혼이 들어 있겠군요. ^^;

    강의 감사 꾸우벅 <(__)>

  2. hyung 2012.11.19 12:47  댓글주소  수정/삭제  댓글쓰기

    아하.. 그냥 아무 생각없이 언더바 쓰고, 대문자 소문자 마음대로 했었는데 어느정도 룰이 있었던 거군요!

  3. 첼로와짜짜 2012.11.26 16:44  댓글주소  수정/삭제  댓글쓰기

    어느정도 아는거네? 이 생각으로 읽었는디 굉장히 이팩트있네요. 이제 입문했는데 꼭 유의하겠습니다. 잘 읽었습니다.
    다 읽고있는중임돠ㅋㅋㅋ


오늘의 주제


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. Sio 2012.07.11 15:08  댓글주소  수정/삭제  댓글쓰기

    실수 표현할때 많이 버벅였는데 도움이 됬습니다~~~*^^*
    잘보고갑니다~!

  2. chosamong 2012.08.24 20:40  댓글주소  수정/삭제  댓글쓰기

    지금은 절대 기억 못하는
    까마득한 옛날의 기억
    다시 돼 새겨 보네요

    실력이 마구 업그레이드 되면 바로 써먹을 가르침 ^^
    횡설수설 되네요

    캄사. 꾸우벅