DADAHAE's Log
비싼 장난감 가지고 노는 중 (❁´▽`❁)*✲゚*
[TIL] 22-10-06: Objective-C 기본 지식
22-10-06 목요일
4주차

 

 

 

 

 

 

 

 

 

 

WARNING
⚠️ 경고 ⚠️

이곳은 고대 언어 발굴 현장입니다. 
C언어 계열에 알러지가 있으신 분은 특히 주의 바랍니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

✔️ Objective-C

  • 온라인 컴파일러

Online Objective-C Compiler

  • Objective-C Tutorial

Objective-C Tutorial

 

 

0️⃣ Overview

  • C + Small Talk + 기능 추가 → Objective-C

 

1️⃣ Object Oriented Programming

  • 옵젝씨는 객체 지향 개발의 4가지 기둥을 포함하여 객체 지향 프로그래밍을 완벽하게 지원한다.
    • Encapsulation
      • 프로퍼티나 메소드를 잘 모아서 하나의 이름으로 만든 것
    • Data hiding
      • 내가 내부의 코드를 몰라도 쓸 수 있게 해주는 것
      • 내 코드를 누군가 활용하게 하려면 문서에 변수 이름과 get, set 프로퍼티 이름만 제공해주고 내부는 신경쓰지 마세요~
      • ex) 암호화 코드
    • Inheritance
      • override, 기능 추가… 등등
    • Polymorphism
      • 똑같은 메소드라도
  • NS-?
    • NSObject 를 상속받은 것들이다.
    • NS는 NextStep. 1980년대부터 있던 것들이다.

 

✏️ 예제코드1 Hello world!

#import <Foundation/Foundation.h>

int main() {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    
    NSLog(@"Hello, world");
    
    [pool drain];
    return 0;
}
  • [[NSAutoreleasePool alloc] init] 를 swift로 바꿔서 생각해보면 옵셔널 체이닝과 비슷하다.
    • NSAutoreleasePool.alloc().init()
    • 완전히 같다는 건 아니고 유사하게 설명할 수있다.
    • * : Pointer

 

3️⃣ Foundation Framwork

도움되는 코드 뭉치 (라고 생각하자)
  • 다양한 기능을 제공한다.
    • NSArray, NSDictionary, NSSet 등과 같은 확장 데이터 타입 목록이 포함된다.
    • 파일(NSFileManager), 문자열(NSString) 등을 조작하는 풍부한 기능 세트로 구성된다.
    • URL 처리(NSURL), 날짜 형식 지정(NSDate), 데이터 처리(NSData), 오류 처리(NSError) 등과 같은 유틸리티를 위한 기능을 제공한다.
  • 어떻게 호출하나?
#import <Foundation/Foundation.h>

여기서 Struct는 Swift의 Struct와 다르당. 기능이 더 한정적이다.

그래서 class로 모든 것을 다한다~

 

4️⃣ Program Structure

Objective-C 프로그램은 기본적으로 아래와 같은 부분으로 구성된다.

  • Preprocessor Commands
    • 본격 코드 전에 먼저 처리할 것들
  • Interface
    • 이것만 봐도 호출해서 쓸 수 있게 함
  • Implementation
    • Interface를 구현함 (C++과 구분되는 점)
  • Method
    • 매개변수의 이름을 모두 적어야 한다.
    • 매개변수의 타입을 모두 적는다(Small Talk에서 그랬음. Swift도 그것을 물려받았다).
add(3, 5)   # C, JS

[myObj addWithFirst:3 Second:5]   # Objective-C

myObj.add(first:3, second:5)      # Swift
  • Variable
    • 기본이 변수다. 상수는 없다. (옛날 개념. 요즘엔 기본이 상수 in Rust)
  • Statement & Expression
  • Comments
더보기

DocC ?

코드 안에 소개, 설명 뽑아두면 이것을 기반으로 문서 만듦

 

✏️ 예제코드2

#import <Foundation/Foundation.h>

// 하나의 interface 만드는 법 (이 부분을 단독 파일로 만들기도 함)
@interface SampleClass:NSObject
- (void)sampleMethod;
@end

// interface 구현하기 (implementation - main 부분을 하나의 파일로 만들기도 함)
@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;
}
  • interface ~ end, implementation ~ end
    • class
  • #import <Foundation/Foundation.h>
    • 전처리기 명령어
    • Objective-C 컴파일러가 실제 컴파일을 시작하기 전에 Foundation.h 파일을 포함하도록 지시함
    • #include는 기계어로 그냥 붙어오는데, 위 명령어는 중복없게 해줌! (더 좋다는 말)

 

(1) 하나의 interface 만드는 법 (이 부분을 단독 파일로 만들기도 함)

  • @interface SampleClass: NSObject
    • 인터페이스를 만드는 방법을 보여줌
    • 모든 객체의 기본 클래스인 NSObject를 상속함
    • 아니면 NSObject를 상속받는 class를 상속
  • - (void)sampleMethod;
    • 메소드를 선언하는 방법을 보여줌
    • 메소드의 이름만 적어준다.
    • 빼기 (아니면 더하기) 반환타임 메소드이름
  • @end
    • 인터페이스의 끝 표시

 

더보기

-, + ?

  • (R)mn { … } → func mn() { … }
  • (R)mn { … } → class func mn() { … }

 

 

(2) interface 구현하기 (implementation - main 부분을 하나의 파일로 만들기도 함)

  • @implementation SampleClass
    • 인터페이스 SampleClass 구현하는 방법을 보여줌
  • - (void)sampleMethod { … }
    • 인터페이스에서 적었던 메소드 이름, 반환타입 그대로 가져옴
    • sampleMethod 의 구현
  • @end
    • 구현의 끝 표시

 

(3) 프로그램 실제 실행부

  • int main() { … }
    • 프로그램 실행이 시작되는 주요 함수
  • return 0;
    • 함수 실행을 끝내고 0을 리턴한다.

 

 

위의 코드를 Swift로 작성해보자.

import Foundation

struct SampleStruct {
  func sampleMethod() {
    print("Hello, world!")
  }
}

let sampleStruct = SampleStruct()
sampleStruct.sampleMethod()

 

5️⃣ Type

 

Keywords

  • 예약어는 상수, 변수 또는 기타 식별자 이름으로 사용할 수 없다

 

Data Types

데이터 타입은 다양한 타입의 변수 또는 함수를 선언하는 데 사용되는 광범위한 시스템을 나타낸다.

변수의 타입→ 저장 공간에서 차지하는 공간과 저장된 비트 패턴이 해석되는 방식을 결정한다.

  • Basic Type (기본타입)
    • 산술 타입
    • 정수 타입, 부동 소수점 타입 (2가지로만 구성)
  • Enumerated types (열거형)
    • 산술 타입
    • 프로그램 전체에서 특정 불연속 정수 값만 할당할 수 있는 변수 정의
  • The type void (타입 무효)
    • 형식 지정자 void : 사용할 수 있는 값이 없음을 나타냄
  • Derived types (파생 타입)
    • 포인터 타입, 배열 타입, 구조 타입, 통합 타입 및 함수 타입이 포함됨

 

Integers Types

정수 타입

C언어가 주는 타입인데 이것으로 기본 계산을 한다.

  • char, unsigned char, signed char, int, unsigned int, short, unsigned short, long, unsigned long

 

Floating-Point Types

부동소수점 타입
  • float
  • double
  • long double

 

The void Type

  • void
    • 사용 가능한 값이 없음을 지정함
  • 사용하는 상황 
    • 함수가 void 로 반환된다. "void exit (int status);"
    • void로서의 함수 인수 "int rand(void);"

흠..ㅎ므..음...음..

 

 

🦁 13:00 ~ 13:40 외출 신청으로 중간에 못들음!
13:30 에 빠른 복귀

 

 

6️⃣ Variable

Variable Definition

변수 선언

?

#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);   // value of c : 30

  f = 70.0/3.0;
  NSLog(@"value of f : %f \\n", f);   // value of f : 23.333334
 
  return 0;
}

 

#import <Foundation/Foundation.h>

int main() {
    int a, b, c;
    float f;
    
    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;
}

 

  • 선언시 함수 이름을 제공하고 실제 정의가 다른 곳에서 제공될 수 있는 함수 선언에도 동일한 개념이 적용된다.

아래 코드는 C함수를 사용하고 있고, Objective-C는 C 스타일 함수도 지원한다.

// function declaration
int func();

int main() {
	// function call
	int i = func();
}

// function definition
inf func() {
	return 0;
}

 

Lvalue and Rvalue

L값 표현식과 R값 표현식

등호를 중심으로 L,R 을 말하는 것이다.

  • Lvalue
    • 메모리 위치를 참조하는 표현식
    • Lvalue는 할당의 왼쪽 또는 오른쪽으로 나타날 수 있다.
  • Rvlaue
    • 메모리 일부 주소에 저장된 데이터 값을 나타낸다.
    • Rvalue는 할당된 값을 가질 수 없는 표현식(오른쪽에만 나타날 수 있다)
  • 변수는 Lvalue 이므로 할당의 왼쪽에 나타날 수 있다.
  • 숫자 리터럴은 Rvalue이므로 할당되지 않을 수 있다. 왼쪽에 나타날 수 없다.

 

7️⃣ Constants

상수
  • 프로그램 실행 중 변경x, 고정값(리터럴 = 해당 type의 원형)
  • 정수 상수, 부동 상수, 문자 상수 또는 문자열 리터럴과 같은 기본 데이터 유형 중 하나
  • 열거형(enum) 상수도 있다.
  • 정의 후 값 수정이 안되는 점을 제외하면 일반 변수처럼 취급

 

Integer Literals

대표적인 C언어 상수
  • 10진수, 8진수, 16진수 상수일 수 있다.
    • 접두사 : 기수 또는 기수 지정
    • 16진수 → 0x, 0X
    • 8진수 → 0
    • 10진수 → 아무것도 지정 안함
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

 

Floating-point Literals

  • 부동 소수점 리터럴
    • 정수 부분 + 소수점 + 소수 부분 및 지수 부분
    • 소수점 형식 or 지수 형식으로 나타낼 수 있음
  • 소수점 형식을 사용할 때…
    • 소수점, 지수 또는 둘 다 포함해야 한다.
    • 지수 형식을 사용하여 나타낼 때는 정수 부분, 소수 부분 또는 둘 다를 포함해야 한다.
    • 부호 있는 지수는 e 또는 E로 시작한다.
3.14159      // Legal
314159E-5L   // Legal
510E         // illgal: incomplete exponent
210f         // illgal: no decimal or exponent
.e55         // illgal: missing integer or fraction

 

Character Constants

문자 상수
  • 문자 리터럴은 작은 따옴표에 묶여있음
  • char 유형의 단순 변수에 저장 가능
  • 일반 문자, 이스케이프 시퀀스, 범용 문자
  • \\, \’, \”, \n, \t
#import <Foundation/Foundation.h>

int main() {
	NSLog(@"Hello\\t\\tWorld\\n\\n");
	return 0;
}

 

String Literals

문자열 리터럴
  • 문자열 리터럴 또는 상수는 큰따옴표로 묶인다.
  • 일반문자, 이스케이프 시퀀스, 범용문자와 같은 문자 리터럴과 유사한 문자가 포함된다.

 

Defining Constants

C에서 상수를 정의하는 2가지 간단한 방법!

  • #define 전처리기
  • const 키워드

 

The #define Preprocessor

  • 컴파일 완료 저에 먼저!(preprocessor)
#define identifier value
// 컴파일될 때 코드의 모든 identifier를 value로 바꿈

 

#import <Foundation/Foundtaion.h>

#define LENGTH 10
#define WIDTH 5
#define NEWLINE '\\n'

int main() {
	int area;
	are = LENGTH * WIDTH;
	LSLog(@"value of area : %d", area);
	LSLog(@"%c", NEWLINE);

	return 0;
}

 

The const Keyword

  • 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;
}

 

 

더보기

Q. 상수명을 대문자로 하는건 일부러 구별하는 걸까요??

A. C언어 계열에서 상수는 대문자로 이름 짓는 것이 국룰입니다

 

더보기

📌 만약 상수에 값을 바꾸려고 하면 어떻게 될까?

 

LENGTH = 15

위의 코드를 추가하였다.

에러가 난다.

읽기 전용인 ‘LENGTH’에 할당이 일어났다는 것이다. 상수는 읽기 전용이다!

 

 

더보기

📌  define으로 선언한 상수에 값을 바꾸면 어떻게 될까?

 

#define TEST 5

int main() {
	NSLog(@"%d", TEST);
	TEST = 10;

	return 0;
}

위 코드를 추가하고 돌려봤다.

 

에러 메세지가 조금 다르다.

할당의 왼쪽 피연산자로 lvalue가 필요하다. TEST는 아예 상수값으로 처리가 안되고, 10에 대한 lvalue가 필요하다고 한다! 두둥.

뭔말이야..?

 

더보기

그래서 질문해봤다.

 

Q. #define으로 선언한 상수에 값을 바꾸면 어떤 에러가 나는지 궁금해서 테스트 해봤는데, 에러 메세지의 의미를 잘 모르겠어서 질문 드립니다.

단순히 read-only라서 안된다라고 나올 줄 알았는데, Lvalue에 대한 이야기를 하는 것 같아서.. 정확히 이 메세지의 의미가 무엇인가요 ㅠ

 

A. 네, 컴파일 타이밍에는 TEST라고 써있는 부분이 모두 5 라는 문자로 바뀝니다. 지금 당장 5라고 바꿔 써보시면,

5 = 10;

이런 코드가 나오겠죠. 그 문제 지적입니다.

 

me: 아하 TEST가 그냥 5라고 바뀌니까 ... 이해했습니다!

끝.

 

 

8️⃣ Operators

Arithmetic Operators

Swift와 같은 것, 다른 것 확인하기!

  • ++ : 정수 값을 1만큼 증가시키는 증가 연산자
  • -- : 정수 값을 1만큼 감소시키는 감소 연산자

 

Logical Operators

~

 

Bitwise Operators

  • 비트 단위 연산을 수행한다.
  • 아래는 &, |, ^에 대한 진리표이다.
    • & = AND
    • | = OR
    • ^ = XOR
A = 0011 1100
B = 0000 1101

A&B = 0000 1100
A|B = 0011 1101
A^B = 0011 0001
~A = 1100 0011

무슨 계산을 할 때 쓰느냐아ㅏ

암호화 처리, 압축에서 이런 연산들이 사용된다.

  • &, |, ^, ~, <<, >>

 

Assignment Operators

Objective-C에서 지원하는 할당 연산자는 다음과 같다.

  • =, +=, -=, *=, /=, %=

 

sizeof & ternary Operators

sizeof & 삼항연산자
  • sizeof()
    • 변수의 크기 반환
  • &
    • 변수의 주소 반환
      • 변수에 대한 포인터
  • ? :
    • 조건식

 

Operators Precedence

연산자 우선순위

~

 

 

9️⃣ loops

  • while
  • for
  • do-while

구구단을 외자.

#import <Foundation/Foundation.h>

int main ()
{
    int a = 10;
    int i, j;
    
    while( a < 20 ) {
        NSLog(@"whlie : 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;
}

 

Loop Control Statement

  • 루프 제어문은 정상적인 순서에서 실행을 변경한다.
  • 실행이 범위를 벗어나면 해당 범위에서 생성된 모든 자동 개체가 소멸된다.
  • 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;
}

 

The Infinite Loop

  • 조건이 거짓이 되지 않으면 루프가 무한 반복된다.
  • for 반복문은 전통적으로 이러한 목적으로 사용된다.

 

 

🔟 Decision Making

조건문
  • 참인지 거짓인지 판단해서 분기대로 프로그램을 수행하는 것
  • Objective-C에서는
    • 0이 아닌 값, null이 아닌 값 == true
    • 0 또는 null == false
  • if, if-else, 중첩된 If, switch, 중첩된 switch
  • if-else
#import <Foundation/Foundation.h>

int main ()
{
   int a = 30;
   
   if ( a < 20 ) {
       NSLog(@"a는 20보다 작습니다.");
   } else if ( a < 40 ) {
       NSLog(@"a는 40보다 작고 20보다 크거나 같습니다.");
   } else {
       NSLog(@"a는 40보다 크거나 같습니다.");
   }
   
   
   NSLog(@"a는 %d입니다.", a);
   
   return 0;
}

 

  • switch
#import <Foundation/Foundation.h>

int main ()
{
   char grade = 'B';
   
  switch(grade) {
    case 'A':
        NSLog(@"참 잘했어요!");
        break;
    case 'B':
        NSLog(@"적당히 하셨네요~");
        break;
    case 'C':
        NSLog(@"섭섭합니다.");
        break;
    case 'D':
        NSLog(@"재수강을 꿈꾸는가");
        break;
    case 'F':
        NSLog(@"사람이 아닙니다");
        break;
    default:
        NSLog(@"자퇴는 지능순");    
        break;
  }
   
   NSLog(@"학점은 %c", grade);
   
   return 0;
}

 

The ? : Operator

  • if - else 문을 대체하는데 사용가능
Exp1 ? Exp2 : Exp3;
  • Exp1 가 true이면 Exp2, false이면 Exp3

 

 

 


 

 

오늘 요약 

 

 

 

 

 

 

  Comments,     Trackbacks