IT정보사전

[iOS]Object-C 2.0. 문법 본문

모바일 프로그래밍

[iOS]Object-C 2.0. 문법

작은나무0530 2018. 12. 16. 21:43
728x90
반응형

안녕하세요~ 작은나무입니다.
Object-C 문법에 대해서 정리 해보겠습니다.

Object-C에서는 Class의 인스턴스를 생성할 때 메모리를 할당하고 초기화 해야 한다.
ⓐ 새로운 객체를 위해 메모리를 할당
ⓑ 생성된 객체를 적절한 값으로 초기화

메모리 할당은 alloc관련 메서드 (alloc 메서드, alloc 키워드로 시작하는 메서드, new 키워드로 시작하는 메서드)
객체를 초기화는 init관련 메서드 (init 메서드, init 키워드로 시작하는 메서드)

UIView *View = [[UIView alloc] init];
보틍은 위와 같이 한줄로 표현하는게 일반적임.

확장자
.h : 공통적으로 header파일을 지칭한다 (class, type, function, 상수)
header파일을 소스에 추가하고 싶으면 '#import'라는 지시어를 쓴다.

.m : 소스 파일의 확장자이다.

Object-C에서 사용되는 지시어
지시어는 '@' 문자로 시작한다.
@interface : 클래스 선언 시
@implementation : 클래스 구현 시
@protocol : Delegate등 일반적인 선언
@end : class, category, protocol 등을 종료할 때

member접근 지정자
@private : 상속이 되지 않으며 해당 클래스 안에서만 사용되는 member들의 집합.
@protected : 정의된 클래스와 상속된 클래스에서만 접근이 가능한 member들의 집합.
@public: 모든 곳에서 사용할 수 있는 member들을 사용

exception 핸들링을 위해 사용되는 지시어
예외 처리를 위해서 사용하는 지시어들 (@try, @throw, @catch(), @finally등)

선언을 위한 지시어
@property: 프로퍼티 정의에 사용.
@synthesize: property로 정의한 변수 등의 getter, setter없이 사용하고자 할때 사용.
@dynamic: 동적으로 사용되는 메소드와 변수에 사용

Object-C의 특별한 지시어
@class : 사용자 클래스 선언을 위해서 사용.
@selector(method_name) : 정의된 메소드 이름을 리턴해 준다.
@protocol(protocol_name) : 프로토콜 클래스의 인스턴스를 리턴해 준다.
@encode(type_spec) : type_spec의 구조를 인코딩하는 문자열을 산출.
@synchronized() : 하나의 스레드에 의한 코드 블럭 정의시 사용

@property 와 @synthesize 컴파일러 지시어
인스턴스 멤버 변수들의 값에 편리하게 접근하기 위해서 @property라는 지시어를 사용
@interface allSourceAppDelegate : UIResponder <UIApplicationDelegate>{
...
UIWindow *window
}

@property (strong, nonatomic) IBOutlet UIWindow *window;
@end

@property 부분에서 UIWinodw *window형식으로 사용된 것을 보면 window가 앞으로 구현부에서 아래와 같이 사용될 것 이라는 것을 알 수 있다.

@implementation allSourceAppDelegate
@synthesize window;
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
...
[window addSubview:a.view];
...
[window makeKeyAndVisible];
}

@synthesize window처럼, @property 에서 정의한 지시어를 써주어야 함수 내부에서 사용할 수 있다.
즉, @property 에서 정의한 것은 @synthesize 를 통해서 사용할 수 있다.

클래스선언 방법
Object-C에서는 두개의 다른 영역으로 나누어서 쓴다. 또한 Object-C는 다중 상속 등을 지원하지 않는다.
@interface 와 @implementation 의 영역으로 나누어서 기술한다.
@interface myView : UIView{
    int    count;
    id     date;
    NSString*    name;
}
-(id)initWithString:(NSString*)aName;
UIView base class를 상속받은 클래스임을 나타낸다.
Object-C에서 클래스의 선언의 끝에는 @end 라는 지시어를 붙여주어야 한다.

