Chapter 2. Objective - C 기본 문법 정리
클래스 : 인터페이스와 구현
헤더파일에서는 클래스의 인터페이스를 정의한다.
어떤 클래스를 상속받는지, 클래스의 인스턴스 변수, 프로퍼티, 메소드 등을 정의한다.
메서드와 프로퍼티는 @interface와 @end 사이에 위치한다.
1 2 3 4 5 6 7 8 9 | #import <UIKit/UIKit.h> @interface ViewController : UIViewController { UITextField *notesFiled_; } @property (weak, nonatomic) IBOutlet UITextView *tweetTextView; - (IBAction)postItButtonPressed:(id)sender; @end | cs |
#import
C에서의 #include와 같은 역할로 다른 헤더파일을 include 하는 작업을 수행하는 키워드이다.
다만 다른 점이 있다면 같은 헤더 파일을 여러 번 포함하는 것을 자동으로 방지해준다!
@interface
클래스 인터페이스 선언이 시작되는 것을 알리는 키워드
{ } 안을 interface filed라고 부른다.
ViewController
선언하게 되는 클래스의 이름
: UIViewController
선언하는 클래스가 상속받는 클래스 이름, ( : 을 통해 표현한다.)
참고로 Objective-C는 다중 상속을 지원하지 않는다.
UITextFIled *notesFIled_
클래스 인터페이스에 정의되는 인스턴스 변수이다.
Primitive Data Type에 있어서는 C++과 같다.
기본적으로 모든 필드는 protected 접근 특성을 갖는다.
@private나 @public 섹션을 이용해서 접근 특성을 바꿀 수 있다.
@property
해당 프로퍼티에 접근자 메서드가 필요함을 컴파일러에게 알려준다.
Objective-C에서는 프로퍼티를 이용해서 변수에 접근한다.
명시적으로 getter, setter 같은 접근자 메서드를 만들필요가 없다.
컴파일러가 신시사이즈 과정에서 프로퍼티(@property)의 특성에 따라 getter, setter를 제공해주기 때문이다.
이 메서드들은 메모리도 알아서 관리한다!
‘.’을 통해 접근자 메서드를 호출할 수 있다.
(weak, nonatomic)
프로퍼티의 특성을 나타낸다.
( 이 부분은 따로 떼어내서 알아보자 )
IBOutlet
현재 프로퍼티를 인터페이스 빌더가 인식할 수 있게 한다.
이를 통해 컨트롤과 프로퍼티를 연결할 수 있다.
UITextView
타입과 프로퍼티명
- (IBAction)
빼기 기호는 인스턴스 메서드 임을 의미한다.
그리고 더하기 기호는 클래스 메서드를 의미한다.
참고로 Objective-C의 모든 메서드는 public 접근을 갖는다.
IBAction을 이용하면 인터페이스 빌더에서 메서드를 식별할 수 있다.
때문에 메서드를 이벤트와 연결시킬 때 사용한다.
postItButtonPressed
메서드 명
:(id)sender
IBAction 메서드 시그니처의 인자는 다음 중 하나로 구성된다.
인자 없음
인자가 한 개 일 때 > ( ID )
인자가 두 개 일 때 > sender의 id와 메서드 호출을 야기한 이벤트를 포함하는 UIEvent
@end
클래스 인터페이스 선언이 종료됨을 알리는 키워드
프로퍼티 ( weak, nonatomic )
프로퍼티는 효율성과 관련이 있다.
프로퍼티를 이용하면 다른 객체가 우리 클래스 데이터와 상호작용하는 방법을 제한할 수 있다.
프로퍼티는 객체와 소통할 수 있는 getter, setter 메서드를 포함한 몇 가지 기능을 제공한다.
프로퍼티 특성은 세 종류로 구분된다.
쓰기 가능 여부 / setter 동작 방법 / 원자성
weak자리에 오는 특성들
read/write
default 값으로 누구나 프로퍼티를 고칠 수 있다.
read-only
본인 이외에 프로퍼티를 고칠 수 없다.
strong
객체 값을 직접 사용할 때 필요하다.
객체를 참조하는 강한 포인터가 있으면 활성 상태로 유지된다.
weak
참조된 객체를 alive 상태로 유지하지 않는다.
copy
단순히 값이 아니라 어떤 값의 사본이 필요할 때 사용한다.
+
nonatomic
nonatomic 특성을 추가하면 뮤텍스 관련 기능을 컴파일러가 추가하지 않는다.
멀티스레드 환경에서 사용될 가능성이 없다면 원자성을 유지하는 것이 낭비이기 때문에,
상황을 고려하여 nonatomic 특성을 추가해주면 된다.
덧붙이자면, 프로퍼티가 원자성을 갖는다고 해서 전체 클래스가 스레드 안전성을 유지하는 것은 아니므로 주의해야 한다.
cf) 뮤텍스 ( Mutex ) 란?
Mutual Exclusion으로 상호배제라고도 한다.
Critical Section을 가진 스레드들의 Running Time이 서로 겹치지 않게 각각 단독으로 실행되게 하는 기술이다.
다중 프로세스들의 공유 리소스에 대한 접근을 조율하기 위해 locking과 unlocking을 사용한다.
즉, 쉽게 말하면 뮤텍스 객체를 두 스레드가 동시에 사용할 수 없다는 의미이다.
메시지 전달: Objective-C 의 동작방식
오브젝티브 C에서는 메시지를 이용해서 다른 객체와 상호작용할 수 있다.
메시지는 인자를 포함하거나 포함하지 않을 수 있다.
메서드 명과 인자를 합쳐 셀렉터라고 한다.
다른 객체로 메시지를 보내면 대상 객체의 메서드가 메시지를 처리한다.
1 2 | - (NSInteger) pickerView : (UIPickerView *) pickerView numberOfRowsInComponent : (NSInteger) component; | cs |
오브젝티브 C의 인자에는 공개명과 지역명 두 가지 이름이 있다.
객체에 메시지를 보낼 때 공개명은 셀렉터의 일부가 된다.
콜론 앞의 이름이 공개명이다.
다음에는 지역명이 등장한다.
지역 변수에 값을 저장하는 것이다.
공개명과 지역명은 같지 않아도 된다.
아래의 사이트를 참고하면 Objective - C 기초 문법에 대한 자세한 예제와 설명을 볼 수 있다.
또 아래의 사이트를 참고하면 iOS Application 개발에 대한 기초적인 강의를 들을 수 있다.
chapter 2. end
'Dev.iOS > About' 카테고리의 다른 글
[iOS_Intro] 4. 데이터 ( 코어 데이터 ) (0) | 2016.09.18 |
---|---|
[iOS_Intro] 3. 테이블, 뷰 (0) | 2016.09.17 |
[iOS_Intro] 1. iOS Application의 구조 (0) | 2016.09.10 |
[iOS] Swift란? (0) | 2016.09.08 |
[iOS] iOS Application Development Intro (0) | 2016.09.07 |