작업물2011. 3. 16. 11:54

Xcode 를 실행하여 Window-based Application 템플릿으로 새 프로젝트를 생성한다.



프로젝트 명은 HelloiPhone 으로, Core Data 사용여부 체크는 해제한다.


HelloiPhoneAppDelegate.h : 헤더, 클래스 정의

HelloiPhoneAppDelegate.m : 모듈, 클래스 구현

MainWindow.xib : 인터페이스 정의


이렇게 세 파일이 만들어졌다.

 

HelloiPhoneAppDelegate.h 파일에서 아래와 같이 코딩.

#import <UIKit/UIKit.h>


@interface HelloiPhoneAppDelegate : NSObject <UIApplicationDelegate> {
    UILabel *myText;
    BOOL txtState;
}


@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UILabel *myText;
@property BOOL txtState;


- (IBAction)changeText:(id)sender;

@end 


HelloiPhoneAppDelegate.m 파일에서 아래와 같이 코딩.

#import "HelloiPhoneAppDelegate.h"


@implementation HelloiPhoneAppDelegate


@synthesize window=_window;
@synthesize myText, txtState;


- (IBAction)changeText:(id)sender{
    if(txtState){
        myText.text = @"Hello, World";
        txtState = NO;
    } else {
        myText.text = @"Hello, iPhone";
        txtState = YES;
    }
}


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    [self.window makeKeyAndVisible];
    return YES;
}

… 이후 생략 

 

MainWindow.xib 에서 그림과 같이 객체 생성




Hello, World 는 UILabel 을, Change Text 는 UIButton 객체이다.

 

Connections Inspector 에서 HelloiPhone App Delegate 를 선택, Outlet 과 Action 을 연결한다.


 


myText 와 Label 을, changeText 와 Button 의 Touch Up Inside 를 연결.

 

모두 저장하고 Build And Run.



change Text 버튼을 누를 때 마다 Label 의 글이 변하는 것을 확인할 수 있다.


아이폰 프로그래밍 (객체 지향 프로그래밍) 을 위해서는 MVC 패턴에 대해 이해할 필요가 있다.



MVC 패턴?

MVC (Model-View-Controller) 패턴을 사용하면 사용자 인터페이스로부터 비즈니스 로직을 분리하여 애플리케이션의 시각적 요소나 그 이면에서 실행되는 비즈니스 로직을 서로 영향없이 쉽게 고칠 수 있는 애플리케이션을 만들 수 있다 (@위키백과;모델-뷰-컨트롤러).

 

MVC 패턴의 예

예를 들자면 이런 상황에서

  • 더러워진 옷이 있다.

(세탁을 하기로 한) 더러워진 옷 = 빨랫감

세탁기에게 빨래를 시키기 위해서 세탁기의 기능 버튼을 이용한다 (물 높낮이, 강약, 탈수 등).

세탁기는 주어진 빨래와 주어진 기능을 토대로 빨래를 하고 끝나면 세탁된 옷을 돌려준다.


더러워진 옷은 그 종류가 다양하며 그 자체로는 (더러워졌으므로) 사용할 수 없다. 고로, 더러워진 옷은 세탁이라는 행위를 통해서 사용가능한 의류가 된다. 프로그래밍의 관점에서 더러워진 옷은 일종의 데이터 ( = Model) 라고 볼 수 있다.

기능 버튼은 사람과 세탁기의 중간 역할을 한다. 세탁기 스스로는 어떤 행위도 할 수 없고 사람 또한 임의로 전기신호나 다른 물리력을 통해 세탁기를 움직이게 할 수 없다. 기능 버튼은 사용자 인터페이스 ( = View) 라고 할 수 있다.

세탁기는 어떤 종류의 더러워진 옷이 주어져도 빨래를 해야한다. 고로, 옷에 독립적이어야 한다. 세탁기는 일을 수행하는 입장에서 비즈니스 로직 ( = Controller = Class) 이라고 볼 수 있다.

 

MVC 패턴의 이점

M, V, C 가 각각 어떤 것들인지 감을 잡았으니 이런 생각을 해보자.

더러워진 옷은 세탁이라는 행위 말고도 그냥 버린다던지 걸레로 만든다던지 하는 다른 차원의 일을 할 수 있다. = 프로그램 상에서 가공하고자 하는 데이터는 프로그램이 참조/변환할 수 있지만 프로그램 자체에 종속적이지는 않다.

