본문 바로가기

프로그래밍 세상/iOS 이야기

삼성 멀티캠퍼스 iOS 강의 1일차 정리...



Mac Key 설정

Command Key = Window Ctrl

Command + Space : 짧게(영어에서 한글, 한글에서 영어), 길게(설정된 국가별 종류 설정)

사과 Key = Window 시작과 같은 역할

만약 윈도우에서 프로그램 응답 대기와 같은 현상이 발생한다면 사과 - 강제종료 를 눌러 해결하자.


잡스의 행보

애플 창업 -> 퇴출 -> 넥스트사 설림 -> 복귀 -> Mac OS Rebuild(+ Object C)

초창기 아이팟은 현재 North Face 인기와 맞먹는 인기였다. 대박쳤지...


XCode

좌측 내용

.h : class 정의 부분

Framework : 개발에 필요한 Header 모음 ( Foundation/Foundation.h 는 모든 Header 를 import 한 파일이다. )

Supporting Files( -.pch)

C의 구조체 등을 선언, 잘 사용하지 않음

main.m : main 함수가 존재 ( 모든 프로그램과 마찬가지로 프로그램의 시작을 담은 파일)


#import 와 #include 는 거의 동일한 개념이지만, include 는 중복 선언된 것에 대해 오류를 발생시키지만, import 는 중복되더라도 오류를 발생시키지 않고,

알아서 해결해준다.


NSLog(@"Hello, World!"); 는 C언어의 printf("Hello, World!\n"); 과 동일하게 Console 창에 표시하지만,

NSLog 는 Object-C의 Log 출력 메서드로서 출력일시, 프로젝트명 등 여러 정보와 함께 줄바꿈이 되는 특징이 있다.

@는 Object-C에서 NSString 형으로 객체를 생성시켜주는 지시어다.


NSLog("Age: %d, Name: %@", 100, @"Chomae");

NSLog 도 printf와 마찬가지로 formatter 를 사용 할 수 있다.

문자열은 특이하게 %@ 을 사용한다.


객체타입

id: 모든 객체의 주소값을 가질 수 있는 전지 전능한 타입

SEL : 메서드의 주소값을 가질 수 있는 타입

BOOL : C 에 bool 이 true, false 로 값을 가지므로 Object-C 에서는 YES, NO 로 값을 저장한다.

nil = NIL 은 C 의 NULL 과 같은 의미이다.

NSArray 를 생성할 때 마지막에 nil 을 사용해야 한다. ( 나중에 더 알아보자...)

NSInteger  는 64비트형으로 %u ( 음수, 0, 양수 )

NSUInteger  도 64비트형으로 %ul(0, 양수) 로 사용할 수 있다.

맥,  iPhone, iPad 는 현재는 64비트가 기본이다.


클래스 네이밍

대문자로 시작하며, NS로 시작하면 안된다.

개발자간의 약속이며, 현재 NS 객체가 많이 생성되어 있는 상태이기 때문에 충돌이 날 수 있다.


.h : Header 파일

.c, .cpp : C, C++ 파일

.m, .mm : C + Object-C, C++ + Object-C

.mm 의 경우 둘다 객체지향이므로 사용할 필요성이 없으며, C++ , Object-C 간의 정보공유가 불가하다.

그리고 Object-C 와 Ansi-C 등 라이브러리가 충돌될 가능성도 있다.


.m 을 사용하는 이유에서 가장 중요한 특징이 C의 포인터에 있다. 포인터는 사용하기 어려워서 그렇지 전지전능한 개념이다.

장비의 주소만 알수 있다면 직접 컨트롤이 가능하다. 하지만 아이폰의 경우는 많은 제한이 있기 때문에 디바이스 접근이 어렵다.


지니효과 : minimalize 할 때 램프의 요정 지니가 들어가고 나가고 하는 것처럼 그래픽으로 보여준다. 이러한 그래픽처리는 OS 에서 처리하며,

엄청 복잡한 알고리즘에 의해 구현되며, 연산처리가 복잡해 처리 속도가 느려져 초기 아이폰에서는 구현했지만, 현재는 기능이 빠져있다.


