안녕하세요? 소들입니다 :D
이번 포스팅은 바로바로 옵젝씨 뿌수기!!!! 첫편!!!!
요즘 대세는 Swift인데 왜 옵젝씨를 뿌수냐구요?
여러분 저도 Swift만 공부하다가 취업했는데 회사 코드는 모두 옵젝씨였어요 :D.. (침)
물론 Swift가 요즘 대세죠! 그래서 저도 Swift 다시 공부하구 있구요.
하지만 여러분은 언젠가 옵젝씨와 마주할 날이 올 거예요 (저주)
오픈소스라든가 회사 코드라든가..
옵젝씨를 알게 되면 다음과 같은 장단점이 있어요
🌝 장점
옵젝씨로 작성된 회사 코드를 리팩토링 할 수 있다
어떤 기능을 검색할 때 옵젝씨 코드라고 스킵하지 않아도 된다!!
iOS 언어의 왕이 될 수 있다
🌚 단점
어렵다... 지저분하다..
처음보면 난해하다.. 이게 뭐하는 언어야..?
아 물론 깊게 공부하잔 건 아니예요 :)
말했듯이 요즘 대세는 스위프트이고, 깊게 공부할 시간에 스위프트를 더 깊게 공부하는 게 나아요.
저처럼 옵젝씨로 당장 코드를 짜야 했던 게 아니라면 말이죠.
그치만 적어도 옵젝씨 코드를 봤을 때,
"어떤 코드인지 읽을 수는 있자!!!" 정도는 가능해보도록 하자구요 XD
첫 포스팅이라 서론이 길었네요 💩
기본기만 공부할 것이기 때문에,
Objective-C로 기본 프로젝트를 생성하고,
그에 따른 (앱을 만드는 데 가장 중요한) 클래스 문법만 설명할 예정입니다.
이번 포스팅에선 헤더 파일만 부술 거예요.
여러분 저는 iOS 관련 포스팅은 음슴체로 하니까 이해해주셈!! 🙃
1. 프로젝트 생성하기
프로젝트 생성은 기존 생성하는 방식과 동일하게 해주시되,
언어 선택을 Swift가 아닌 Objective-C로 해주셔야 함
2. 생성된 파일을 살펴보자
스위프트와 다르게 헤더 파일(.h)이 있넹?
스위프트를 사용하시던 분들께는 헤더 파일이 아주 오랜만일 것임
보다시피 옵젝씨는 헤더 파일을 갖고 있음
Objective-C
이름부터 C언어스러운 느낌 안 남?
Objective-C는 C언어를 확장한 언어임
따라서 Objective-C에선 C언어의 모든 문법이 사용 가능함!!
C언어를 객체지향형으로 확장한 언어 라고 생각하면 쉬움
따라서 당연히 헤더 파일도 존재 하구,
이 헤더 파일엔 외부에서 사용할 메서드나 변수(상수)를 선언해두어야 함
옵젝씨를 이해하기 위해선 Swift와 빗대어 생각하기 보다
C언어를 빗대어 생각하는 게 훨씬 이해하기 편함..
그래서 사실 C를 모르면 옵젝씨 하기 더 어려움 --;;
3. ViewController.h 를 살펴보자
다음은 헤더 파일 내용임
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@end
|
헤더 파일에 요런 것들이 선언되어 있넹?
하나하나씩 공부해 보자 :-)
3-1. #import
C언어에서 #include에 해당하고, Swift에선 import에 해당하는 녀석임
C언어의 #include와 다른 점은 이놈은 같은 헤더 파일이 여러번 불리는 것을 알아서 방지해 줌!!
언제 쓰냐면
외부 라이브러리, 프레임워크 뿐 아니라
프로젝트 내에 선언된 클래스 등을 불러올 때도 꼭 import를 해주어야 함
그럼 Swift는 프로젝트 내 클래스 등을 사용할 때 그동안 import를 하지 않은 거임?
Swift는 프로젝트 전체가 namespace 범위로 지정되어 있기 때문에,
일일이 객체를 import를 해주지 않아도 사용이 가능했던 것임..
(핵편할 뿐 아니라 지저분한 코드가 간결해짐)
물론 Swift도 프로젝트 내 객체에서만 국한되기 때문에,
외부 라이브러리나 프레임워크(UIKit, Foundation 등)은
Swift도 당연히 import 해줘야 함
3-2. @interface , @end
아마 처음보는 문법일 것임.. 왜냐면,,나도 첨 봤었거든,,
보통 헤더파일의 존재 이유는 어떤 것을 선언해 놓기 위해서잖음?
이 @interface라는 놈은 클래스의 선언이 시작된다! 라는 부분임
어떤 클래스를 상속받고, 어떤 변수와 메서드를 쓸 건지 여기서 선언해 둠
또한
@interface로 시작된 녀석은 꼭 끝에 @end가 있어야 함
영혼의 짝임. 빼먹으면 큰일 남.
@interface에서 시작해서 @end가 등장하기 전까지가 interface field 로, 선언부에 해당하기 때문
① 변수 선언 방법
이런 식으로 선언 함
띠용?? 변수 선언이 총 두 군데 돼 있넴???
먼 차이??
자 이렇게 @interface 의 중괄호 안에 선언되는 변수는
Instance variable (인스턴스 변수) 임
이 전역 변수의 기본 접근 지시자는 protected 임
따라서 자기 자신, 혹은 상속받은 자식 클래스에서만 접근 가능함
만약 외부 클래스에서도 접근 가능하게 해주려면 어케함?
먼저,
다음과 같이 @public 으로 접근지시자를 바꿔줄 수도 있음
이러면 외부에서 접근 가능함
하지만!!! Objective-C에선 사용하지 않는 방법임ㅎㅎㅎ
또는
getter, setter를 직접 만들어 주는 것임
뭐 이렇게 만들어서 이 함수로 접근 하는 방법인데
멤버 변수가 많아질 수록 매우 귀찮
.
.
따 라 서
Objective-C에선 위 방법들을 잘 사용하지 않음
왜냐? 프로퍼티란 놈이 있거든
이렇게 interface field 내에 @property 라는 접근 지시자를 통해 선언되는 변수는
모두 프로퍼티 이고
이 프로퍼티의 특징은 getter, setter를 자동으로 생성해줌
따라서 별도의 작업 없이 외부에서 접근이 가능함
이제 변수 선언 위치가 왜 두 가지로 나뉘어져 있는지
알겠셈!??? 외부에서 접근할 수 있냐 vs 없냐 임
참고로 그럼 @public == @property 아님?
이라 생각할 수 있는데
개념은 같게 생각해도 되지만 완전 동일하진 않음
접근 방법이라든지 public을 썼을 때의 문제점도 있는 거로 알고 있음
(옛날에 정리해 뒀는데 너무 심화 내용이라 나중에 다룸)
참고로
헤더 파일에선 변수 초기화 못함
선언만 해야하는 게 당연할 뿐더라
선언과 동시에 nil 혹은 0으로 알아서 초기화 됨
+ 이부분에 대해서 자세하게 포스팅 했습니다 (왜 public과 property가 다른지도)
이 포스팅 참조
② 메서드 선언 방법
메서드는 딱히 신경쓸 거 없이
프로퍼티 선언해주는 곳에 메서드 이름 써주면 됨
3-3. ViewController
선언할 클래스 이름임
3-4. UIViewController
클래스 이름 옆에 : 하고 옆에 붙는 이놈, 스위프트에서도 동일함
바로 상속받는 클래스 명임
만약 아무 것도 명시해주지 않으면 자동으로 최상위 클래스인 NSObject가 상속 되나,
웬만해선 NSObject라도 명시해주는 것이 좋음
또한
스위프트에선 단일 상속만 지원하듯이,
Objective-C에서도 똑같이 단일 상속만 지원 함
그럼 필요한 다른 기능들은 당연히 Protocol로 구현해야겠지?!?!
3-5. Protocol
옵젝씨는 Swift와 달리 상속받는 놈 이외 프로토콜을 채택할 땐
<>
이 놈을 이용해서 열거해주어야 함
위 사진처럼 <> 안에 채택할 Protocol의 이름들을 , 를 이용해 나열해 주시면 됨
참고로 <>를 부르는 이름은 angle bracket(앵글 브래킷) 임!!!!!!
.
.
.
자 헤더 파일을 모두 살펴 보았어요.
별로 내용도 없고 어려운 부분도 없지요!!
이번 포스팅에서 옵젝씨 헤더 파일(.h)을 살펴 보았으니,
이 다음 포스팅에선 구현 파일(.m) 을 살펴볼 거예용.
여기선 아마 함수를 어떻게 선언하고, 어떻게 접근하는지에 대해 다룰 것입니다.
여러분은 이제 옵젝씨 헤더 파일을 읽을 수 있게 되었습니다!!
축하드립니다!! 하하하
그럼 담 포스팅에서 봐용 ꒰⸝⸝•。•⸝⸝꒱
'iOS > Objective-C' 카테고리의 다른 글
Objective-C) JSON을 Encoding 해보자 (0) | 2020.12.04 |
---|---|
Objective-C) C++ 사용하기 (0) | 2020.12.02 |
Objective-C) ARC와 Toll-Free Bridging (0) | 2020.11.30 |
Objective-C) 실행 시간 측정하는 함수 (1) | 2020.09.30 |
Objective-C) Swift 개발자를 위한 Objective-C (2) - .m 파일 살펴 보기 (0) | 2020.08.24 |