본문 바로가기
프로그래밍 놀이터/iOS

Objective-C 의 기본 ( Basic Objective-C )

by 돼지왕왕돼지 2015. 6. 16.
반응형
Object-C 의 기본 ( Basic Objective-C )

출처 : http://www.tutorialspoint.com/objective_c/



<< Objective-C 는? >>

-
OOP 언어로 Smalltalk-style 을 C 언어 에 가미한 언어이다.
Apple 의 OSX 와 iOS 에서 공식적으로 사용되는 언어이다.




<< Overview >>

-
Object-C 는 OOP 의 4가지 조건 ( Encapsulation, Data hiding, Inheritance, Polymorphism ) 을 모두 만족시키는 언어이다.


-
Foundation Framework 는 아래 명시된 기능들을 비롯해 많은 기능을 제공한다.

* NSArray, NSDictionary, NSSet 과 같은 data type 을 제공
* file, string 등 많은 util 함수들을 갖고 있다.
* URL handling, date formatting, data handling, error handling 과 같은 기능도 갖고 있다.





<< Objective-C Hello World Example >>

-
Objective-C 는 다음과 같은 part 로 구성된다.

Preprocessor Commands
Interface
Implementation
Method
Variables
Statements & Expressions
Comments


-
#import <Foundation/Foundation.h>

@interface SampleClass:NSObject
-(void)sampleMethod;
@end

@implementation SampleClass
-(void)sampleMethod{
NSLog(@"Hello, World! \n");
}
@end

int main()
{
/* my first program in Objective-C */
SampleClass *sampleClass = [[SampleClass alloc]init];
[sampleClass sampleMethod];
return 0;
}


* import 문 부분이 preprocessor command. compile 전에 Foundation.h 를 include 시킬 것이다.
* @interface 는 NSObject 라는 모든 class 의 기본이 되는 class 를 상속한 interface
* @implementation 은 interface 를 구현한 것




<< Basic Syntax >>

-
token 은 keyword, identifier, constant, string literal, symbol 등을 이야기한다.

NSLog(@"Hello, World! \n");

위의 statement 는 아래와 같은 token 으로 나누어진다.

NSLog
(
@
"Hello, World! \n"
)
;


-
semicolon, comments, white space 규칙은 java 와 같다.




<< Data Types >>

-
Basic Types : integer types, floating-point types
Enumerated types
The type void : 어떤 값도 유효하지 않다.
Derived types : Pointer types, Array types, Structure types, Union types, Function types


-
Integer Types

char
unsigned char
signed char
int
unsigned int
short
unsigned short
long
unsinged long


integer type 의 size 는 sizeof operator 로 알아낼 수 있다.
ex) sizeof(int)


-
Floating-Point Types

flat
double
long double


-
The void Type

Fundtion 이 void 를 return 하는 것은 return 값이 없다는 의미.
Function argument 에 void 를 넣는것은 no argument 라는 의미







<< Variables >>

-
기본적인 내용은 Java 와 동일하다.


-
Objective-C 에서는 클래스, 메소드 선언문 밖에서 선언된 모든 변수는 전역 변수로 사용된다.
static 접근자가 붙은 녀석은 선언된 파일 내에서만 사용 하능하고,
static 키워드가 없는 전역변수는 어느 파일에서든 extern 구문을 이용해서 접근 가능하다.

{
extern int sharedVariable; // sharedVariable 은 다른 곳에서 정의되고 init 되었다.
NSLog(@"sharedVariable = %d", sharedVariable); // 다른 곳에서 정의한 값 출력
}

참조 : https://soulpark.wordpress.com/2012/08/02/objective_c_static_variable/




<< Constants >>

-
다음의 syntax 로 define 한다. ( #define 은 preprocessor )

#define identifier value


-
preprocessor 가 아닌 코드상 constants 정의는 const 를 통해 한다.

const type variable = value;





<< Functions >>

-
모든 Objective-C 프로그램은 main() function 이 있고, 이곳이 진입점이다.


-
메소드 정의는 다음과 같은 형태로 한다.

-(return_type) method_name:(argumentType1)argumentName1 joiningArgument2:(argumentType2)argumentName2 ... {
body of the function
}

* return 값이 없으면 void 를 명시.



-
ex)

- (int) max:(int) num1 secondNumber:(int) num2
{
...
}



-
메소드 호출

int main()
{
int a = 100;
int b = 100;
int ret;

SampleClass *sampleClass = [[SampleClass alloc]init];
ret = [sampleClass max:a andNum2:b];
NSLog(@"Max value is : %d\n", ret);

return 0;
}





<< Block >>

-
function pointer 의 개념


-
syntax 는 아래와 같다.

returntype (^blockName)(argumentType); // declaration

returntype (^blockName)(argumentType)= ^{
...
};


-
ex)
void (^simpleBlock)(void) = ^{
NSLog(@"This is a block");
};

simpleBlock();


-
argument 가 있는 block

