14. IOS SDK 다운로드
• 참고 사이트라해
• developer.apple.com/library/ios/navigation/index.html(개발자 문서)
• 개발자 문서에서 아이폰 앱 개발 필요한 모든 내용 찾을 수 있다해 -
사실 개발자 문서만 보면 다------ 된다해
13년 5월 23일 목요일
15. 개발자 포럼
Apple Developer Forums
http://devforums.apple.com/community/iOS - 돈 내야 됨+양키꺼
http://cafe.naver.com/mcbugi - 국내
http://www.iphoneos.co.kr - 국내
13년 5월 23일 목요일
16. 프로그래밍 기본 개념
• Objective - C의 기반이 되는 프로그래밍 언어는 C
13년 5월 23일 목요일
17. 프로그래밍 기본 개념
#include <stdio.h>
int main(void)
{
printf(“Hello Worldn”);
return 0;
}
13년 5월 23일 목요일
18. 프로그래밍 기본 개념
#include <stdio.h>
int main(void)
{
int c=10; // 변수
printf(“Hello Worldn”);
return 0;
}
13년 5월 23일 목요일
19. 프로그래밍 기본 개념
#include <stdio.h>
int main(void)
{
int c=10; // 변수
printf(“Hello Worldn”);
return 0;
}
void hello(void) // 함수
{ printf(“hellon”); }
13년 5월 23일 목요일
25. 프로그래밍 기본 개념
//
// main.m
// HelloWorld
//
// Created by cho dong heon on 13. 4. 30..
// Copyright (c) 2013년 cho dong heon. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int main(int argc, char *argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
! // HelloWorld의 실행 과정을 디버그 콘솔에 기록(Log hello world to the debugger console)
NSLog(@"Hello World"); //Hello World 문자 출력
! int retVal = UIApplicationMain(argc, argv, nil, nil);
! [pool release];
! return retVal; // 보통은 0, 0이 아니면 에러
}
13년 5월 23일 목요일
26. 프로그래밍 기본 개념
NSLog 함수는 printf 함수처럼 문자열 출력
- printf는 c의 문자열, NSString은 NSString 클래스를 참조하는 객체
의 문자열 출력(자세한 것은 나중에)
- NSLog는 디버거 콘솔에 문자열 출력 때 사용(아이폰 화면 ㄴㄴ)
13년 5월 23일 목요일
27. 프로그래밍 기본 개념
#import <Foundation/Foundation.h>
int main(int argc, char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];//메모리 참조 수 계산 방식 ARC(Automatic Reference Count)
[pool release];
@autoreleasepool //메모리 참조 수 계산 방식 ARC(Automatic Reference Count)
{
NSLog(@"Hello World!"); // 출력
NSLog(@"int : %i",10); // 정수 출력
NSLog(@"float : %.2f",0.1); // float 출력
NSLog(@"double : %f",3.14258); // double 출력
NSLog(@"c문자열 : %s","c hello"); // c문자열 출력 char a[10]=”hello”
NSLog(@"NSString 오브젝트 문자열 : %@",@"objective hello"); // NSString 오브젝트 문자열 출력 NSString *string=@”hello”
}
printf("Hi! This is printf!");
return 0;
}
13년 5월 23일 목요일
28. 프로그래밍 기본 개념
헤더 파일은 함수 혹은 메서드 원형들과 변수 선언을 포함
- 확장자 ‘.h’
소스 파일은 함수 혹은 메서드와 변수를 구현
- 확장자 ‘.m’
자세한 것은... 4장에서.
13년 5월 23일 목요일
37. 기본 자료형
• 자료형 지정->필요한 메모리 용량 & 변수가 표현하는 값의 범위
• ex) int -> short int, unsigned int, long int ...
• ex) double, float..
• char a[ ]= “hello” // NSString * a= @“hello” objective-c의 문자
배열
13년 5월 23일 목요일
47. 반복문 써보기
UIViewContorller 클래스의 수명 주기 관리 클래스 메소드들
- viewDidLoad : 뷰라는 템플릿을 처음 불러올 때 실행해야 할 동작 구성
- viewWillAppear : 뷰라는 템플릿에 보여질 내용을 구성
- viewDidAppear : 뷰 내용 보인 후 뷰에서 실행할 동작을 구성
- viewWillDisappear : 뷰 내용을 더 이상 사용 안할 때 실행하는 동작
- viewDidDisappear : 뷰 내용을 없을 때 실행하는 동작
-ViewDidUnload : 뷰라는 템플릿을 사용하지 않을 때 실행하는 동작
UIViewController::method
13년 5월 23일 목요일
48. 반복문 써보긔
- (void)viewDidLoad
{
// 부모 클래스에 veiwDidLoad 메서드를 실행한다는 메시지를 보냄
[super viewDidLoad];
for (int i=0; i<5; i++)
{
NSLog(@"i's value:%i",i);
}
int i=5;
while (i++<8)
{
NSLog(@"i's value: %i",i);
}
i=3;
do
{
NSLog(@"i's value : %i",i);
i++;
} while (i<3);
}
app실행시 바로 뜸!
MainViewController.m
13년 5월 23일 목요일
49. 반복문 써보긔
app실행시 바로 뜸!
- (void)viewDidLoad
{
// 부모 클래스에 veiwDidLoad 메서드를 실행한다는 메시지를 보냄
[super viewDidLoad];
// <Done> 버튼이 있는 있는 Flipside 뷰의 배경색을 지정
self.view.backgroundColor=[UIColor
viewFlipsideBackgroundColor];
int r=9;
//9가 할당된 r값을 출력하고 이를 3으로 나눈 나머지 값을 대입한 후
while 문의 논리적 조건을 확인하는 do문
do
{
NSLog(@"R's value:%i",r);
r/=3;
} while (r!=3);
}
MainViewController.m
13년 5월 23일 목요일
50. 반복문 써보긔
- (void)viewDidAppear:(BOOL)animated
{
//부모 클래스에 애니메이션 효과를 넣은 viewDidAppear 실행한다는 메
시지 전송
[super viewDidAppear:animated];
//Flipside 창을 종료하지 않음
BOOL quit = NO;
for(int i=0;!quit;i++)
{
NSLog(@"an endless loop without break...%i",i);
quit=YES;
}
}
FlipsideViewController.m
*참고!*
<info>버튼은
FlipsideViewController.h의 -
(IBAction)showinfo:(id)sender
리턴값(void)
인풋값 (BOOL타입)
13년 5월 23일 목요일
51. 조건문
• if (condition) { }
• if (condition) { } else if (condition) else { }
• switch (n) { case 1: break; case 2: break; default: break;}
13년 5월 23일 목요일
52. 배열 및 구조체
• type array_name[ count ];
• array_name==&array_name[0];
• type array_name[ count1 ][ count2 ]; //다차원 배열
13년 5월 23일 목요일
53. 배열 및 구조체
• struct 구조체이름 { ...; };
• struct hello { int hi; }; // 구조체 선언
• hello hi; // hello타입 hi 구조체 변수 선언
hi.hi=1; //hi구조체 내의 hi변수 접근
13년 5월 23일 목요일
55. 객체 지향 프로그래밍 &
절차 지향 프로그래밍
• 1990년대 전 : 절차적 프로그래밍 style
• 1990년대 후 : Smalltalk와 C++ 등 객체 지향 프로그래밍 style
13년 5월 23일 목요일
56. 절차 지향 프로그래밍
void main
케이크
만들기
재료섞기
재료모으기
오븐에 굽기
재료
케이크 반죽
데이터 흐름 단계 진행
1
2
3
4케이크
케이크
절차 데이터
13년 5월 23일 목요일
57. 객체 지향 프로그래밍
<객체 지향 분석>
절차 지향 분석과 마찬가지로 작업 단위와 데이터 흐름을 검토
-> 작업 단위를 구성하는 객체를 먼저 검토(절차는 문제를 정의한 후 작업 단
위를 함수로 구현) -> CLASS로 단위별로 묶는 것!..... 일까요...
13년 5월 23일 목요일
58. 객체 지향 프로그래밍
클래스와 객체
- 클래스는 객체를 나타내기 위한 template
- 객체는 클래스의 패턴을 실제로 구현
ex) 클래스 선언
typedef struct stockstruct
{
char *symbol;
char * name;
char * lastdate;
float price;
} stock;
ex) 객체 선언
stock astock; // stock의 인스턴스
stock mystock; // stock의 인스턴스
13년 5월 23일 목요일
59. OBJECTIVE-C 클래스
C 구조체>
클래스 이해에 도움
- real Class ㄴㄴ
Objective -c 구조체>
real 클래스는 데이터와 동작을 캡슐화
interface인 헤더 파일
implementation인 소스 파일
참고! 클래스 선언시 NSObject를 부모 클래스로 선언!
- 런타임 시스템 사용 위해서! -> NSObject에 포함
- 런타임 시스템은 메모리 관리와 메소드 탐색 등을 자동으로
해줌!
13년 5월 23일 목요일
60. OBJECTIVE-C 클래스
#import 헤더 파일 선언
@class 클래스 이름;
//@interface는 클래스 선언 시작 알림 - 헤더파일! 선언만 함. 구현이 아님
@interface 클래스 이름:부모 클래스 이름
{//인스턴스 변수는 기본적으로 @protected로 선언( C++로 private:)
<인스턴스 변수>
}
프로퍼티 지시자 (프로퍼티 속성) 프로퍼티 이름;
:
- (반환되는 자료형) 메서드 이름:매개변수
:
//@end는 지시자의 종료 알림
@end
#import <UIKit/UIKit.h>
#import "stockquote.h"
@interface StockQuoteWrapper: NSObject
{
NSMutableString * stockURL;
NSMutableData * recivedData;
NSURLConnection * theConnection;
NSURL * theURL;
NSURLRequest * theRequest;
}
@property (nomatomic, retain) NSURL * theURL;
-(void)buildURL: (NSString *)symbol;
-(void)doStockQuote: (NSDictionary *)dictionary;
@end
피피티 28쪽 ㄱㄱ싱
<선언부>
“stockquote.h”
“stockquote.m”
13년 5월 23일 목요일
61. OBJECTIVE-C 클래스
#import 헤더 파일 선언
@implementation 클래스 이름;
@synthesize 프로퍼티 이름;
-(반환되는 자료형)메서드 이름:매개변수
{
<메서드 동작 구현>
}
:
@end
#import "StockQuoteWrapper.h"
@implementation StockQuoteWrapper;
@synthesize theURL;
-(void)doStockQuote:(NSDictionary *)dictionary
{
-- 생략 --
}
-(void)buildURL:(NSString *)symbol
{
-- 생략 --
}
@end
피피티 28쪽 ㄱㄱ싱
<구현부>
“StockQuoteWrapper.m”
“StockQuoteWrapper.m”
13년 5월 23일 목요일
62. OBJECTIVE-C 클래스
<Bar.h>
#import <Foundation/Foundation.h>
@interface Bar: NSObject
{
int myAge;
NSString * myName;
}
-(void) myAge;
-(void) myName;
@end
<Bar.m>
#import "Bar.h"
@implementation Bar
-(void) myAge
{
myAge=1; // 인스턴스 변수(매개 변수)에 접근
NSLog(@"%i",myAge);
}
-(void) myName
{
myName=@"Hello";
NSLog(myName); //NSLog(@"%@",myName);
}
@end
example
13년 5월 23일 목요일
63. OBJECTIVE-C 클래스
#import "Bar.h"
@implementation Bar
myAge=1; // error! 인스턴스 변수(멤버 변수)는 메서드 안에서만 접근 가능
myName=@”"hello" // error! 인스턴스 변수(멤버 변수)는 메서드 안에서만 접근 가능
-(void) myAge
{
NSLog(@"%i",myAge);
}
-(void) myName
{
NSLog(myName); //NSLog(@"%@",myName);
}
@end
인스턴스 변수(멤버 변수)는 메서드(멤버 함수) 밖에서 접근 불가
example
13년 5월 23일 목요일
64. OBJECTIVE-C 클래스
#import <Foundation/Foundation.h>
#import "Bar.h"
int main(int argc, char *argv[]) {
@autoreleasepool //NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];[pool release];과 같다.
메모리 자동 관리
{
Bar * myAge = [[Bar alloc] init]; //동적 메모리 할당하며 Bar타입 myAge 객체 선언
Bar * myName = [[Bar alloc] init]; //동적 메모리 할당하며 Bar타입 myName 객체선언
[myAge myAge]; //myAge 객체에서 myAge 메서드(멤버 함수) 호출(메세징) -> C스타일 myAge->myAge()
[myName myName]; //myName 객체에서 myName 메서드(멤버 함수) 호출 (메세징) -> C스타일 myName->myName()
} //autoreleasepool 나오면서 동적 메모리 해제
return 0;
}
example
<참고>
@protected - 메서드에서 인스턴스 변수 선언 때, 해당 클래스 및 서브 클래스에 선언된 인스턴스 메
서드가 인스턴스 변수에 접근 가능
@public - 클래스 메서드 제외하고 어떤 메서드에서든 인스턴스 변수에 접근 가능(public:)
@package - 클래스를 구현하는 이미지 안에서 64비트 이미지를 대상으로 인스턴스 변수에 접근 가능
@private - 클래스에서 선언된 메서드만 인스턴스 변수에 접근가능. 서브 클래스의 메서드 접근 불가
13년 5월 23일 목요일
65. 객체 지향 프로그래밍 - 동작
So... 클래스 vs 인간
클래스==인간
객체==우리들(너, 나)
클래스가 가지는 데이터(인스턴스 변수==멤버 변수)==심장, 폐, 뼈, 근육 등
클래스가 가지는 행동(메서드==멤버 함수)==달리고, 뛰고, 걷고, 건너뛰기
13년 5월 23일 목요일
66. 객체 지향 프로그래밍 - 동작
example
주식 구매 프로그램을 구현해 보자.jongbo
13년 5월 23일 목요일
67. 객체 지향 프로그래밍 - 동작
example 1. 프로젝트를 만들어보자
13년 5월 23일 목요일
68. 객체 지향 프로그래밍 - 동작
example 2. 클래스 추가
Model 폴더 추가
13년 5월 23일 목요일
69. 객체 지향 프로그래밍 - 동작
example 2. 클래스 추가
TradingSystem.m만 추가해도
TradingSystem.h까지!
13년 5월 23일 목요일
70. 객체 지향 프로그래밍 - 동작
example 2. 클래스 추가
클래스 파일 추가하시오
Stock.h & Stock.m
Storage.h & Storage.m
TradingSystem.h &TradingSystem.m
Purchase.h & Purchase.m
13년 5월 23일 목요일
71. 객체 지향 프로그래밍 - 동작
example 2. 클래스 추가
<storage.h>#import <Foundation/Foundation.h>
@class Stock; //Stock 클래스 참조
@interface Storage : NSObject
{
}
@end
<TradingSystem.h>#import <Foundation/Foundation.h>
@class Stock; // Stock 클래스 참조
@interface TradingSystem : NSObject
{
}
@end
<Purchase.h>#import <Foundation/Foundation.h>
#import "Stock.h" // 앱 실행 시 Stock 클래스 사용
#import "Storage.h" // 앱 실행 시 Storage 클래스
사용
@class TradingSystem; // 앱 실행 시
TradingSystem 클래스 참조
@interface Purchase : NSObject
{
Stock * myStock; //Stock 클래스에서 참조할 수
있는 인스턴스 변수
Storage * myStorage; // Storage 클래스에서
참조할 수 있는 인스턴스 변수
TradingSystem * myTradingSystem; //
TradingSystem 클래스에서 참조할 수 있는 인스턴스 변수
}
@end
storage.h TradingSystem.hPurchase.h
(점선) 참조
(실선) 사용
Stock.h
<storage.m>#import "Storage.h"
#import "Stock.h"
@implementation Storage
@end
13년 5월 23일 목요일
72. 참고...보자 (@CLASS VS #IMPORT)
@class는 단순 참조로서 @interface로 함수 선언부에서는 참조 가능하나
@implementation함수 구현부에서는 참조 불가
#import는 클래스 참조와 구현이 모두 가능하게 한다.
다음 페이지 <클래스 지시자>에서 자세히 알아보자.jungbo
@class와 #import 구분의 실질적 이유는 순환 종속성을 완화시키기 위하여!
13년 5월 23일 목요일
73. 클래스 지시자
Foo.h Bar.h
myFoo myBar
두 클래스는 서로에 대해 알아야 함
모두 #import로 서로를 참조시 에러 발생! (무한 참조와 같아!)
Bar.h Foo.h
Foo.h Bar.h
... ...
#import #import
13년 5월 23일 목요일
74. 클래스 지시자
Foo.h Bar.h
myFoo myBar
해결 방법! 헤더파일(선언부 @interface)에서는 @class로 참조
구동파일(구현부 @implementation)에서 #import로 삽입!
Foo.m
Bar.h
Foo.m
Foo.hBar.h Foo.h
#import #import@class @class
13년 5월 23일 목요일
75. 클래스 지시자 - 전처리기와 지시자
지시자는 ‘@’
전처리기는 ‘#’
지시자는 컴파일러에게 지시해주는 것!
전처리기는 필요한 기능의 소스 코드를 컴파일 하기 전에 먼저
컴파일 해서 소스 코드에 붙여 넣기
13년 5월 23일 목요일
76. 메서드와 메시징
- (NSMutableString *) buildHelloString: (NSString *)personName;
return type
클래스 메서드는 +,
인스턴스 메서드는 - 부호
method name
중요! 매개 변수를 가지는
메서드의 경우 이름 바로
뒤에 콜론을 사용하며 매
개변수를 가지지 않는 메
서드는 콜론을 생략
(buildHelloString: 이 이름!
- 콜론도 이름의 부분)
Argument type and name
메서드를 사용할 때 사용하는 매
개변수의 자료형과 이름
메서드 선언
13년 5월 23일 목요일
78. 클래스 메서드와 인스턴스 메서드
Class method == JAVA’s static method
클래스 메서드는 객체의 생성 여부와 관계 없이 내부에 선언한
메서드를 사용할 수 있는 것이 클래스 메서드!
인스턴스 메서드는 객체에 의존함. 클래스의 인스턴스 변수와
구현부에서 생성하는 어떤 클래스의 객체를 인스턴스 메서드
내에서 사용 가능
13년 5월 23일 목요일
85. 복수의 매개변수를 갖는 메서드
<C style>
doIt("Billy Cosby","Leonard Part 6",37);
<Objective-C style>
[myMultiple doIt:@"Billy Cosby" movieName:@"Leonard Part 6" timesSeen:37];
-----------------------------------------------------------------------------------------------
-(void)doIt:(NSString *)actorName movieName:(NSString *)value timesSeen;(int)times
{
NSLog(@"%@ is my favorite actor in the movie %@, I saw it %i times",actorName, value,times);
}
13년 5월 23일 목요일