iyOmSd/Title: Objc

[Objective-C] 기초문법 - 변수, 함수, 객체 사용해보기!!

냄수 2019. 8. 1. 18:56
반응형

안녕하세요 NamS입니다😄😄

 

요즘 스위프트를 공부하면서 오브젝티브C 에 관심이 생겼어요

그리고 오브젝티브C 를 알아두면 앱개발에 도움이될 것 같아서 공부를 시작했어요

어디선가는 계속 쓰이고 있을거니까요!!

 

이름에서도 알 수 있듯이 오브젝티브 C는 C를 기반으로 만들어졌어요

 

말로 듣는것보다 직접 보는게 훨씬 와닿을 거에요!

 

우선 프로젝트를 만들어볼게요

 

기본적으로 프로젝트를 생성하면 스위프트와는 다르게

.h 파일과 .m 파일이 보여요

 

.h 파일은

선언만 하는 곳 인것같구요

 

.m 파일은

.h파일에 선언된 함수나 기능을 구현해주는 곳 인것같아요

 

제글씨가 ~같아요로 끝나는것은...

오브젝티브C에 갓 입문을해서 확신이 없어요!! ㅎㅎ

 

 

이제 파일을 들여다 볼게요

우선 .m 파일을 보면

 

여기서 위에 @interface Test() ~ @end 부분은 굳이 필요 없어서 삭제해도 되요

@end 라는 표현은 이 클래스의 구현이 끝낫다라는 표현이라고 생각하면 편할거같아요

 

다음으로 .h파일을 볼게요

 

정말 간단하고 아직 볼게 없는것 같아요...

 

대충 구경했으니 이제부터 코드를 쳐볼게요

뭘 하려면 기본적으로 함수와 변수를 만들어야 하겟죠?

 

 

 

 

우선 함수 만드는 방법이 신기하더라구요!!

 

함수를 선언할때 - 와 +를 이용해서 선언해요

이둘의 차이는 뭘까요???

 

코드로 먼저 한번 볼게요

 

 

함수생성

- (void)helloObjc {
	NSLog(@"hello");
}

+ (void)helloObjc2 {
    NSLog(@"hello");
}

위의 코드는 반환형이 void이고 helloObjc 라는 함수와

반환형이 void이고 helloObjc2 라는 함수를 선언하고 각 함수는 hello라는 글자를 출력할거에요

 

둘 함수의 차이는 무엇일까요??

함수이름...? 다르긴하죠..! 그거보다 중요한게 있어요!

앞에보면 -과 +가 다른걸 알 수 있어요

 

-는 인스턴스 메소드

+는 클래스 메소드 라고 불러요

음... 와닿지 않죠?? 저도 아직은 그래요!!

 

우선 호출 방식에서 차이가 있습니다!!

[self helloObjc];
[Test helloObjc2];

-로 선언한 인스턴스 메소드는 self를 이용해서 호출하고

+로 선언한 클래스 메소드는 Test라는 클래스를 이용해서 호출해요

Test클래스 파일에서 + (void)helloObjc2를 선언했기 때문이에요

여기서 []는 오브젝티브C에서 함수를 호출할 때 사용하는거에요 스위프트같이 .를 이용해서 하지않아요

 

 

아직 무슨 얘기인지 감이 안와요...!

 

더 자세히 볼게요

 

우선 -로 선언한 함수는 self로 호출하는거에서 보면 다른 외부에서 접근을 할수가 없어요!!

접근을 하려면 클래스 객체를 만들어주고 접근을 할 수있어요.

 

반면 +로 선언한 함수는 [Test func]같이 앞에 클래스 명만 붙여주면 외부에서 접근할수가 있어요

비유를 하자면 static변수라고 할 수 있을까요... 어디에서든지 쓸 수있는 그러한 존재가 되요

 

적용하는 사례를 보면 더 이해가 잘갈거에요

우선 함수를 만들었으니 다음으로 가볼게요

함수를 만들었으니 선언을 해줘야해요 그래야 다른곳 에서 함수를 사용할 수 있어요

 

 

함수선언

@interface Test : UIViewController

- (void)helloObjc;
+ (void)helloObjc2;

@end

이 선언을 하지않으면 만든 함수가 뜨지 않아요

만약 Test.h에서 helloObjc2를 선언 하지않는다면 위의 항목에서 보이지 않을거에요!! 사용할 수 없는거죠

그리고 보면 helloObjc가 없는게 보이죠??

-로 선언했기때문에 저렇게 외부에서 클래스 명(Test)을 사용한 접근은 불가능해요

이렇게 객체를 만들어주고 접근할 수 있어요

객체를 만들고 접근하려고 보니 이번엔 helloObjc2가 없네요!

 

함수 실행


// 인스턴스 메소드 실행
[self helloObjc];

// 클래스 메소드 실행
Test *vc = [[Test alloc] init];
[vc helloObjc];

Test클래스의 객체vc를 생성하고

vc의 함수 helloObjc을 실행 시켰네요

 

alloc... init... ???

 

변수 선언시 * 가 들어가는 것들은 대부분 클래스형 이기때문에 메모리를 할당 해줘야해요