기능 부분의 남은 세탁 시간을 표시하는 부분의 패널은 경우에 따라 냉장고의 온도를 표시하거나 저울의 중량을 표시하는 데에 사용될 수도 있다. = 뷰는 사용자에게 가장 밀접하며 MVC 패턴 중 가장 상호 의존도가 높은 편이며 재사용의 범위가 다른 것들에 비해 좁다. 따라서 새로운 프로그램을 만들 때 가장 높은 빈도로 신규 생성되는 패턴이다.

세탁기를 만드는 공장에서 매년 새 제품을 개발해 판매할 때 모든 제품의 기능 버튼을 동일하게 만들 수는 없다. 하지만 궁극적으로 세탁은 ‘물을 넣고-통을 돌리고-탈수 한다’ 라는 공통의 행위를 만족시켜야 한다. 세탁기 제조 회사에서는 이러한 공통행위를 위한 부품을 미리 만들어 놓고 새로운 제품을 개발할 때 마다 기능 버튼만 바꿔서 세탁기를 만드는 것이 훨씬 효율적일 것이다. = 특정 기능을 하는 클래스를 만들어 둔다면 그 기능을 사용하는 모든 프로그램은 해당 클래스를 그냥 가져다 씀으로써 개발 비용을 절감할 수 있다.

 

MVC 의 측면에서 본 우리가 만든 앱

Hello, World – Hello, iPhone 프로그램은 MVC 패턴을 제대로 적용하기에는 그 단위가 너무 작지만 (굳이 지정해야 한다면) 모델은 Hello, World / Hello, iPhone 이라는 문자열, 뷰는 xib 파일, 컨트롤러는 클래스 파일로 볼 수 있다.

 

IBOutlet, IBAction – Connection 에 관하여

인터페이스 빌더에서 생성한 Label 객체에 IBOutlet 으로 선언해 둔 myText 를, Button 객체에 changeText 메소드를 연결하는 행위는 뷰와 컨트롤러의 접점을 만들어 줌 으로써 각각의 패턴에서 서로를 인식할 수 있도록 하기 위함이다. 이렇게 함으로써 클래스 파일 (=컨트롤러)은 다른 모양의 xib 파일에 적용해도 IBOutlet 과 IBAction 을 적절히 연결하기만 하면 얼마든지 재사용 가능하다. 

IBOutlet 은 인터페이스 상의 특정 객체와 클래스 내 객체변수의 연결 고리가 된다. 클래스 내에서 인터페이스 상의 객체를 가르키기 위해서는 인테페이스 상의 객체를 식별할 수 있는 객체변수가 있어야 하는데 이 객체변수를 IBOutlet 이라는 키워드로 정의해 두는 것이다.

IBAction 은 IBOutlet 과 비슷한 개념으로 인터페이스 상의 특정 객체의 상태/동작에 반응하는 메소드를 선언하는 키워드 이다.

 

@property 와 @synthesize

클래스 내에서 사용되는 객체 변수는 getter/setter 라는 방식을 통해 그 값을 참조/할당 한다. Objective-C 2.0 이전까지는 이러한 접근자 메소드를 직접 만들어 주었어야 했는데 2.0 부터는 @property 키워드를 통해 해당 객체 변수가 접근자 메소드를 이용해 값의 참조/할당이 이루어진다고 지정할 수 있다. @synthesize 키워드는 이러한 접근자 메소드가 모듈 내에서 자동적으로 생성됨을 알리는 역할을 한다. 즉, 두 키워드를 이용하고 컴파일을 하면 바이너리 단 에서는 프로그래머가 일일이 입력하지 않은 접근자 메소드들이 자동으로 프로그램에 합성된다.

 

@property 의 용법

