objective c 기초
=============== 반환값, 파라미터가 객체일때 표기법
-
반환값, 파라미터가 객체 : 클래스 이름과 * 을 사용한다.
- (NSString *)uppercaseString;
-
구조체: * 없이 사용
- (NSRange)rangeOfString:(NSString *)aString;
=============== 객체 생성하기
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSObject *obj1 = [[NSObject alloc] init]; // 반환값이 객체이기 때문에 *변수 사용.
NSLog(@"Object : %@", obj1);
NSObject *obj2 = obj1;
NSLog(@"Obj2 : %@", obj2);
}
return 0;
}
=============== 지역변수 전역변수
ViewController.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@property (nonatomic,strong) NSString *name;
@end
ViewController.m
#import "ViewController.h"
@interface ViewController ()
@property(nonatomic, strong) NSString *vehicle;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"이름: %@" , self.name);
self.name = @"anna";
NSLog(@"이름: %@" , self.name);
_name = @"bob";
NSLog(@"이름: %@" , _name);
[self setName:@"cant"];
NSLog(@"이름: %@", [self name]);
}
출력
ObjectiveCAlert[1414:212708] 이름: (null)
2018-07-28 10:51:53.207975+0900 ObjectiveCAlert[1414:212708] 이름: anna
2018-07-28 10:51:53.208148+0900 ObjectiveCAlert[1414:212708] 이름: bob
2018-07-28 10:51:53.208421+0900 ObjectiveCAlert[1414:212708] 이름: cant
======================= 지역변수 전역변수
Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
//지역변수라서 같은 클래스 안에서 만 접근가능하다.
BOOL isInsecure;
}
//전역변수라서 어디에서든 접근가능하다.
@property (nonatomic,strong) NSString *firstName;
@property (nonatomic,strong) NSString *lastName;
//전역메서드 - 이곳에 작성안해주면 viewcontroller 즉 다른 클래스에서 접근할 수 없다.!
-(void)test;
@end
Person.m
#import "Person.h"
@implementation Person
-(void)test{
self.firstName = @"bob";
_firstName = @"jack";
isInsecure = YES; //지역변수라서 접근가능
[self setLastName: @"davis"];
NSString *name = [self firstName];
NSString *nicname = [self lastName];
NSLog(@"이름: %@ - 닉네임: %@",name,nicname); //이름: jack - 닉네임: davis
}
@end
ViewController.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@end
ViewController.m
#import "ViewController.h"
#import "Person.h" //import 해준다!
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
Person *person1 = [[Person alloc]init]; //객체 생성 및 초기화
person1.firstName = @"kang"; //변수 할당
[person1 setLastName:@"gil dong"]; // 변수할당
//person1.isInsecure = NO; 지역변수라서 다른 클래스에서 접근 불가능
//NSLog(@"%@", person1.firstName); //kang
//NSLog(@"%@", person1.lastName); //gil dong
[person1 test]; //이름: jack - 닉네임: davis
}
@end
======================= setter getter 활용법
Vehicle.h
#import <Foundation/Foundation.h>
@interface Vehicle : NSObject
@property (nonatomic) long odomater;
@property (nonatomic,strong) NSString *model; //포인터 변수
@end
Vehicle.m
#import "Vehicle.h"
@implementation Vehicle
//셋터구현 - 불필요한 값을 검증하기 위해 사용되는 예
-(void)setOdomater:(long)odomater{
if(odomater > _odomater){ //원래 값이 입력한 값 보다 크면
_odomater = odomater;
}
}
-(NSString *)model{
if([_model isEqualToString:@"honda"]){
return @"oh no~~~";
}else{
return _model; //입력한 값
}
}
@end
ViewController.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@end
ViewController.m
#import "ViewController.h"
#import "Vehicle.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
Vehicle *car = [[Vehicle alloc]init];
//section1
/*
car.odomater = -100;
NSLog(@"odometer: %lu", car.odomater); //0
car.model = @"honda";
NSLog(@"나는 %@ 를 운전합니다." , car.model); //나는 oh no~~~ 를 운전합니다.
*/
//section2
car.odomater = 100;
NSLog(@"odometer: %lu", car.odomater); //100
car.model = @"ferari";
NSLog(@"나는 %@ 를 운전합니다." , car.model); //나는 ferari 를 운전합니다.
}
@end
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSString *firstName = @"John";
NSString *allocatedString = [[NSString alloc]init];
NSLog(@"name: %@", firstName); //name: John
NSString *fullName = [NSString stringWithFormat:@" %@ smith %@",firstName , @"Charles the III"];
NSString *display = [fullName stringByAppendingString: @" - Died 1448"];
NSLog(@"fullName: %@", fullName); //fullName: John smith Charles the III
NSLog(@"display: %@", display); //display: John smith Charles the III - Died 1448
NSString *var1 = @"Junk";
NSString *var2 = @"in the trunk";
NSString *var3 = @"junk";
if(![var1 isEqualToString:var2]){
NSLog(@"var1 과 var2 는 같지 않습니다."); //var1 과 var2 는 같지 않습니다.
}
if([var1.lowercaseString isEqualToString: var3]){
NSLog(@"var1 과 var3은 같습니다. -1"); //var1 과 var3은 같습니다. -1
}
if([var1 caseInsensitiveCompare:var3] == NSOrderedSame){
NSLog(@"var1 과 var3은 같습니다. -2" ); //var1 과 var3은 같습니다. -2
}
//초기화
//NSString *str = [[NSString alloc]initWithString:@"This is NSString"];
//간소하게
NSString *str = @"This is NSString";
NSLog(@"str : %@",str); //This is NSString
//immutable class - 변경 불가
NSString *result;
result = [str substringFromIndex:6]; //6번째 문자열 이후의 문자열 출력 NSString
result = [str substringToIndex:3]; // 앞에서 3번째 문자열 까지 출력 Thi
result = [[str substringToIndex:11]substringFromIndex:8]; // NSS
result = [[str substringFromIndex:8] substringToIndex:3]; // NSS
result = [[str substringWithRange:NSMakeRange(8, 3)] lowercaseString]; //nss
NSLog(@"result : %@", result);
//mutable - 변경가능
NSMutableString *mstr = [NSMutableString stringWithFormat: str];
[mstr appendString: @" and NSMutableString"];
[mstr insertString:@"Mutable " atIndex:8];
NSLog(@"mstr : %@", mstr); //his is Mutable NSString and NSMutableString
}
@end
======================= NSNumber
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
int imAnIn = 5;
float iAmFloat = 3.3;
double iAmTheDouble = 5.666664;
NSLog(@"Int: %d", imAnIn);
NSLog(@"iAmFloat: %f", iAmFloat);
NSLog(@"iAmTheDouble: %f", iAmTheDouble);
//NSNumber 초기화
NSNumber *numInt = [NSNumber numberWithInt:5];
NSNumber *numInt2 = [NSNumber numberWithInt:6];
//int로 형변환
int val = numInt.intValue;
int val2 = numInt2.intValue;
int sum = val + val2;
NSLog(@"sum : %d",sum);
//NSNumber로 형변환
NSNumber *numSum = [NSNumber numberWithInt:sum];
//배열에 담기
NSArray *arr = @[numInt, numInt2, numSum];
//numSum을 스트링 타입으로 변환
NSString *str = numSum.stringValue;
NSInteger someInt = 55;
//오류
//NSNumber *sumNum = [numInt intValue] * [numInt2 intValue];
NSNumber *sumNum = [NSNumber numberWithInt:(numInt.intValue) * (numInt2.intValue)];
NSLog(@"sumNum : %@",sumNum); //30
}
@end
======================= 클래스 메서드, 인스턴스 메서드
person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
- (void)speakName;
+ (void)stateSpecies;
@end
person.m
#import "Person.h"
@implementation Person
- (void)speakName{
NSLog(@"my name is jack!");
}
+ (void)stateSpecies{
NSLog(@"i am a human");
}
@end
ViewController.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@end
ViewController.m
#import "ViewController.h"
#import "Person.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
Person *person =[[Person alloc]init];
[person speakName]; //인스턴스 메서드 (-) my name is jack!
[Person stateSpecies]; //클래스 메서드 (+) i am a human
}
@end
======================= 메서드 체인 (예) - 위에 코드와 아래 4줄 코드는 같다.
======================= swift를 objective c로 변환해보기
#import "ViewController.h"
#import "Person.h"
@interface ViewController ()
@property (nonatomic) double bankAccount;
@property (nonatomic) double itemAmount;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.bankAccount = 500.0;
self.itemAmount = 400.0;
//실행
[self playground];
//살 수 있음!
//player b wins!
}
//구입가능여부 체크
- (BOOL) canPurchase: (double) amount {
if(self.bankAccount >= amount){
return YES;
}
return NO;
}
//우승자 선정 함수
- (void) declareWinnerWithPlayerAScore:(NSInteger)scoreA playerBScore:(NSInteger)scoreB{
if(scoreA > scoreB){
NSLog(@"player a wins!");
}else if(scoreB > scoreA){
NSLog(@"player b wins!");
}else{
NSLog(@"again");
}
}
//실행 함수
- (void) playground{
//구입 여부 함수 호출
if([self canPurchase:self.itemAmount]){
NSLog(@"살 수 있음!");
}
//우승자 선정 함수 호출
[self declareWinnerWithPlayerAScore:55 playerBScore:66];
}
@end
======================= 고정배열, 가변 배열
#import "ViewController.h"
#import "Person.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSArray *arr = [NSArray arrayWithObjects:@"my", @"mother", @"told", @"me", nil];
NSArray *arr2 = @[@"donkey",@"kong" , @"ate", @"your", @"mom"];
NSString *str = [arr objectAtIndex:2];
NSLog(@"str : %@",str); //str : told
arr = @[@"mario" , @"hahahoho"]; //재할당;
NSLog(@"arr num %li", arr.count); //2
// 가변 배열 ---------------------------------------
NSMutableArray *mut = [NSMutableArray arrayWithObjects:@"boom",@"jam",@"slam",@"pam", nil];
NSLog(@"mut: %@", mut.debugDescription);
/*
(
boom,
jam,
slam,
pam
)
*/
//삭제
[mut removeObjectAtIndex:2];
//삽입
[mut addObject: @"beast master"];
NSLog(@"mut 2: %@", mut.debugDescription);
/*(
boom,
jam,
pam,
beast master
)*/
NSArray *arr3 = [NSArray arrayWithArray:arr];
NSArray *arr4 = mut;
//NSMutableArray *arr4 = arr; 오류
//
NSArray *frutie = [[NSArray alloc]initWithObjects:@"apple",@"banana", @"pineapple", @"lemon", nil];
/* for 문 예제 1
for (int i = 0; i< [frutie count]; i++){
NSLog(@"frute : %@", [frutie objectAtIndex:i]);
}
*/
//for 문 예제2
for (NSString *strTemp in frutie) {
NSLog(@"과일1 : %@" , strTemp);
}
//가변 array
//할당
NSMutableArray *ffrute = [NSMutableArray arrayWithArray:frutie];
[ffrute addObject:@"tomato"];
[ffrute addObject:@"wotermelon"];
[ffrute addObject:@"mango"];
for (NSString *strTemp in ffrute){
NSLog(@"과일2 : %@", strTemp);
}
}
@end
======================= 딕셔너리
#import "ViewController.h"
#import "Person.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//dictionary
NSDictionary *dic = [[NSDictionary alloc]initWithObjectsAndKeys:@"강", @"이름", @"20", @"나이", nil];
NSLog(@"name : %@" , [dic objectForKey:@"이름"]);
NSLog(@"age : %@" , [dic objectForKey:@"나이"]);
//가변 dictionary
NSMutableDictionary *mdic = [NSMutableDictionary dictionaryWithDictionary:dic];
[mdic setObject:@"한국" forKey:@"사는곳"];
[mdic setObject:@"까무잡잡" forKey:@"얼굴색"];
NSLog(@"location : %@" , [mdic objectForKey:@"사는곳"]);
NSLog(@"face color : %@" , [mdic objectForKey:@"얼굴색"]);
//-----------------------------------------------------------------------------
NSNumber *age = [NSNumber numberWithInt:40];
NSNumber *age2 = [NSNumber numberWithInt:34];
NSDictionary *dic1 = @{@"jack":age, @"jon:":age2};
NSDictionary *dic2 = [[NSDictionary alloc]init];
int jacksAge = [[dic1 objectForKey: @"jack"] intValue];
NSNumber *age3 = [dic1 objectForKey:@"jack"];
int jacksAge2 = [age3 intValue];
NSLog(@"jacks age : %d",jacksAge); //jacks age : 40
NSMutableDictionary *mut = [@{@"1":@"bmv",@"2":@"volvo",@"3":@"ugly"} mutableCopy];
NSLog(@"%@",mut);
/*
{
1 = bmv;
2 = volvo;
3 = ugly;
}
*/
NSMutableDictionary *mut2 = [[NSMutableDictionary alloc]init];
[mut2 setObject:@"an object" forKey:@"a key"];
[mut2 setObject:[NSNumber numberWithDouble:20.000] forKey:@"doubletrouble"];
NSLog(@"%@",mut2);
/*
{
"a key" = "an object";
doubletrouble = 20;
}
*/
}
@end
======================= 객체지향 예 1
Vehicle.h
#import <Foundation/Foundation.h>
@interface Vehicle : NSObject
//부모 프로 퍼티
@property (nonatomic,strong) NSString *make;
@property (nonatomic,strong) NSString *model;
@property (nonatomic,strong) NSString *engineSize;
-(void)drive;
@end
Vehicle.m
#import "Vehicle.h"
@implementation Vehicle
//부모 메소드
-(void)drive{
NSLog(@"i am driving");
}
@end
Civic.h
#import "Vehicle.h"
//Vehicle 의 서브 클래스
@interface Civic : Vehicle
-(void)test;
@end
Civic.m
#import "Civic.h"
@implementation Civic
//초기화
- (id)init
{
if( self = [super init]){
}
//자신의 drive 호출
[self drive];
return self;
}
//여기에만 적어주면 이 클래스 안에서만 호출 가능. Civic.h에 적어주면 다른 클래스에서도 호출 가능!!!!
-(void) test{
self.make = @"honda";
self.model = @"civic";
}
-(void) drive {
NSLog(@"drive from subclass");
//부모 drive 호출
[super drive];
}
@end
ViewController.m
#import "ViewController.h"
#import "Civic.h"
@interface ViewController ()
@property(nonatomic,strong) NSString *iAmPrivate;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//객체생성
Civic *civic = [[Civic alloc]init];
// 호출 안해주면 밑에 nslog는 둘다 nil.., Civic.h에 구현 안해주면 이곳에서 호출 불가능..
[civic test];
//[civic drive];
NSString *model = [civic model];
NSString *make = [civic make];
NSLog(@"make : %@ " ,make); //make : honda
NSLog(@"model : %@ " ,model); //model : civic
}
@end
'ios 뽀개기 > objective-c' 카테고리의 다른 글
UIViewContorller의 수명주기 관리 메서드 (0) | 2018.10.23 |
---|---|
iOS 파일 시스템 관련 함수들 (NSFileManager Class) (3) | 2018.10.23 |
objective c alert 구현 (0) | 2018.07.28 |
객체지향 예제 (0) | 2018.07.10 |
array dictionary (0) | 2018.07.10 |
댓글