본문 바로가기

멋쟁이 사자처럼 앱스쿨 1기/회고록

멋사 앱 스쿨 1기 16일차 회고록/TIL (22.10.06) - Objective-C

안녕하세요 진코드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;
}

 



Calendar
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Visits
Today
Yesterday