안녕하세요 진코드93입니다~!
16일차에는 저번과 연이어 Objective-C에 대해서 알아보는 시간을 가졌어요~!
그런데 블로그에 작성을 하려고 보니 코드블럭에는 Objective-C가 없더라구요...ㅎ
그래서 그나마 가장 비슷하게 색이 칠해지는 C#으로 작성을 해놓겠습니다~!
C#으로 작성될 뿐 안에 내용은 Objective-C이므로 꼭! 확인해주세요 ㅎㅎ
Objective-C 알아보기
참고
https://www.tutorialspoint.com/compile_objective-c_online.php
온라인 컴파일러
https://www.tutorialspoint.com/objective_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() {
NSAutoreleasePool*pool = [[NSAutoreleasePool alloc] init];
NSLog(@"hello world");
[pool drain];
return 0;
}
기초 프레임워크
Foundation Framework는 다양한 기능을 제공하며 아래에 나열되어 있습니다.
- 여기에는 NSArray, NSDictionary, NSSet 등과 같은 확장 데이터 타입 목록이 포함됩니다.
- 파일, 문자열 등을 조작하는 풍부한 기능 세트로 구성됩니다.
- URL 처리, 날짜 형식 지정, 데이터 처리, 오류 처리 등과 같은 유틸리티를 위한 기능을 제공합니다.
프로그램 구조
Objective-C 프로그램은 기본적으로 다음 부분으로 구성됩니다.
- 전처리기 명령 (Preprocessor Commands)
- 인터페이스 (Interface)
- 구현 (Implementation)
- 메소드 (Method)
- 변수 (Variables)
- 진술 및 표현 (Statements & Expressions)
- 주석 (Comments)
예제 코드
Objective-C 버전
#import <Foundation/Foundation.h> // Foundation Framework를 적용합니다.
// 인터페이스와 구현부를 따르 구현한다면 총 파일이 2개로 생성
// 1. 인터페이스 파일의 선언부(파일명 OOO.h) #import <Foundation>
// 2. 구현 파일의 선언부 #import “OOO.h - OOO.h 파일을 참조하도록 선언
@interface SampleClass:NSObject // 인터페이스를 만드는 방법을 보여줍니다. 모든 객체의 기본 클래스인 NSObject를 상속합니다.
-(void)sampleMethod; // 메소드를 선언하는 방법을 보여줍니다.
@end // 인터페이스의 끝을 표시합니다.
@implementation SampleClass // SampleClass의 구현을 보여줍니다.
-(void)sampleMethod { // sampleMethod의 구현을 보여줍니다.
NSLog(@“Hello, World! \n”);
}
@end // 구현의 끝을 표시합니다.
int main() { // 프로그램 실행이 시작되는 주요 함수입니다.
// my first program in Objective-C
SampleClass *sampleClass = [[SampleClass alloc]init];
[sampleClass sampleMethod];
return 0; // main함수를 종료하고 0을 반환합니다.
}
Swift 버전
import Foundation
class SampleClass {
func sampleMethod() {
print(“Hello, World”);
}
}
let sampleClass = SampleClass()
sampleClass.sampleMethod()
=> 역시 스위프트가 짱이다…ㅎ
예약어 (Keywords)
다음 목록은 Objective-C의 일부 예약어를 보여줍니다.
이러한 예약어는 상수나 변수 또는 기타 식별자 이름으로 사용할 수 없습니다.
auto | else | long | switch | break | enum |
register | typedef | case | extern | return | union |
char | float | short | unsigned | const | for |
signed | void | continue | goto | sizeof | volatile |
default | if | static | while | do | int |
struct | _Packed | double | protocol | interface | implementation |
NSObject | NSInteger | NSNumber | CGFloat | property | nonatomic; |
retain | strong | weak | readonly | readwrite | unsafe_unretained; |
데이터 타입
Objective-C 프로그래밍 언어에서 데이터 타입은 다양한 타입의 변수 또는 함수를 선언하는 데 사용되는 광범위한 시스템을 나타냅니다.
변수의 타입은 저장 공간에서 차지하는 공간과 저장된 비트 패턴이 해석되는 방식을 결정합니다.
Objective-C의 타입은 다음과 같이 분류할 수 있습니다.
타입 및 설명 | |
기본 타입(Basic Types) | 이들은 산술 타입이며 정수 타입 및 부동 소수점 타입의 두 가지 타입으로 구성됩니다. |
열거형(Enumerated types) | 산술 타입이며 프로그램 전체에서 특정 불연속 정수 값만 할당할 수 있는 변수를 정의합니다. |
타입 무효(The type void) | 형식 지정자 void는 사용할 수 있는 값이 없음을 나타냅니다. |
파생 타입(Derived types) | 포인터 타입, 배열 타입, 구조 타입, 통합 타입 및 함수 타입이 포함됩니다. |
정수 타입
다음 표는 저장 크기와 값 범위가 있는 표준 정수 타입에 대한 세부 정보를 제공합니다.
타입 | 크기 | 범위 |
char | 1 byte | -128 ~ 127 또는 0 ~ 255 |
unsigned char | 1 byte | 0 ~ 255 |
signed char | 1 byte | -128 ~ 127 |
int | 2 또는 4 byte | -32,768 ~ 32,767 또는 -2,147,483,648 ~ 2,147,483,647 |
unsigned int | 2 또는 4 byte | 0 to 65,535 ~ 0 to 4,294,967,295 |
short | 2 byte | -32,768 ~ 32,767 |
unsigned short | 2 byte | 0 ~ 65,535 |
long | 4 byte | -2,147,483,648 ~ 2,147,483,647 |
unsigned long | 4 byte | 0 ~ 4,294,967,295 |
부동소수점 타입
다음 표는 저장 크기와 값 범위 및 정밀도가 있는 표준 부동 소수점 타입에 대한 세부 정보를 제공합니다.
타입 | 크기 | 범위 | 정확도 |
float | 4 byte | 1.2E-38 ~ 3.4E+38 | 소수점 이하 6자리 |
double | 8 byte | 2.3E~308 ~ 1.7E+308 | 소수점 이하 15자리 |
long double | 10 byte | 3.4E-4932 ~ 1.1E+4932 | 소수점 이하 19자리 |
void 타입
void 타입은 사용 가능한 값이 없음을 지정합니다.
타입 | 설명 | 예시 |
함수가 void로 반환됩니다. | Objective-C에는 값을 반환하지 않거나 void를 반환한다고 말할 수 있는 다양한 함수가 있습니다. 반환값이 없는 함수는 반환 형식이 void입니다. | void exit (int status); |
void로서의 함수 인수 | Objective-C에는 매개변수를 허용하지 않는 다양한 기능이 있습니다. 매개변수가 없는 함수는 무효로 받아들일 수 있습니다. | int rand(void); |
변수
변수는 우리 프로그램이 조작할 수 있는 저장 영역에 주어진 이름일 뿐입니다. Objective-C의 각 변수에는 변수 메모리의 크기와 레이아웃을 결정하는 특정 유형이 있습니다. 해당 메모리에 저장할 수 있는 값의 범위 변수에 적용할 수 있는 작업 집합입니다.
변수 이름은 문자, 숫자 및 밑줄 문자로 구성될 수 있습니다. 문자나 밑줄로 시작해야 합니다. Objective-C는 대소문자를 구분하기 때문에 대문자와 소문자가 구별됩니다. 이전 장에서 설명한 기본 유형을 기반으로 다음과 같은 기본 변수 유형이 있습니다.
타입 | 설명 |
char | 일반적으로 단일 옥텟(1바이트)입니다. 이것은 정수 타입입니다. |
int | 가장 자연스러운 정수 크기입니다. |
float | 단정밀도 부동 소수점 값입니다. |
double | 배정밀도 부동 소수점 값입니다. |
void | 유형이 없음을 나타냅니다. |
변수 선언
변수 선언은 컴파일러가 변수에 대한 완전한 세부 정보 없이 추가 컴파일을 진행할 수 있도록 주어진 유형 및 이름을 가진 하나의 변수가 존재한다는 보증을 컴파일러에 제공합니다.
변수 선언은 컴파일 시에만 의미가 있으며 컴파일러는 프로그램 연결 시 실제 변수 선언이 필요합니다.
변수 선언은 여러 파일을 사용하고 파일 중 하나에 변수를 정의할 때 유용합니다.
이 파일은 프로그램을 연결할 때 사용할 수 있습니다. 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(@"%d + %d = %d", a, b, c);
f = 70.0/3.0;
NSLog(@"f: %f", f);
return 0;
}
L값표현식과 R값표현식
Objective-C에는 두 가지 종류의 표현식이 있습니다.
-lvalue : 메모리 위치를 참조하는 표현식을 “lvalue” 표현식이라고 합니다. lvalue는 할당의 왼쪽 또는 오른쪽으로 나타날 수 있습니다.
-rvalue : rvalue라는 용어는 메모리의 일부 주소에 저장된 데이터 값을 나타냅니다. rvalue는 할당된 값을 가질 수 없는 표현식입니다. 즉, rvalue가 할당의 왼쪽이 아닌 오른쪽에 나타날 수 있음을 의미합니다.
변수는 lvalue이므로 할당의 왼쪽에 나타날 수 있습니다. 숫자 리터럴은 rvalue이므로 할당되지 않을 수 있으며 왼쪽에 나타날 수 없습니다
상수
상수는 프로그램이 실행 중에 변경할 수 없는 고정 값을 나타냅니다. 이러한 고정 값은 리터럴 이라고도 합니다.
상수는 정수 상수, 부동 상수, 문자 상수 또는 문자열 리터럴과 같은 기본 데이터 유형 중 하나일 수 있습니다. 열거형 상수도 있습니다.
상수는 정의 후에 값을 수정할 수 없다는 점을 제외하고는 일반 변수처럼 취급됩니다.
정수 리터럴
정수 리터럴은 10진수, 8진수 또는 16진수 상수일 수 있습니다. 접두사는 기수 또는 기수를 지정합니다. 16진수의 경우 0x 또는 0X, 8진수의 경우 0, 10진수의 경우 아무것도 지정하지 않습니다.
정수 리터럴은 unsigned 및 long에 대해 각각 U와 L의 조합인 접미사를 가질 수도 있습니다. 접미사는 대문자 또는 소문자가 될 수 있으며 임의의 순서가 될 수 있습니다.
다음은 정수 리터럴의 몇 가지 예입니다.
부동 소수점 리터럴
부동 소수점 리터럴에는 정수 부분, 소수점, 소수 부분 및 지수 부분이 있습니다. 소수점 형식이나 지수 형식으로 부동 소수점 리터럴을 나타낼 수 있습니다.
소수점 형식을 사용하여 나타낼 때는 소수점, 지수 또는 둘 다를 포함해야 하고 지수 형식을 사용하여 나타낼 때는 정수 부분, 소수 부분 또는 둘 다를 포함해야 합니다. 부호 있는 지수는 e 또는 E로 시작합니다.
다음은 부동 소수점 리터럴의 몇 가지 예입니다.
문자상수
문자 리터럴은 작은 따옴표(예: ‘x’)로 묶여 있으며 char 유형의 단순 변수에 저장할 수 있습니다.
문자 리터럴은 일반 문자(예: ‘x’), 이스케이프 시퀀스(예: ‘\t’) 또는 범용 문자(예: ‘\u02C0’)일 수 있습니다.
C에서 백슬래시로 이어지는 특정 문자는 특별한 의미를 가지며 개행(\n) 또는 탭(\t)과 같이 표시하는 데 사용됩니다. 여기에 이러한 이스케이프 시퀀스 코드의 일부 목록이 있습니다.
탈출 시퀀스 | 설명 |
\\ | \ |
\' | ' |
\" | " |
\n | 줄바꿈 |
\t | 탭 |
문자상수 예제
#import <Foundation/Foundation.h>
int main() {
NSLog(@"Hello\t\tWorld\n\n");
NSLog(@"\nMy name is \n\tned");
return 0;
}
문자열 리터럴
문자열 리터럴 또는 상수는 큰따음표 “”로 묶입니다.
문자열에는 일반 문자, 이스케이프 시퀀스 및 범용 문자와 같은 문자 리터럴과 유사한 문자가 포함됩니다.
문자열 리터럴을 사용하여 긴 줄을 여러 줄로 나누고 공백을 사용하여 구분할 수 있습니다.
다음은 문자열 리터럴의 몇 가지 예입니다. 세 가지 형식은 모두 동일한 문자열입니다.
상수 정의
C에서 상수를 정의하는 두 가지 간단한 방법이 있습니다.
- #define 전처리기 사용(위험함, 권장되지 않음)
- const 키워드를 사용합니다.
상수 예제
#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;
}
연산자
연산자는 컴파일러에게 특정 수학적 또는 논리적 조작을 수행하도록 지시하는 기호입니다.
Objective-C 언어는 내장 연산자가 풍부하며 다음 유형의 연산자를 제공합니다.
- 산술 연산자
- 관계 연산자
- 논리 연산자
- 비트 연산자
- 할당 연산자
- 기타 연산자
이 튜토리얼에서는 산술, 관계형, 논리형, 비트 단위, 할당 및 기타 연산자를 하나씩 설명합니다.
산술 연산자
다음 표는 Objective-C 언어에서 지원하는 모든 산술 연산자를 보여줍니다.
변수 A가 10을 보유하고 변수 B가 20을 보유하고 있다고 가정하면 다음과 같다.
연산자 | 설명 | 예시 | 결과 |
+ | 두 개의 피연산자를 더합니다. | A + B | 30 |
- | 첫번째 피연산자에서 두번째 피연산자를 뺍니다. | A - B | -10 |
* | 두 피연산자를 곱합니다. | A * B | 200 |
/ | 분자를 분모로 나눕니다. | B / A | 2 |
% | 정수 나누기 후 나머지 | B % A | 0 |
++ | 정수값을 1만큼 증가시키는 증가 연산자 | A++ | 11 |
-- | 정수값을 1만큼 감소시키는 감소 연산자 | A-- | 9 |
관계 연산자
다음 표는 Objective-C 언어에서 지원하는 모든 관계 연산자를 보여줍니다.
변수 A가 10을 보유하고 변수 B가 20을 보유하고 있다고 가정하면 다음과 같다.
연산자 | 설명 | 예시 | 결과 |
== | 두 피연산자의 값이 같은지 여부를 확인합니다. 그렇다면 조건이 참이 됩니다. |
A == B | 거짓 |
!= | 두 피연산자의 값이 같은지 여부를 확인합니다. 값이 같지 않으면 조건이 참이 됩니다. |
A != B | 참 |
> | 왼쪽 피연산자의 값이 오른쪽 피연산자의 값보다 큰지 확인합니다. 그렇다면 조건이 참이 됩니다. |
A > B | 거짓 |
< | 왼쪽 피연산자의 값이 오른쪽 피연산자의 값보다 작은지 확인합니다. 그렇다면 조건이 참이 됩니다. |
A < B | 참 |
>= | 왼쪽 피연산자의 값이 오른쪽 피연산자의 값보다 크거나 같은지 확인합니다. 그렇다면 조건이 참이 됩니다. |
A >= B | 거짓 |
<= | 왼쪽 피연산자의 값이 오른쪽 피연산자의 값보다 작거나 같은지 확인합니다. 그렇다면 조건이 참이 됩니다. |
A <= B | 참 |
논리 연산자
다음 표는 Objective-C 언어에서 지원하는 모든 논리 연산자를 보여줍니다.
변수 A가 1을 보유하고 변수 B가 0을 보유하고 있다고 가정하면 다음과 같다.
연산자 | 설명 | 예시 | 결과 |
&& | 논리 AND 연산자라고 합니다. 두 피연산자가 모두 0이 아니면 조건이 참이 됩니다. |
A && B | 거짓 |
|| | 논리 OR 연산자라고 합니다. 두 피연산 중 하나라도 0이 아니면 조건이 참이 됩니다. |
A || B | 참 |
! | 논리 NOT 연산자라고 합니다. 피연산자의 논리 상태를 반전하는 데 사용합니다. 조건이 참이면 논리 NOT 연산자는 거짓을 만듭니다. |
!(A && B) | 참 |
비트 연산자
비트 연산자는 비트에 대해 작동하고 비트 단위 연산을 수행합니다.
&, |, ^에 대한 진리표는 다음과 같습니다.
p | q | p & q | p | q | p ^ q |
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
연산자 | 설명 | 예시 | 결과 |
& | 이진 AND 연산자는 두 피연산자 모두에 존재하는 경우 결과에 비트를 복사합니다. | A & B | 0000 1100 (12) |
| | 이진 OR 연산자는 피연산자 중 하나에 존재하는 경우 비트를 복사합니다. | A | B | 0011 1101 (61) |
^ | 이진 XOR 연산자는 하나의 피연산자에만 설정되어 있으면 비트를 복사합니다. | A ^ B | 0011 0001 (49) |
~ | 이진 1의 보수 연산자는 단항이며 비트를 '뒤집는' 효과가 있습니다. | ~A | 1100 0011 (-61) |
<< | 이진 왼쪽 시프트 연산자. 왼쪽 피연산자 값은 오른쪽 피연산자가 지정한 비트 수만큼 왼쪽으로 이동합니다. | A << 2 | 1111 0000 (240) |
>> | 이진 오른쪽 시프트 연산자. 왼쪽 피연산자 값은 오른쪽 피연산자가 지정한 비트 수만큼 오른쪽으로 이동합니다. | A >> 2 | 0000 1111 (15) |
할당 연산자
Objective-C 언어에서 지원하는 할당 연산자는 다음과 같습니다.
연산자 | 설명 | 예시 | |
= | 단순 할당 연산자 오른쪽 피연산자에서 왼쪽 피연산자로 값 할당 |
C = A + B | |
+= | AND 대입 연산자 왼쪽 피연산자에 오른쪽 피연산자를 더하고 결과를 왼쪽 피연산자에 대입합니다. |
C += A | C = C + A |
-= | 빼기 AND 대입 연산자 왼쪽 피연산자에서 오른쪽 피연산자를 빼고 결과를 왼쪽 피연산자에 대입합니다. |
C -= A | C = C - A |
*= | 곱하기 AND 할당 연산자 오른쪽 피연산자에 왼쪽 피연산자를 곱하고 결과를 왼쪽 피연산자에 대입합니다. |
C *= A | C = C * A |
/= | 나누기 AND 할당 연산자 왼쪽 피연산자를 오른쪽 피연산자로 나누고 결과를 왼쪽 피연산자에 대입합니다. |
C /= A | C = C / A |
%= | 나누기 몫 할당 연산자 두 개의 피연산자를 사용하여 나누기를 취하고 나머지 왼쪽 피연산자에 할당합니다. |
C %= A | C = C % A |
sizeof와 삼항 연산자
Objective-C 언어에서 지원하는 sizeof 및 ? 를 포함한 아래의 연산자는 중요합니다.
연산자 | 설명 | 예시 |
sizeof() | 변수의 크기를 반환합니다. | sizeof(a) - (여기서 a는 정수)는 4를 반환합니다. |
& | 변수의 주소를 반환합니다. | &a; - 변수의 실제 주소를 제공합니다. |
* | 변수에 대한 포인터입니다. | *a; - 변수를 가리킬 것입니다. |
?: | 조건식 | 조건이 참이면? 그러면 값 X : 그렇지 않으면 값 Y |
반복문 간단 예제
#import <Foundation/Foundation.h>
int main() {
int a = 10;
int i, j;
while( a < 20 ) {
NSLog(@"while : value of a: %d\n", a);
a++;
}
for( a = 10; a < 20; a += 1 ) {
NSLog(@"for : value of a: %d\n", a);
}
a = 10;
do {
NSLog(@"do-while : value of a: %d\n", a);
a++;
} while( a < 20 );
for( i = 1; i < 10 ; i += 1) {
for( j = 1; j < 10 ; j += 1) {
NSLog(@"%d x %d = %d", i, j, (i * j));
}
}
return 0;
}
반복문 간단 예제 - break, continue
#import <Foundation/Foundation.h>
int main () {
int a = 10;
while( a < 20) {
NSLog(@"value of a: %d\n", a);
a++;
if (a > 15) {
break;
}
}
a = 10;
do {
if( a == 15 ) {
a = a + 1;
continue;
}
NSLog(@"value of a: %d\n", a);
a++;
} while( a < 20 );
return 0;
}
'멋쟁이 사자처럼 앱스쿨 1기 > 회고록' 카테고리의 다른 글
멋사 앱 스쿨 1기 18일차 회고록/TIL (22.10.11) - Objective-C (1) | 2022.10.18 |
---|---|
멋사 앱 스쿨 1기 17일차 회고록/TIL (22.10.07) - Objective-C (0) | 2022.10.17 |
멋사 앱 스쿨 1기 15일차 회고록/TIL (22.10.05) - 클로저, Objective-C 맛보기 (0) | 2022.10.14 |
멋사 앱 스쿨 1기 14일차 회고록/TIL (22.10.04) - 에러 핸들링, Swift 심화 (1) | 2022.10.13 |
멋사 앱 스쿨 1기 13일차 회고록/TIL (22.09.30) - DevOps, Git (0) | 2022.10.12 |