2단원 오브젝트C 프로그램.

Download Report

Transcript 2단원 오브젝트C 프로그램.

CHAPTER2
오브젝트C 프로그램
오정민
5월 6일
매뉴

0. Object C


1. 객체와 메시지






NSObject
ID
메시지 표현식
메시지 셀렉터
인스턴스 의 생성과 초기화
- 클래스인터페이스
- 클래스의 구현 & 정의
3. 컴파일



-
2. 클래스정의



- 왜 오브젝트C일까?
- 간단한 컴파일방법
- 분할 컴파일
4. 프로그램 개발 방법


- C언어 함수의 이용 방법
- 헤더 파일의 임포트
- 오브젝트 C왜 오브젝트C일까?
맥에서 사용하는 기본 라이브러리들이 오브젝트C
로 이루어져있다.
 오브젝트 C 는 자바와 같은 매니지드 언어가 아니고
네이티브 언어기 때문에 가볍고 빠르다.
 C++보다 객체지향 개념이 직관적이고 유연성도 좋
다.
 코드의 가독성이 상당히 우수하다.
 이러한 이유들로 요즘은 C를 배운뒤 C++이 아닌 오
브젝트C를 배우는 사람들이 늘고 있다.

-객체와 메시지1. NS오브젝트
NSObjec
->
이외에도
여러 가지
있음.
Alloc(인
스턴스생
성)
id

오브젝트 C는 이것을 상속받거나 #import 한다.

이것은 객체를 인스턴스화해주거나 소멸해주고 객
체관리를 위한 자료형 이나 메서드를 지원해준다.

이것은 오브젝트 C의 문법을 활용할 수 있는 기본
적인 클래스이며 상속이나 임포트를 하지 않을 경
우엔 C나 C++의 문법을 써야 한다.
-객체와 메시지2. ID
Object C
id c_pPoint;
CMap
(class)
instance
CEnemy
(class)
C++
Void* c_pPoint;
instance

NSObject(클래스)가 지원 하는 특수한 type이다.
인스턴스화 되어진 객체를 가리킬 수 있으며 가리켜진
객체는 RunTime시에 암묵적으로 존재하는 isa란 메서
드를통해 접근을 한다.

C++의 void*와 유사하다.(다른점도 있다)

-객체와 메시지3. 메시지 표현식
오브젝트 C의 예
[map randermap];
= 매개변수
C++ 의 예
=
map->randermap();
메시지명
= 매개변수의 타입
//메서드선언부(class CMap)
(int) setmapx : (int)a setmapy : (int)b;
//메서드호출부
[map setmapx : 10 setmapy : 30];
=
= 호출할 때 쓰이는 함수 명/메시지 명
//메서드선언부(class CMap)
int SetPos(int setmapx, int setmapy);
//메서드호출부
Map->SetPos(10, 30);

메시지 명을 통해 메서드를 호출하라는 호출하는 메시지를 보낸다.

메시지 명은 메서드의 호출과 인자의 설명을 위한 일종의 detail한 변수다.

인자가 두개 이상 이라도 하나의 메서드 에선 하나의 메시지 명으로 구분된다.

인자의 갯수는 : 의 수와 일치하며 : 앞에 메시지키워드는 생략 할 수 있다.

인자를 사용할 경우 메시지 명 뒤에 : 를 붙여 준다.
-객체와 메시지4. 메시지 셀렉터
Setmapsize:



setmapsize: setmapposx:
setmapposy:
메시지
명
메시지 셀
렉터 (비
교작업)
메시지 셀렉터는 메시지 명을 비교하여 구분해주는 일종의
관리자 이다.
메시지 셀렉터는 메시지명의 철자가 하나라도 틀리면 서로
구분을 해준다.
: 도 비교대상의 일부로 간주한다.
-객체와 메시지5. 클래스의 생성과 초기화
오브젝트C
[[id형변수
alloc]init]





=
C++
클래스명 인스턴스;
인스턴스 = new 클래스명;
인스턴스->init();
alloc라는 메시지를 보내서 인스턴스를 만든다.
만들어진 인스턴스를 id형 타입의 변수가 가리킨다.
init이라는 메서드는 C++의 초기화 함수다.
이것은 이니셜라이져 나 초기화 메서드 라고 부른다.
초기화 메서드 이름은 init이나 init뒤에 추가적으로
더 붙일 수 있다.
-클래스의 정의1. 클래스 인터페이스













