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를 사용한다.
감사합니다