22-10-06 목요일
4주차
WARNING
⚠️ 경고 ⚠️
이곳은 고대 언어 발굴 현장입니다.
C언어 계열에 알러지가 있으신 분은 특히 주의 바랍니다.
✔️ Objective-C
- 온라인 컴파일러
- Objective-C Tutorial
0️⃣ Overview
- C + Small Talk + 기능 추가 → Objective-C
1️⃣ Object Oriented Programming
- 옵젝씨는 객체 지향 개발의 4가지 기둥을 포함하여 객체 지향 프로그래밍을 완벽하게 지원한다.
- Encapsulation
- 프로퍼티나 메소드를 잘 모아서 하나의 이름으로 만든 것
- Data hiding
- 내가 내부의 코드를 몰라도 쓸 수 있게 해주는 것
- 내 코드를 누군가 활용하게 하려면 문서에 변수 이름과 get, set 프로퍼티 이름만 제공해주고 내부는 신경쓰지 마세요~
- ex) 암호화 코드
- Inheritance
- override, 기능 추가… 등등
- Polymorphism
- 똑같은 메소드라도
- Encapsulation
- 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
위의 코드를 추가하였다.
![](https://blog.kakaocdn.net/dn/cZjjtx/btrN0Du60tA/uLytW9buWivr3kK3oKR8Dk/img.png)
에러가 난다.
읽기 전용인 ‘LENGTH’에 할당이 일어났다는 것이다. 상수는 읽기 전용이다!
📌 define으로 선언한 상수에 값을 바꾸면 어떻게 될까?
#define TEST 5
int main() {
NSLog(@"%d", TEST);
TEST = 10;
return 0;
}
위 코드를 추가하고 돌려봤다.
![](https://blog.kakaocdn.net/dn/b05K5d/btrNXNGeO1Q/jU2wop2ngVkoJzInldkjl0/img.png)
에러 메세지가 조금 다르다.
할당의 왼쪽 피연산자로 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
오늘 요약
'외부활동 > 멋사 앱스쿨 1기' 카테고리의 다른 글
[TIL] 22-10-11: Objective-C (struct, typedef, class, extension) (0) | 2022.10.12 |
---|---|
[TIL] 22-10-07: Objective-C, CocoaPods과 SPM 찍어먹기 (0) | 2022.10.12 |
[TIL] 22-10-05: Swift (Closure), Objective-C (0) | 2022.10.06 |
[TIL] 22-10-04: Swift(Error Handling, Type, Property Observer, enum, Generic, Protocol Oriented) (2) | 2022.10.06 |
[TIL] 22-09-30: Open Source, Git/GitHub (0) | 2022.10.03 |