@interface 클래스명 : 상속
받는 부모 클래스명 {
//인스턴스 변수 선언;
int val;
}
//메서드 선언;
- (int) value : (int)a;
@end
//구현부
@implementation 클래스명
- (int) value : (int)a {
return val+a;
}
@end

@interface 는 정의 하는 헤더
파일의 시작을 의미하며 인스턴
스 변수의 선언과 메서드의 선언
을 정의하는 부문이다.

@implementation 는 구현하
는 .m파일 (C++에선 .cpp) 의
시작을 의미하며 메서드의 기능
을 구현하는 부문이다.

@end는 컴파일러 지시자로 끝을
의미한다.
-클래스의 정의2. 클래스의 구현 & 정의(1)
Map
-?+?
init
NSObject
alloc
-?+?
- (void) init;
 메서드 앞에는 -나 +란 기호를 기입하게된다.
 id map = [[Map alloc] init];
 메서드 alloc은 클래스 Map가 상속받은 NSObject
의 메서드이며 동적 할당을 받지 않은 상태에서 바
로 호출을 하고 있다.

-클래스의 정의2. 클래스의 구현 & 정의(2)
Map
-

init
NSObject
alloc
+
+ 메서드는 객체를 생성(인스턴스화)하지 않아도 사용이 가능한 메서드
이고 - 메서드는 인스턴스화한 후에 사용 가능한 메서드가 된다.

이것을 보통 클래스 메서드(+) 인스턴스 메서드(-)라 부른다.

NSObject도 객체들과마찬가지로 초기화 메서드가 있다.

self = [super init];

지금 나의 위치에서 상속받은 부모객체의 init을 호출한다.
이것을 풀이하자면 이렇다.
-컴파일1. 간단한 컴파일방법



#include
#import
!=
==
오브젝트C에서는 #include 가 아닌 #import를 쓰게 된
다. 기본적으로 같은 역할을 한다.
오브젝트 C의 소스파일 확장자는 .m이다 여기서 .m은
모듈을 뜻하며 C언어로 비교하면 .c나 .cpp를 뜻한다.
프로젝트를 저장 할때는 All Files를 선택하여 저장하면
된다.
-컴파일2. 분리 컴파일
Class
NSObject
Class
C 문법
클래스명 .
c
Class
클래스명 .
m
C++ 문법
클래스명 .
mm

분리컴파일은 C++과 거의 비슷하다.

C언어의 문법이 포함될경우 .C, C++언어의 문법
이 포함될경우 .mm, 오브젝트C의 문법이 포함될경
우 .m로 #import하면 된다.
-프로그램 개발 방법1. C언어 함수의 이용 방법(1)

오브젝트C는 메서드정의 안에서도 C언어의 함수를 호출할 수
있다.

C언어의 함수를 쓰는 이유는 오브젝트의 메서드 보다 호출이
빠르기 때문이다. 이것은 절차지향과 객체지향적인 부분을 잘
조합해서 구현한다는 것에 의미가 있다.

오브젝트C의 메서드와 C언어의 함수를 적절히 조합하여 쓰는
것이 최선이라 생각된다.
-프로그램 개발 방법1. C언어 함수의 이용 방법(2)
#import “map.h”

@implementation 와 @end 사이
에 함수나 메서드가 있는 경우에는














static id size(int p)
{
val += a;
Return self;
}
@implementation 클래스명
static int value(int a)
{
return val + a;
}
- (int) value : (int) a {
return val + a;
}
@end
현재(this)클래스 안에 종속 되어있
는 것이지만. 그 범주 밖에 위치한
다면(void size(int p)) 전역으로 처
리해버린다. 즉 저 클래스의 인스턴
스가 만들어지는 시점으로 프로그
램이 종료되거나 인스턴스의 소거
되기 전까지는 어디서든 접근이 가
능하다는 것이다. 이것의 위험성은
알 것이다.
-프로그램 개발 방법2. 헤더 파일의 임포트

오브젝트C에서는 #import를 사용한다.

같은 헤더 파일이 여러 번 읽히더라도 한번만 포함
되도록 하기 위해 #import를 사용한다.
감사합니다