double (^multiplyTwoValues)(double,double) = ^(double firstValue, double secondValue){
...
}

NSLog(@"The result is %f", double(2,4));


-
type def 를 쓰는 block

typedef void (^CompletionBlock)();
@interface SampleClass:NSObject
- (void)performActionWithCompletion:(CompletionBlock)completionBlock;
@end

@implementation SampleClass
- (void)performActionWithCompletion:(CompletionBlock)completionBlock{
NSLog(@"Action Performed");
completionBlock();
}
@end

int main()
{
SampleClass *sampleClass = [[SampleClass alloc]init];
[sampleClass performActionWithCompletion:^{
NSLog(@"Completion is called to intimate action is performed.");
}];
}




<< Numbers >>

-
NSNumber 는 다음과 같은 함수를 제공한다.

+(NSNumber *)numberWithBool:(BOOL)value
+(NSNumber *)numberWithChar:(char)value
+(NSNumber *)numberWithDouble:(double)value
+(NSNumber *)numberWithFloat:(float)value
+(NSNumber *)numberWithInt:(int)value
+(NSNumber *)numberWithInteger:(NSInteger)value
-(BOOL)boolValue
-(char)charValue
-(double)doubleValue
-(float)floatValue
-(NSInteger)integerValue
-(int)intValue
-(NSString *)stringValue







<< Arrays >>


-
Array 정의

type arrayName[arraySize]

double balance[10];


-
Array 초기화

double balance[5] = {1000.0, 2.0, 3.4, 17.0, 50.0};
double balance[] = {1000.0, 2.0, 3.4, 17.0, 50.0};


-
array param 으로 전달하기

- (void) myFunction(int *) param
- (void) myFunction(int [10]) param
- (void) myFunction(int[]) param


-
array return 하기

int * myFunction()




<< Pointers >>

-
일반적인 variable의 memory address 는 & 로 접근할 수 있다.
pointer 는 그 자체가 memory address 를 갖고 있는 것이다.
pointer 에 * 를 사용하면 값에 접근한다.


-
아래와 같이 정의해서 사용한다.

type *varName;


-
pointer 에는 항상 NULL 을 assign 하여 initialize 하는 것이 좋다.
NULL 이 assign 된 pointer 를 Null Pointer 라고 부른다.
0 주소값을 갖는 pointer 이다.

0 주소값을 참조하는 것은 보통 illegal 하다.
OS 가 그 주소를 사용하기 때문이다.


-
Null Pointer 의 경우 if 문에서 false 로 인식된다.




<< String >>

-
String 을 만드는 좋은 방법은 @"..." 를 이용하여 만드는 것이다.

NSString* greeting = @"Hello";


-
NSString 은 다음과 같은 함수를 제공한다.

-(NSString *)captializedString;
-(unichar)characterAtIndex:(NSUInteger)index;
-(double)doubleValue;
-(float)floatValue;
-(BOOL)hasPrefix:(NSString *)aString;
-(BOOL)hasSuffix:(NSString *)aString;
-(id)initWithFormat:(NSString *)format ...;
-(NSInteger)integerValue;
-(BOOL)isEqualToString:(NSString *)aString;
-(NSUInteger)length;
-(NSString *)lowercaseString;
-(NSRange)rangeOfString:(NSString *)aString;
-(NSString *)stringByAppendingFormat:(NSString *)format ...;
-(NSString *)stringByTrimmingCharactersInSet:(NSCharacterSet *)set;
-(NSString *)substringFromIndex:(NSUInteger)anIndex;





<< Structures >>

-
Structure 는 array 와 달리 다른 형태의 type 들을 담을 수 있는 user-defined data type


-
아래와 같이 define 가능하다.

struct [structure tag]
{
member definition;
...
}[one or more structure variables];


struct Books
{
NSString *title;
NSString *author;
NSString *subject;
int book_id;
}book;


-
다음과 같이 사용 가능하다.

struct Books Book1;
Book1.title = @"Objective-C Programming";
Book1.author = @"Nuha Ali";
Book1.subject = @"Objective-C Programming Tutorial";
Book1.book_id = 6495407;


-
Structure 를 function argument 로 전달하려면 아래와 같이 하면 된다.

- (void) printBook: ( struct Books ) book;


-
Structure 를 pointer 로 가지고 있다면, variable 에 접근하기 위해서는 . 대신 -> 를 사용한다.

struct_pointer->title;


-
struct 는 bit field 로 쓰기에도 좋다. ( like EnumSet )








<< Preprocessor >>

-
preprocessor 는 compiler 가 compile 하는 일부가 아니고, compile 전에 수행되는 것을 정의하는 것이다.
컴파일러에게 compile 전에 이런 일을 해라! 라고 명령을 내리는 형태라고 보면 되겠다.
Objective-C Preprocessor 는 OCPP 라고 불린다.


-
모든 preprocessor 는 # 로 시작한다.
가독성을 위해 preprocessor 는 항상 가장 첫 줄에 오곤 한다.