인스턴스(or 멤버) 변수는 { } 기호안에 쓴다.
또한 메소드는 {} 직후에 바로 기술하게 된다.(initWithString, createmyViewWithString)

id라는 지시어가 있는데 이것은 어떤 타입이든지 다 될 수 있다는 의미이다.(Weak typing)
만약, 메소드 선언시에 (id)를 붙이지 않고 쓰면 자동으로 (id)타입으로 간주한다.

클래스 구현부의 기술방식
실제 구현 부분을 기술할 때는 @implementation 와 @end 라는 지시어가 커플로 사용된다.

@interface allSourceAppDelegate : NSObject <UIApplicationDelegate>{
...
}
@end
와 같은 클래스 가 있다면 구현부는 아래와 같이 쓸 수 있다.
@implementation allSourceAppDelegate {
...
}
@end

메소드와 메시지 전송방식
2가지 방식의 메소드 정의 방식이 있는데, instance 메소드와 class메소드이다.
instance 메소드를 사용하기 위해서는 반드시 class의 instance 를 미리 생성해 두어야 한다.
반대로 class 메소드는 instance를 미리 생성해 둘 필요가 없다.

-(id)initWithString(NSString*)aName라는 메소드를 보자.
'-' 기호는 instance 메소드를 선언한다는 의미이다. (Method type identifier)
'+'가 사용될 수도 있는데 이것은 class 객체에서 사용될 것이라는 의미이다.
'+'기호는 인스턴스를 생성 하지 않고 바로 사용할 수 있는 특징을 가지고 있다.

코드 사용 예를 살펴 보자.
UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0.0,0.0,320.0,40.0)];

':' 이것은 앞에는 키워드를 쓰고, : 뒤에는 이 키워드의 값을 의미하도록 표기한다.
'[]' 는 메시지의 시작과 종료를 나타낼 때 쓰인다.

myAppObject.theArray = aNewArray와 같은 C/C++ 코드를 Object-C형태로는 아래와 같이 기술할 수 있다
[myAppObject setTheArray:aNewArray];
모든 클래스가 그런것은 아니지만, 전형적인 클래스 초기화 방식은 [[className alloc] init...]처럼 하는 것

인자의 전달
[myRect setWidth:10.0 height:15.0]

String Class 와 동작
NSString NSMutableString : 일반적으로 문자열을 처리할 때 가장 많이 사용되는 클래스
NSMutableString 는 NSString의 서브클래스이다.
이 두 클래스가 지원하는 인코딩 타입은 아래와 같다.

availableStringEncodings 메소드를 이용해서 지원하고 있다.
NSASCIIStringEncoding, NSUnicodeStringEncoding, NSISOLatin1StringEncoding, NSISOLatin2StringEncoding, NSSymbolStringEncoding

label의 텍스트로 사용된 간단한 예제 코드
self.string = textField.text;
NSString *nameString=string;
if([nameString length] == 0){
nameString = @"iPhone";
}

NSString *greeting = [[NSString alloc] initWithFormat:@"hi @!",nameString];
label.text = greeting;

NSMutableString 클래스를 활용해서 스트링을 수정하는 예제 코드
NSString *firstStr=[NSMutableString string];
int formatNumber = 100
[firstStr appendString:@"This is"];
[firstStr appendFormat:@" Formatting Number %d",formatNumber];

String 객체들의 형식
일반적으로 Ascii 형식이 아닌 스트링을 출력하기 위해서 stringWithFormat: 이라는 메소드를 사용
NSString *s = [NSString stringWithFormat:@"Long %C dash", 0x2014];

UTF8형식으로 표현 할 수도 있다
NSString *s = [NSString stringWithUTF8String:"Long - dash"];

NSString 은 에러메시지를 출력하기 위해서 아래와 같은 유틸리티 함수를 제공
NSLog(string) 처럼 사용하지 않고 아래와 같이 포맷을 정한 후에 사용하는 것이 안전

NSString *string = @"A contrived string %@";
NSLog(@"%@", string);
// Output: A contrived string %@