NSObject * obj;

여기서  * 는 C의 포인터 개념이 아니라 객체의 주소를 담을 것이라는 의미로 사용된다.

보통 value 는 그 값이 의미를 가지지만, address 의 경우 그 자체만으로는 의미를 가지지 못한다.

이러한 주소값이 들어가는 경우 * 를 붙인다. 하지만 id 의 경우 주소값을 가지지만, 이것을 이용하여 객체를 컨트롤하므로 * 를 붙이지 않는다.


자동완성기능 표시/해제 : ESC Key


public 으로 선언한 변수는 -> 로 접근 가능하다. ( C 언어 문법 )


메서드 명명 규칙

setValueA : setter

valueA : getter

세터와 게터는 다른 언어와 비슷하지만 게터의 경우 그 변수의 이름을 그대로 적는다. 이런식으로 작성할 경우 OS가 알 수 있다.

setter, getter 의 모양은 property 선언시 정의 할 수 있으므로 꼭 이런식으로 선언해야 하는 것은 아니다.

규칙에 의해 명명할 경우 -> 가 아닌 . 을 이용해 접근이 가능하다.

t1.valueA = 500;

이 경우 setter 를 자동 호출한 경우다.

아래와 같이 사용할 수 있다.

[t1 setValueA: 500];

setter, getter 를 지정하지 않은 경우 오류가 발생하니 유의하자.


Object-C의 기본 생각은 small talk 이다.

잡담 이라는 뜻으로 이런 생각이 녹아 있다.

[t1 method1];

의 경우 t1의 method1 메서드를 호출한다는 의미로 생각할 수 있겠지만,

t1 객체의 method1 메세지를 보내, 전달자가 method1 형식과 같은 메서드를 찾아서 실행하는 식으로 되어 있다.

이야기 전달방식으로 실행되며, 전달자가 적당한 메서드를 찾아준다.


-(void) method3: (int) valueA data: (int) valueB

여기서 valueA 는 method3 과 valueB 는 data 가 설명을 담당한다.

이렇게 파라메터에도 설명을 붙여서 보낸다. 

이야기를 정확하게 전달하려면 각각 값에 대한 설명이 필수이지 않을까?

내 이야기를 다른 누군가가 또 다른 사람에게 전달하려고 할 경우 정확한 메세지 전달이 중요하다.

이러한 인수의 설명에서 볼 수 있듯이 small talk 기법(소곤소곤, 잡담)으로 설명이 많다.


.h : 메서드 선언

.m : 메서드 구현

main.m : 객체 실행


OS입장에서는 개발자가 생성한 메서드를 알 수 없다. 하지만 알 방법이 있다.

1. OS 가 알고 있는 이름으로 구현한 경우

2. 개발자가 OS에게 이름을 알려주는 방식


위 2가지 방식으로 OS에게 메서드명을 알려줄 수 있다.

id, SEL 을 이용해서 할 수 있으며

id 에 객체를 저장, SEL 을 이용해 메서드를 호출하는 식이다.


< 블럭 함수 >

NSLog(...)처럼 대괄호[]가 아닌 () 방식으로 파라메터를 전달해 실행하는 방식이다.

New - File 후 .h, .m 의 interface, implemenation 삭제 후 사용

.m 파일의 마지막에 ; 으로 마무리 한다. ( 필수 !!! )


객체 생성

new : init 메서드 자동 호출 ( 파라메터 없는 기본 init 메서드 호출)

alloc : init 메서드 호출 하지 않으며, 개발자가 명시적으로 호출해야 한다. ( 파라메터를 넘길 수 있기 때문에 많이 사용한다.)


[super init] - NSObject 의 init 메서드를 호출한다.

왜냐면? NSObject 를 구현한 모든 메서드에는 [super init] 이 구현되어져 있으며, 그렇기 때문에 가장 최상위 객체인 NSObject 의 init 이 실행된다.


파라메터가 있는 init 메서드 명명 규칙


initWithData 이런 식으로 작성한다.