따라서 alloc을 이용해서 생성해서 만들어요

그래서 대부분 클래스를 생성할때 alloc init을 사용하고 있어요

NSString *str = [[NSString alloc] init];
NSInteger a;
    
NSArray *arr = [[NSArray alloc] init];
Test *vc = [[Test alloc] init];

alloc은 NSObject에 있는데요 최상위 클래스이기 때문에 모든 클래스가 기본적으로 다가지고 있다고 생각하면되요

init을 통해서 객체를 생성하는거에요

저런 방식으로 객체를 생성할 수 있어요

 

이제 함수를 선언하고 접근도 할 수 있어요!!

그런데 함수에 변수를 입력 받고싶은데 어떻게하나요..?

 

 

 

 

 

매개변수 함수


- (void)helloObjc {
    NSLog(@"hello");
}

+ (void)helloObjc2 {
    NSLog(@"hello");
}

//매개변수 1개
- (void)helloWithName: (NSString *)str {
    NSLog(@"%@씨 안녕하세요", str);
}

//매개변수 2개
- (void)helloWithName2: (NSString *)str1 name2:(NSString *) str2 {
    NSLog(@"%@와 %@ 안녕", str1, str2);
}

//매개변수 2개 외부변수 생략
- (void)helloWithName3: (NSString *)str1 :(NSString *) str2 {
    NSLog(@"%@와 %@ 안녕", str1, str2);
}

 

매개변수 함수실행


[self helloObjc];
[Test helloObjc2];
    
[self helloWithName:@"a"];
[self helloWithName2:@"a" name2:@"b"];
[self helloWithName3:@"a" :@"b"];

위의 코드를 살펴볼게요

매개변수 1개일때를 보면

 

- (반환형)함수이름: (자료형)내부변수명 {}

 

- (void)helloWithName: (NSString *)str {}

 

형식이네요

매개변수가 1개일때는 외부변수명이 따로 없어요 그래서 함수호출 코드를 보면 함수이름 다음에 바로 입력을 받아요

그래서 함수명을 지을때 관례적으로 abcWithValue 같이 With를 붙여서 어떤 변수를 필요로한다 라고 표시해줘요

 

매개변수가 2개일때는 어떻게 표현하나요..?

2개일 때부턴 상관 없어요!!

2개일땐 내부변수명과 외부변수명 두개다 쓸 수 있고 또한 외부변수명도 생략이 가능해요

외부 변수명이 없어도 : 는 꼭 써줘야해요

따라서 :로 매개변수의 개수를 알수 있죠

 

계속 보다보니 @""가보이죠??

오브젝티브C에는 NSString 밖에없어요 그래서 NSString을 쓸때는 @""형식으로 써줘야해요

 

 

오브젝티브C에서 변수들은 protected타입이에요

외부에서 접근하고 싶은데 어떻게하지...?

public 을 붙이면되잖아요!!

 

음.. 오브젝티브C에서는 잘 사용하지 않아요

흔히들 아는 getter와 setter를 이용하는 방식이 있어요

 

하지만 이 마저도 하나하나 구현하기 귀찮아요!!

변수가 많으면 언제 다 하고 있을까요..

 

그래서!!

@property 라는 놈이있어요!!

자동으로 getter setter를 만들어주고

.을 통한 접근과 []를 이용한 접근 둘다 가능해요

말로보면 어려우니 코드로 한번 볼게요

 

 

Test.h


@interface Test : UIViewController

- (void)helloObjc;
+ (void)helloObjc2;

//property 사용
@property int count;

@end

선언은 간단해요 헤더파일에 이렇게 변수를 추가해주면 끝이에요


@implementation Test2 {
    NSString *str;  //변수 선언
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    str = @"abc";
    
    Test *vc = [[Test alloc] init];
    [vc helloObjc];
    
    //방법1 .으로 접근
    NSInteger c = vc.count;
    vc.count = 3;
    
    //방법2 getter setter
    NSInteger c = [vc count];
    [vc setCount: 3];
}
@end

자동으로 만들어주기 때문에 쓰기 편리한 기능이에요

추가로 str이란 NSString형 변수를 만들었어요

implementation안에 변수를 선언을 할 수 있지만 초기화는 할 수 없어요!! 왜냐구요?? 해보세요!! 빨간줄이 맞이할거에요

그렇기 때문에 따로 초기화를 해줘야 합니다.

 

 

 

 

 

 

내용을 정리해 볼게요

 

.h 파일과 .m파일

변수의 선언

객체의 생성

함수실행은 [] 를 이용해서 하고

-(인스턴스 메소드) +(클래스 메소드)의 구분

여러개의 매개변수를 받을 수 있는 함수의 생성과 호출

@property

 

 

이렇게 보니 많은걸 한것 같은데 별로 없어보이는 이유는...? ㅠㅠ

 

이정도만 완벽히 이해한다면 기초적인 부분은 다 배운거라고 봐도 무방하대요!!

 

 

반응형

'iyOmSd > Title: Objc' 카테고리의 다른 글

[Objective-C] 스위프트 앱을 다시 만들어보기  (0) 2019.08.03