%C %@등과 같은 string 포맷 형식(서식)은 아래와 같이 기술 될 수 있다
SpecifierDeion

%@

 deionWithLocale: 에 의해 string을 돌려준다.

%%

 '%' 문자를 출한다.

%d, %D, %i

 Signed 32-bit integer (int)

%u, %U

 Unsigned 32-bit integer (unsigned int)

%hi

 Signed 16-bit integer (short)

%hu

 Unsigned 16-bit integer (unsigned short)

%x

 Unsigned 32-bit integer (unsigned int), 핵사값을 찍을 때 0-9와 소문자 a-f를 사용한다.

%X

 Unsigned 32-bit integer (unsigned int), 핵사값을 찍을 때 0-9와 대문자 A-F를 사용한다.

%o, %O

 Unsigned 32-bit integer (unsigned int), Oct값을 찍는다.

%c

 8-bit unsigned character (unsigned char), NSLog()에 의해 ASCII문자를 찍을때 사용한다.

%C

 16-bit 유니코드 문자 (unichar), NSLog()에 의해 ASCII 문자를 찍거나 포맷에 맞추어 유니코드 문자를 찍을 때 사용한다.

%s

 8-bit unsigned 의 Null-terminated array를 찍을 때 사용. 예를 들면 UTF-8.

%S

 16-bit Unicode 문자들의 Null-terminated array를 찍을 때 사용.

%p

 Void 포인터 (void *), 0x를 앞에 붙이는 0-9 and 소문자 a-f,

%L

 대소문자를 컨버팅할 때 사용한다.

String 합치기
하나의 스트링에 다른 스트링을 더할 경우에는 아래와 같이 stringByAppendingString 메소드를 이용하여 추가

NSString *hString = @"Hello";
NSString *hwString = [hString stringByAppendingString:@", world!"];

스트링을 활용한 조건문
NSString을 조건으로 사용할 수 있는 함수

- (BOOL)isEqualToString:(NSString *)aString;
- (BOOL)hasPrefix:(NSString *)aString;
- (BOOL)hasSuffix:(NSString *)aString;
isEqualToString은 스트링과 스트링을 직접 비교해서 TRUE/FALSE를 판별하는 함수

NSString *chtext=@"prefix
NSString *numtext = @"201001"
if([chtext isEqualToString:@"prefix"]){
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"스트링 값은"message:[NSString stringWithFormat:@"TRUE"] delegate:self cancelButtonTitle:nil otherButtonTitles:@"확인", nil];
[alert show];
}

if()안에 조건문으로 사용된 isEqualToString의 결과가 TRUE일 때 {} 안의 내용을 실행
hasPrefix와 hasSuffix라는 함수가 있는데 이름에서 알 수 있듯이 이것은 스트링의 앞부분과 뒷부분을 비교하여 그 결과값을 리턴하는 함수이다

if([chtext hasPrefix:@"pre"]){ ... }
if([chtext hasSuffix:@"x"]){ ... }

두 가지 경우 모두 TRUE를 리턴하게 될 것이다. hasPrefix는 비교 대상이 되는 단어중 앞글자 한글자 이상이 포함되면 되고, hasSuffix는 뒤에서 부터 비교하여 일치하는 글자가 있으면 참을 리턴 하도록 되어 있다.
한글도 역시 비교 스트링으로 사용할 수 있다.

형변환을 하지 않고 스트링을 직접 사용하여 double, float, int등의 숫자 형태의 type과 비교하는 조건문을 표현할 수도있다. 아래의 코드는 스트링을 int 값과 비교한 코드이다.

if ([numtext intValue] == 201001){...}

intValue와 같이 사용될 수 있는 타입은 아래와 같은 종류들이 있다.
- (unsigned char)unsignedCharValue;
- (short)shortValue;
- (unsigned short)unsignedShortValue;
- (unsigned int)unsignedIntValue;
- (long)longValue;
- (unsigned long)unsignedLongValue;
- (long long)longLongValue;
- (unsigned long long)unsignedLongLongValue;
- (float)floatValue;
- (double)doubleValue;

728x90
반응형
그리드형
Comments