본문 바로가기
ios 뽀개기/objective-c

objective c 의 모든것

by 인생여희 2018. 7. 28.
반응형

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



======================= NSString

#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

댓글