-
#define : macro
#include : 다른 파일에 있는 header 를 불러온다.
#undef : preprocessor macro 를 제거한다.
#ifdef : macro 가 정의되어 있다면 true 를 return 한다.
#ifndef : macro 가 정의되어 있지 않다면 true 를 return 한다.
#if : compile time condition 을 체크한다.
#else : #if 에 붙는 녀석
#elif : else if
#error : stderr 에 대한 에러 메세지를 print
#pragma : 컴파일러에게 표준화된 방법으로 특별한 명령어를 발행한다.


-
preprocessor 예제

#define MAX_ARRY_LENGTH 20

#import <Foundation/Foundation.h>
#include "myheader.h"

#undef FILE_SIZE
#define FILE_SIZE 42

#ifndef MESSAGE
#define MESSAGER "You Wish!";
#endif

#ifdef DEBUG
...
#endif


-
Predefined Macro

ANSI C 는 여러개의 macro 를 가지고 있다.
Predefined Macro 는 modify 할 수 없다.

__DATE__ : "MMM DD YYYY" 형태의 현재 날짜
__TIME__ : "HH:MM:SS" 형태의 현재 시간
__FILE__ : 현재 파일 이름이 literal 로 들어가 있음
__LINE__ : 현재 line number
__STDC__ : 컴파일러가 ANSI standard 로 compile 한다면 1


-
Preprocessor Operators

* Macro Continuation (\)
Macro 는 보통 single line 이지만 간혹 multi line 이 될 경우 \ 를 이용해 line break 를 할 수 있다.


* Stringize (#)
Macro param 을 string 으로 변환할 때 쓰인다.

ex)
#define message_for(a,b) \
NSLog(@#a " and " #b " : We love you!\n")


* Token Pasting (##)
2개의 argument 를 합칠 때 사용된다.

ex)
#define tokenpaster(n) NSLog(@"token" #n " = %d", token##n)

int main(void)
{
int token34 = 40;
tokenpaster(34); // result is "token34 = 40"
return 0;
}


* defined() Operator
#define 을 이용해 define 되어있는지를 확인하는 조건문으로 사용된다.

ex)
#if !defined (MESSGE)
#define MESSGE "You widh!"
#endif


-
다음과 같이 parameterized macro 를 사용할 수도 있다.

#define sqaure(x) ((x) * (x)) -> square 와 ( 사이에 공백이 있으면 안 된다.





<< Typedef >>

-
typedef 는 어쩐 type 에 새로운 이름을 주기 위해 사용된다.

typedef unsigned char BYTE; // unsigned char 를 BYTE 라는 이름으로 사용하겠다.


-
typedef 값은 관례적으로 대문자로만 표시한다.



-
typedef 와 #define 의 차이

typedef 는 어떤 type 에 symbolic name 을 주기 위해 사용되는 반면, #define 은 어떤 값에 alias 를 주기 위해서 사용된다.
typedef 는 compiler 에 의해 해석되고, #define 은 preprocessor 에 의해 해석된다.





<< Type Casting >>

-
기본 casting 은 Java 와 차이가 없다.
(type_name) expression;


-
Integer Promotion

int 나 unsigned int 보다 작은 integer type 이 int 나 unsigned int 로 변환되는 것을 이야기한다.
char 형태의 ascii 코드를 integer 로 바꾸는 것을 이야기한다.


-
보통의 arithmetic conversion 은 대상이 되는 숫자들을 자동으로 casting 한다.

다음의 hierarchy 를 가지고 있다.

long double > double > float > unsigned long long > long long > unsigned long > long > unsigned int > int


이 arithmetic conversion 은 && || 와 같은 logical operator 나 assignment operator 에는 적용되지 않는다.





<< Log Handling >>

-
다음과 같은 코드를 통해 로그를 출력할 수 있다.

NSLog( @"Hello" );


-
Live app 에서는 다음과 같이 log 를 disable 할 수 있다.

#if DEBUG == 0 // debug
#define DebugLog(...)
#elif DEBUG == 1
#define DebugLog(...) NSLog(__VA_ARGS__)
#endif




<< Error Handling >>

-
NSError 는 Foundation framework 에 있는 class 로 error handling 에 좋다.
error code 나 error string 으로만 처리하던 것보다 훨씬 유연하게 error handling 을 할 수 있다.


-
NSError 는 다음의 내용을 담고 있다.

Domain
Code
User info


-
NSString *domain = @"com.test.ErrorDomain"
NSString *desc = @"Unable to complete";
NSDictionary *userInfo = [[NSDictionary alloc] initWithObjectsAndKeys:desc, @"NSLocalizedDescriptionKey", NULL];
*errorPtr = [NSError errorWithDomain:domain code:-101 userInfo:"userInfo];



<< Command-Line Arguments >>

-
Objective-C program 을 실행할 때 command line argument 를 전달할 수 있다.
이는 main 의 argc, argv[] 를 통해 전달 가능하다.

int main( int argc, char *argv[] )






반응형

댓글0