@property 키워드를 보면 nonatomic, retain 과 같은 속성들과 함께 사용됨을 알 수 있는데 그 속성의 종류는 아래와 같다 (@Outsider's Dev Story).

  • getter=getterName - getter의 이름을 getterName로 지정
  • setter=setterName - setter의 이름을 setterName로 지정
  • readwrite - 기본동작으로 getter와 setter를 모두 생성
  • readonly - getter만 생성. 값을 할당하려고 하면 컴파일 오류 발생
  • assign - 기본동작이며 setter가 간단한 할당을 사용. (예 location = where;) 객체를 소유할 필요가 없을때 사용.
  • retain - assign과 비슷하지만 레퍼런스 카운트를 증가시킴. 포인터객체를 할당할 경우에 외부에서 객체가 릴리즈되어 파괴된 객체를 참조하는 문제를 막기 위해 클래스가 멤버객체를 소유하도록 레퍼런스 카운트를 증가시킨다.(이전 값은 release)
  • copy - 할당하는데 객체의 복사본을 사용. 포인터 객체의 경우 레퍼런스의 값이 바뀌어 프로퍼티의 값이 바뀌는 걸 막기 위해 setter에서 복사본을 만들어서 할당
  • nonatomic - atomic이 기본동작. 멀티 스레드 환경에서 동시에 여러 스레드에서 하나의 프로퍼티에 접근하려면 문제가 생기는데 이를 보호하기 위해 atomic 을 사용. 단일 스레드 환경에서는 nonatomic 을 사용


Posted by cloim
작업물2011. 3. 8. 20:14

환경준비

맥, Xcode

 

Objective-C

C 에 기반, Smalltalk 에서 Java 와 Objective-c 로 갈라져 나왔다

@문자를 사용한 추가적 문법

@property 키워드를 이용해 get/set 처리

 

클래스 선언 (헤더, .h)

@interface 클래스명 : 슈퍼클래스 {

    인스턴스 변수 선언

}

- (리턴타입)인스턴스 메소드 명:매개변수 선언

@end

 

클래스 구현 (모듈, .m)

@implementation 클래스

~ 헤더에서 선언한 것들을 구현 ~

- (리턴타입)인스턴스 메소드 명:매개변수 선언

{

    내용

}

@end


기본문법

[object message:parameter];

 

IBAction, IBOutlet

IBAction : Interface Builder 에서 그려준 객체 중 동작을 처리하는 객체들에 대해 사용자의 인터랙션에 따라 메소드를 정의하는 키워드

IBOutlet : Interface Builder 에서 그려준 객체를 소스상에서 판별 할수있게 하는 키워드, IB – Xcode 로의 접점

 

액션 메소드의 일반적인 형태

- (IBAction) 메소드명:(id)sender;

 

아웃렛의 일반적인 형태

@property (nonatomic, retain) IBOutlet 객체클래스명 *객체명;

 

Outlet 을 연결하는 방법

객체의 connection 에서 App Delegate 로,

App Delegate 의 connection 에서 객체로

아웃렛은 App Delegate 에서 컨트롤 드래그하여 객체로

액션은 객체에서 App Delegate 로 컨트롤 드래그

 

Object 의 생성과 소멸

alloc : 메모리에 자리 잡게한다, init : 초기화 –> retain count : 1

retain count 가 0 이상이면 메모리 상에 살아있고 0 이 되면 소멸된다.

retain   :  –> retain count : 2

release :  –> retain count : 1

 

SandBox

어플리케이션은 보호된 영역 내에서만 리소스에 접근할 수 있다.

Posted by cloim
리뷰2011. 2. 19. 10:29

난 자질구레한걸 싫어한다.

App Store 에 차고 넘치는 일정관리, 주소록 어플들을 거들떠도 안보는 이유는 아이폰의 기본 기능으로도 충분하기 때문이다(물론 그 어플들이 안좋다는게 아니다. 내 수준이 그렇게까지는 필요없단 얘기지).


기본 기능 만으로도 충분하다고 여기는 이유가 하나 더 있다. 바로 포털들의 웹 서비스 때문이다.

현재 내가 알고있는 것만 으로도 구글, 네이버, 다음이 아이폰과 연동되는 주소록/캘린더 서비스를 하고 있다(메일은 말할것도 없지만 메일은 안쓴다. 스팸이 너무 많아서 -_-).


하 루 왠종일 컴퓨터 앞에 앉아있는 나로써는 컴퓨터 앞에 있을땐 컴퓨터에서 관리하고 그 외 이동중이거나 환경이 여의치 않을 때 아이폰을 이용해 관리하는 것이 아주 매력적이었다. 다음은 위에서 언급한 3사의 동기화 서비스를 이용한 뒤 내가 느낀 점들을 요약한 내용이다.


높은 호환성의 구글, 현지화는 언제쯤?

처음 연동해서 쓴 곳이 구글이다. 아마도 현재도 많은 아이폰 유저들이 구글과 캘린더/주소록을 연동해서 사용할 것이라고 생각한다. 구글은 일단, 다 좋다. 여기가 미국이 아니라는것만 빼면.

애 플의 대부분의 서비스들은 구글과 연동이 잘된다. 아이폰 뿐만 아니라 맥북에서도 기본 캘린더인 iCal 과 연동할수 있는 곳은 (이 글에서 언급하는 곳 중) 구글이 유일하다. 근데 이놈은 음력을 지원하지 않는다. 이게 병맛인거다. 이래저래 어찌저찌하면 음력캘린더를 추가해서 쓸수 있는 방법이 있긴한데 귀찮다. 게다가 뭐랄까- 확 내키지 않는 석연치 않은 구석이 있다.

일 정관리나 주소록에 관한 내용은 아니지만 메일의 경우에도 한글이 왕창 깨져버린다(이것도 IMAP 으로 설정하면 된다고 했던 기억이 있는것도 같다). 사실 따지고 보면 구글도 할말은 있다. 음력의 경우 계산할 수 있는 로직이 정해져 있는게 아니라고 들었다. 음력계산이 수식으로 딱 떨어지는게 아니라더라. 그래도 그렇지. 네이버나 다음은 서비스하는데. 그들이 노가다로 매년 음력을 집어넣고 있던, 아니던 서비스 하고 있는 곳이 있는 이상에야 입이 열개라도 할말은 없는거다. 메일에 한글이 깨지는것도 그렇다. 이건 보내는 쪽에서 언어설정을 안해놔서 그런거란다. 이런 ㅅㅂ. 위에도 했지만 또 얘기한다. 다른 애들은 잘만 되던데? (사실 그런 표준 안지키는 우리도 문제다)

음력, 한글에 대한 제대로된 지원- 뭐 이런 현지화만 제대로 되어 준다면 두말않고 바로 구글로 갈아탄다. 사실 난 검색도 구글에서 더 많이 한다. 구글신님. 부탁해. 제발 -_-


의지는 좋은데... 다음

구 글에서 갈아탄게 다음이다. (아마도 내 기억으로는) 국내 포털중 처음으로 아이폰과 동기화되는 서비스들을 내놓지 않았나 싶다. 스마트폰 붐이 일면서 포털 판도를 뒤엎을 전략이었다고, 실제로 그 전략은 어느정도 성과를 거두었다고 생각한다. 다음이 제공하는 여러 서비스들이 아이폰을 통해서 사용되고 있다. 나도 아이폰에서 지도는 다음지도만 쓴다. 다음 캘린더를 쓰면서 마음에 안들었던건 딱히 없다. 그치만 사용하다 보니 한계가 온다. 인터넷 첫 화면이 네이버인 나, 국내 자료 검색은 (지식인의 질적 하락에도 불구하고) 아직까지 네이버가 탑이라고 생각하는 나로써는 네이버와 다음을 왔다갔다하며 인터넷을 사용하기가 영 껄끄럽고 귀찮았던 거다.

다음을 응원한다. 응원하는데 내 스스로 적극 사용하기는 애매한 수준이다. 네이버까지 캘린더/주소록 서비스를 하는 마당에 굳이 불편함을 감수하면서 다음 캘린더를 쓸만큼의 메리트가 없다. 요때는 iCal 연동따위는 생각하지도 않았는데 지금이라도 다음이 iCal 과 연동 서비스를 한다면 심각하게 고려해 볼 의향은 있다.


네이버, 건방지게 굴면 혼난다

마 지막으로 옮겨온 곳, 현재도 사용하고 있는 캘린더/주소록 서비스는 네이버의 그것이다. 위에서 열거한 이유 덕에 결국엔 마지못해 네이버로 옮겼다. 나는 사실 네이버를 좋아하는 편이 아니다. 한창 지식인이 광풍을 일으키며 네이버를 단숨에 정상의 자리에 올려놓고 나 스스로도 지식인을 스승님이라고 칭하던 시절엔 그런 생각을 못했는데 사용하다보니 심각하게 자사 위주로 서비스를 제공하는게 꼴뵈기 싫다. 게다가 벌려놓은 일은 많으면서 찬찬히 뜯어보면 제대로 돌아가는건 별로 없다(근래에 사용하면서 제일 답답한 것중에 하나가 네이버 가계부다. 이건 뭐 IE 에서만 돌아가고 전월 잔액 이월도 제대로 안되고 이래저래 병맛이다). 점점 웹은 개방의 형태로 발전해 나가는데 네이버는 그런 서비스를 품고 지들꺼만 쓰라고 한다. 때문에 사업의 영역은 넓어지는데 일부 메이저 서비스만 신경쓰다보니 겉절이들이 많다. 영악하고 재수없다. 그래도 할수 없다. 그나마 제일 입맛에 맞고 익숙해져있는 곳이 여기니까.

오늘 네이버에 제안 메일을 보냈다. iCal 좀 연동해서 쓸 수 있게 해달라고.

이런 장문의 글을, 앞뒤 제대로 안맞는 글을 주저리 주저리 쓰고 있는 이유도 그거다.

iCal 좀 쓰게 해달라고. 제발 -_-

Posted by cloim