오브젝티브-C(Objective-C)는 C 프로그래밍 언어 위에 스몰토크(Small Talk) 프로그래밍 언어의 기능을 추가해 객체지향 언어로 만든 범용 언어입니다.
처음에 Objective-C는 NeXT가 NeXTSTEP OS용으로 개발했으며 Apple이 인수해서 iOS 및 Mac OS X용으로 활용중 입니다.
Objective-C는 객체 지향 개발의 네 가지 기둥을 포함하여 객체 지향 프로그래밍을 완벽하게 지원합니다.
캡슐화 (Encapsulation)
데이터 은닉 (Data hiding)
상속 (Inheritance)
다형성 (Polymorphism)
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSLog (@"Hello World");
[pool drain];
return 0;
}
// Hello World
Foundation Framwork는 다양한 기능을 제공하며 아래에 나열되어 있습니다.
여기에는 NSArray, NSDictionary, NSSet 등과 같은 확장 데이터 타입 목록이 포함됩니다.
파일, 문자열 등을 조작하는 풍부한 기능 세트로 구성됩니다.
URL 처리, 날짜 형식 지정, 데이터 처리, 오류 처리 등과 같은 유틸리티를 위한 기능을 제공합니다.
Objective-C 프로그램은 기본적으로 다음 부분으로 구성됩니다.
전처리기 명령 (Preprocessor Commands)
인터페이스 (Interface)
구현 (Implementation)
메소드 (Method)
변수 (Variables)
서술 및 표현 (Statements & Expressions)
주석 (Comments)
// 프로그램의 첫 번째 줄은 전처리기 명령으로 Objective-C 컴파일러가 실제 컴파일을 시작하기 전에 Foundation.h 파일을 포함하도록 지시합니다.
#import <Foundation/Foundation.h>
// 인터페이스를 만드는 방법을 보여줍니다. 모든 객체의 기본 클래스인 NSObject를 상속합니다. 아니면 NSObject를 상속받은 class를 상속
@interface SampleClass: NSObject
// 메소드를 선언하는 방법을 보여줍니다.
-(void)sampleMethod;
// 인터페이스의 끝을 표시합니다.
@end
//인터페이스 SampleClass를 구현하는 방법을 보여줍니다.
@implementation SampleClass
//sampleMethod의 구현을 보여줍니다.
-(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 Foundation
class SampleClass {
func sampleMethod() {
print("Hello, World!")
}
}
let sampleClass = SampleClass()
sampleClass.sampleMethod()
다음 목록은 Objective-C의 일부 예약어를 보여줍니다.
이러한 예약어는 상수나 변수 또는 기타 식별자 이름으로 사용할 수 없습니다.
Objective-C 프로그래밍 언어에서 데이터 타입은 다양한 타입의 변수 또는 함수를 선언하는 데 사용되는 광범위한 시스템을 나타냅니다.
변수의 타입은 저장 공간에서 차지하는 공간과 저장된 비트 패턴이 해석되는 방식을 결정합니다.
Objective-C의 타입은 다음과 같이 분류할 수 있습니다.
다음 표는 저장 크기와 값 범위가 있는 표준 정수 타입에 대한 세부 정보를 제공합니다.
특정 플랫폼에서 타입 또는 변수의 정확한 크기를 얻으려면 sizeof 연산자를 사용할 수 있습니다.
sizeof(type) 표현식 은 객체 또는 타입의 스토리지 크기를 바이트 단위로 산출합니다.
다음은 모든 머신에서 int 타입의 크기를 가져오는 예입니다.
#import <Foundation/Foundation.h>
int main() {
NSLog(@"Storage size for int : %d \n", sizeof(int));
return 0;
}
// Storage size for int : 4
다음 표는 저장 크기와 값 범위 및 정밀도가 있는 표준 부동 소수점 타입에 대한 세부 정보를 제공합니다.
특정 플랫폼에서 타입 또는 변수의 정확한 크기를 얻으려면 sizeof 연산자를 사용할 수 있습니다.
sizeof(type) 표현식은 객체 또는 타입의 스토리지 크기를 바이트 단위로 산출합니다.
다음은 모든 머신에서 int 타입의 크기를 가져오는 예입니다.
#import <Foundation/Foundation.h>
int main() {
NSLog(@"Storage size for float : %d \n", sizeof(float));
return 0;
}
// Storage size for float : 4
void 타입은 사용 가능한 값이 없음을 지정합니다. 세 가지 상황에서 사용됩니다.
변수는 우리 프로그램이 조작할 수 있는 저장 영역에 주어진 이름일 뿐입니다.
Objective-C의 각 변수에는 변수 메모리의 크기와 레이아웃을 결정하는 특정 유형이 있습니다.
해당 메모리에 저장할 수 있는 값의 범위 변수에 적용할 수 있는 작업 집합입니다.
변수 이름은 문자, 숫자 및 밑줄 문자로 구성될 수 있습니다. 문자나 밑줄로 시작해야 합니다.
Objective-C는 대소문자를 구분하기 때문에 대문자와 소문자가 구별됩니다.
이전 장에서 설명한 기본 유형을 기반으로 다음과 같은 기본 변수 유형이 있습니다.
변수 정의는 컴파일러에게 변수에 대한 저장소를 생성할 위치와 양을 알려주는 것을 의미합니다.
변수 정의는 데이터 유형을 지정하고 다음과 같이 해당 유형의 하나 이상의 변수 목록을 포함합니다.
// 여기서 type 은 char, w_char, int, float, double, bool 또는 사용자 정의 개체 등을 포함하는 유효한 Objective-C 데이터 유형이어야 합니다.
// variable_list 는 쉼표로 구분된 하나 이상의 식별자 이름으로 구성될 수 있습니다. 일부 유효한 선언이 여기에 표시됩니다.
type variable_list;
// 둘 다 변수 i, j 및 k를 선언하고 정의합니다. 이는 컴파일러에게 int 유형의 i, j 및 k라는 변수를 생성하도록 지시합니다.
int i,j,k;
char c, ch;
float f, salary;
double d;
변수는 선언에서 초기화(초기값 할당)할 수 있습니다.
이니셜라이저는 등호와 다음과 같은 상수 표현식으로 구성됩니다.
이니셜라이저가 없는 정의의 경우: 정적 저장 기간이 있는 변수는 암시적으로 NULL로 초기화됩니다.
모든 바이트의 값은 0입니다.
다른 모든 변수의 초기 값은 정의되지 않습니다.
type variable_name = value;
extern int d = 3, f = 5; // declaration of d and f.
int d = 3, f = 5; // definition and initializing d and f.
byte z = 22; // definition and initializes z.
char x = 'x'; // the variable x has the value 'x'.
변수 선언은 컴파일러가 변수에 대한 완전한 세부 정보 없이 추가 컴파일을 진행할 수 있도록 주어진 유형 및 이름을 가진 하나의 변수가 존재한다는 보증을 컴파일러에 제공합니다.
변수 선언은 컴파일 시에만 의미가 있으며 컴파일러는 프로그램 연결 시 실제 변수 선언이 필요합니다.
변수 선언은 여러 파일을 사용하고 파일 중 하나에 변수를 정의할 때 유용합니다.
이 파일은 프로그램을 연결할 때 사용할 수 있습니다. extern 키워드를 사용 하여 어느 곳에서나 변수를 선언합니다.
Objective-C 프로그램에서 변수를 여러 번 선언할 수 있지만 파일, 함수 또는 코드 블록에서 한 번만 정의할 수 있습니다.
#import <Foundation/Foundation.h>
// Variable declaration:
extern int a, b;
extern int c;
extern float f;
int main () {
/* variable definition */
int a, b;
int c;
float f;
/* actual initialization */
a = 10;
b = 20;
c= a + b;
NSLog(@"value of c: %d \n", c);
f= 70.0 / 3.0;
NSLog(@"value of f: %d \n", f);
return 0;
}
// value of c : 30
// value of f : 23.333334
선언 시 함수 이름을 제공하고 실제 정의가 다른 곳에서 제공될 수 있는 함수 선언에도 동일한 개념이 적용됩니다.
다음 예제에서는 C 함수를 사용하여 설명하며 Objective-C는 C 스타일 함수도 지원합니다.
#import <Foundation/Foundation.h>
// function declaration
int func();
int main() {
// function call
int i = func();
}
// function definition
int func() {
return 0;
}
Objective-C에는 두 가지 종류의 표현식이 있습니다.
lvalue : 메모리 위치를 참조하는 표현식을 "lvalue" 표현식이라고 합니다. lvalue는 할당의 왼쪽 또는 오른쪽으로 나타날 수 있습니다.
rvalue : rvalue라는 용어는 메모리의 일부 주소에 저장된 데이터 값을 나타냅니다. rvalue는 할당된 값을 가질 수 없는 표현식입니다. 즉, rvalue가 할당의 왼쪽이 아닌 오른쪽에 나타날 수 있음을 의미합니다.
변수는 lvalue이므로 할당의 왼쪽에 나타날 수 있습니다. 숫자 리터럴은 ravalue이므로 할당되지 않을 수 있으며 왼쪽에 나타날 수 없습니다.
int g = 20; // 유효함
10 = 20; // 컴파일 오류 발생
상수는 프로그램이 실행 중에 변경할 수 없는 고정 값을 나타냅니다. 이러한 고정 값은 리터럴 이라고도 합니다.
상수는 정수 상수, 부동 상수, 문자 상수 또는 문자열 리터럴과 같은 데이터 유형 중 하나일 수 있습니다. 열거형 상수도 있습니다.
상수는 정의 후에 값을 수정할 수 없다는 점을 제외하고는 일반 변수처럼 취급됩니다.
정수 리터럴은 10진수, 8진수 또는 16진수 상수일 수 있습니다. 접두사는 기수 또는 기수를 지정합니다. 16진수의 경우 0x 또는 0X, 8진수의 경우 0, 10진수의 경우 아무 것도 지정하지 않습니다.
정수 리터럴은 unsigned 및 long에 대해 각각 U와 L의 조합인 접미사를 가질 수도 있습니다. 접미사는 대문자 또는 소문자가 될 수 있으며 임의의 순서가 될 수 있습니다.
다음은 정수 리터럴의 몇 가지 예입니다.
212 /* Legal */
215u /* Legal */
0xFeeL /* Legal */
078 /* Illegal: 8 is not an octal digit */
032UU /* Illegal: cannot repeat a suffix */
85 /* decimal */
0213 /* octal */
0x4b /* hexadecimal */
30 /* int */
30u /* unsigned int */
30l /* long */
30ul /* unsigned long */
부동 소수점 리터럴에는 정수 부분, 소수점, 소수 부분 및 지수 부분이 있습니다. 소수점 형식이나 지수 형식으로 부동 소수점 리터럴을 나타낼 수 있습니다.
소수점 형식을 사용하여 나타낼 때는 소수점, 지수 또는 둘 다를 포함해야 하고 지수 형식을 사용하여 나타낼 때는 정수 부분, 소수 부분 또는 둘 다를 포함해야 합니다. 부호 있는 지수는 e 또는 E로 시작합니다.
다음은 부동 소수점 리터럴의 몇 가지 예입니다.
3.14159 /* Legal */
314159E-5L /* Legal */
510E /* Illegal: incomplete exponent */
210f /* Illegal: no decimal or exponent */
.e55 /* Illegal: missing integer or fraction */
문자 리터럴은 작은 따옴표(예: 'x')로 묶여 있으며 char 유형의 단순 변수에 저장할 수 있습니다.
문자 리터럴은 일반 문자(예: 'x'), 이스케이프 시퀀스(예: '\t) 또는 범용 문자(예: '\u02C0')일 수 있습니다.
C에서 백슬래시로 이어지는 특정 문자는 특별한 의미를 가지며 개행(\n) 또는 탭(\t)과 같이 표시하는 데 사용됩니다. 여기에 이러한 이스케이프 시퀀스 코드의 일부 목록이 있습니다.
#import <Foundation/Foundation.h>
int main() {
NSLog(@"Hello\tWorld\n\n");
return 0;
}
// Hello World
문자열 리터럴 또는 상수는 큰따옴표 ""로 묶입니다.
문자열에는 일반 문자, 이스케이프 시퀀스 및 범용 문자와 같은 문자 리터럴과 유사한 문자가 포함됩니다.
문자열 리터럴을 사용하여 긴 줄을 여러 줄로 나누고 공백을 사용하여 구분할 수 있습니다.
다음은 문자열 리터럴의 몇 가지 예입니다. 세 가지 형식은 모두 동일한 문자열입니다.
"hello, dear"
"hello, \
dear"
"hello, " "d" "ear"
C에서 상수를 정의하는 두 가지 간단한 방법이 있습니다.
#define 전처리기 사용
const 키워드를 사용합니다.
다음은 #define 전처리기를 사용하여 상수를 정의하는 형식입니다.
#define identifier value
#import <Foundation/Foundation.h>
#define LENGTH 10
#define WIDTH 5
#define NEWLINE '\n'
int main() {
int area;
area = LENGTH * WIDTH;
NSLog(@"value of area: %d", area);
NSLog(@"%c", NEWLINE);
return 0;
}
// value of area : 50
const 접두사를 사용 하여 다음과 같이 특정 유형의 상수를 선언 할 수 있습니다.
const type variable = value;
#import <Foundation/Foundation.h>
int main() {
const int LENGTH = 10;
const int WIDTH = 5;
const char NEWLINE = '\n';
int area;
area = LENGTH * WIDTH;
NSLog(@"value of area: %d", area);
NSLog(@"%c", NEWLINE);
return 0;
}
// value of area : 50
연산자는 컴파일러에게 특정 수학적 또는 논리적 조작을 수행하도록 지시하는 기호입니다.
Objective-C 언어는 내장 연산자가 풍부하며 다음 유형의 연산자를 제공합니다.
산술 연산자
관계 연산자
논리 연산자
비트 연산자
할당 연산자
기타 연산자
이 튜토리얼에서는 산술, 관계형, 논리형, 비트 단위, 할당 및 기타 연산자를 하나씩 설명합니다.
다음 표는 Objective-C 언어에서 지원하는 모든 산술 연산자를 보여줍니다.
변수 A 가 10을 보유하고 변수 B 가 20을 보유 하고 있다고 가정 하면 -
다음 표는 Objective-C 언어에서 지원하는 모든 관계 연산자를 보여줍니다.
변수 A 가 10을 보유하고 변수 B 가 20을 보유 하고 있다고 가정 하면 -
다음 표는 Objective-C 언어에서 지원하는 모든 논리 연산자를 보여줍니다.
변수 A 가 1을 보유하고 변수 B 가 0을 보유 하고 있다고 가정 하면 -
비트 연산자는 비트에 대해 작동하고 비트 단위 연산을 수행합니다.
&, |, ^에 대한 진리표는 다음과 같습니다.
비트 연산자는 비트에 대해 작동하고 비트 단위 연산을 수행합니다.
&, |, ^에 대한 진리표는 다음과 같습니다.
Objective-C 언어에서 지원하는 할당 연산자는 다음과 같습니다.
Objective-C 언어에서 지원하는 sizeof 및 ? 를 포함한 아래의 연산자는 중요합니다.
연산자 우선 순위는 식에서 용어의 그룹화를 결정합니다. 이는 표현식이 평가되는 방식에 영향을 줍니다.
특정 연산자는 다른 연산자보다 우선 순위가 높습니다. 예를 들어, 곱하기 연산자는 더하기 연산자보다 우선 순위가 높습니다.
예를 들어, x = 7 + 3 2; 여기서 x는 연산자 가 +보다 우선 순위가 높기 때문에 20이 아닌 13으로 할당되므로 먼저 3*2를 곱한 다음 7을 더합니다.
여기서 우선 순위가 가장 높은 연산자는 테이블 상단에 표시되고 가장 낮은 연산자는 하단에 나타납니다.
표현식 내에서 우선 순위가 더 높은 연산자가 먼저 평가됩니다.
코드 블록을 여러 번 실행해야 하는 상황이 있을 수 있습니다. 일반적으로 명령문은 순차적으로 실행됩니다. 함수의 첫 번째 명령문이 먼저 실행되고 두 번째 명령문이 실행되는 식입니다.
프로그래밍 언어는 더 복잡한 실행 경로를 허용하는 다양한 제어구조를 제공합니다.
루프문을 사용하면 명령문 또는 명령문 그룹을 여러 번 실행할 수있으며 다음은 대부분의 프로그래밍 언어에서 루프문의 일반적인 형식입니다.
Objective-C 프로그래밍 언어는 루프 요구 사항을 처리하기 위해 다음 유형의 루프를 제공합니다.
루프 제어 문은 정상적인 순서에서 실행을 변경합니다. 실행이 범위를 벗어나면 해당 범위에서 생성된 모든 자동 개체가 소멸됩니다.
Objective-C는 다음 제어문을 지원합니다.
조건이 거짓이 되지 않으면 루프가 무한 반복이 됩니다.
for 반복문은 전통적으로 이러한 목적으로 사용됩니다.
for 반복문을 구성하는 세 개의 표현식 중 어느 것도 필요하지 않으므로 조건 표현식을 비워두면 무한 반복문을 만들 수 있습니다.
#import <Foundation/Foundation.h>
int main() {
for( ; ; ) {
NSLog(@"This loop will run forever.\n");
}
return 0
}
조건문은 프로그래머가 프로그램이 평가하거나 테스트할 하나 이상의 조건과 조건이 참으로 판단되면 실행할 명령문 및 조건이 참일 경우 실행할 다른 명령문을 지정하도록 요구합니다.
다음은 대부분의 프로그래밍 언어에서 볼 수 있는 일반적인 의사결정 구조의 일반적인 형태입니다.
Objective-C 프로그래밍 언어는 0 이 아닌 값과 null이 아닌 값을 true 로 가정하고, 0 또는 null이면 false 값 으로 가정 합니다.
Objective-C 프로그래밍 언어는 다음과 같은 유형의 의사 결정 문을 제공합니다.
우리는 이전 장에서 본 조건부 연산자 ? : 를 if...else 문 을 대체하는 데 사용할 수 있습니다.
? : 연산자는 다음과 같은 일반적인 형태를 가지고 있습니다 -
Exp1 ? Exp2 : Exp3;
여기서 Exp1, Exp2 및 Exp3은 표현식입니다. 콜론의 사용과 위치에 주목하십시오.
의 값은 ? 표현식은 다음과 같이 결정됩니다. Exp1이 평가됩니다. true이면 Exp2가 평가되어 전체 ? 표현. Exp1이 false이면 Exp3이 평가되고 해당 값이 표현식의 값이 됩니다.