Objective C 대상 에 대한 초보 적 익숙 함

7200 단어 objective c
연말 이 좀 바 빠 서 objective C 의 공 부 를 모두 내 려 놓 았 습 니 다. 틈 틈 이 수업 을 마 치 겠 습 니 다 ^ ^
 
간접 적 이해
       프로 그래 밍 계 에 서 는 "간접 층 을 하나 더 추가 해 야 컴퓨터 과학 이 해결 할 수 없 는 문제 가 없다" 는 말 이 있다.사실 간접 적 으로 간단 하 다. 코드 에서 어떤 값 을 직접 사용 하지 않 고 이 값 을 가리 키 는 지침 을 사용 한 다 는 것 이다.
       생활 속 의 예: 당신 은 KFC 의 전화 번 호 를 모 를 수 있 지만 인터넷 을 통 해 KFC 의 전화 번 호 를 찾 을 수 있 습 니 다. 인터넷 으로 찾 는 것 은 실제 적 으로 간접 적 인 방식 입 니 다.
        간접 적 으로 프로그램 에 여러 가지 표현 방식 이 있 는데 예 를 들 어 변수 식 의 간접, 파일 식 간접, 매개 변수 식 간접 등 이다.
 
2. OOP 세계 에서 의 간접 사용
       사실 OOP 의 진정한 혁명적 인 것 은 호출 코드 에서 간접 적 으로 사용 하 는 것 이다.
       우선 OOP 의 사상 을 쉽게 이해 할 수 있 도록 프로 세 스 프로 그래 밍 의 예 를 들 어 보 겠 습 니 다.
       
#import <Foundation/Foundation.h>

typedef enum{
	kCircle,
	kRectangle,
	kOblateSpheroid
} ShapeType;

typedef enum{
	kRedColor,
	kGreenColor,
	kBlueColor
} ShapeColor;

typedef struct{
	int x, y, width, height;
} ShapeRect;

typedef struct{
	ShapeType type;
	ShapeColor fillColor;
	ShapeRect bounds;
} Shape;

void drawShapes(Shape shapes[], int count){
	int i;
	for(i = 0; i < count; i++){
		switch (shapes[i].type) {
			case kCircle:
				drawCircle(shapes[i].bounds, shapes[i].fillColor);
				break;
			case kRectangle:
				drawRectang(shapes[i].bounds, shapes[i].fillColor);
				break;
			case kOblateSpheroid:
				drawEgg(shapes[i].bounds, shapes[i].fillColor);
				break;
			default:
				break;
		}
	}
}

void drawCircle(ShapeRect bounds, ShapeColor fillColor){
	NSLog(@"drawing a circle at (%d %d %d %d) in %@", bounds.x, bounds.y, bounds.width, bounds.height, colorName(fillColor));
}

void drawRectang(ShapeRect bounds, ShapeColor fillColor){
	NSLog(@"drawing a circle at (%d %d %d %d) in %@", bounds.x, bounds.y, bounds.width, bounds.height, colorName(fillColor));
}

void drawEgg(ShapeRect bounds, ShapeColor fillColor){
	NSLog(@"drawing a circle at (%d %d %d %d) in %@", bounds.x, bounds.y, bounds.width, bounds.height, colorName(fillColor));
}

NSString *colorName(ShapeColor colorName){
	switch(colorName){
		case kRedColor :
			return @"red";
			break;
		case kGreenColor :
			return @"green";
			break;
		case kBlueColor:
			return @"blue";
			break;
	}
	return @"no clue";
}

int main(int argc, const char * argv[]){
	Shape shapes[3];

	ShapeRect rect0 = {0, 0, 10, 30};
	shapes[0].type = kCircle;
	shapes[0].fillColor = kRedColor;
	shapes[0].bounds = rect0;

	ShapeRect rect1 = {30, 40, 50, 600};
	shapes[1].type = kCircle;
	shapes[1].fillColor = kRectangle;
	shapes[1].bounds = rect1;

	ShapeRect rect2 = {15, 18, 37, 29};
	shapes[2].type = kOblateSpheroid;
	shapes[2].fillColor = kBlueColor;
	shapes[2].bounds = rect2;

	drawShapes(shapes, 3);
	return (0);
}

    위의 코드 회색 은 항상 간단명료 하지만, 한 가지 문 제 는 프로그램의 확장 과 유지 보수 가 매우 어려워 진 다 는 것 이다. 만약 우리 가 한 가지 유형 을 더 추가 하면, 프로젝트 에서 적어도 4 개의 서로 다른 위치 에서 프로그램 을 수정 해야만 이 임 무 를 완성 할 수 있다.
 
다음 에 말 한 OOP 는 이러한 문 제 를 완벽 하 게 해결 했다. 이 는 데이터 중심, 함 수 를 데이터 서비스 로 한다.
void drawShapes(id shapes[], int count){
	int i;
	
	for(i = 0; i < count; i++){
		id shape = shapes[i];
		[shape draw];
	}
}

       위의 코드 는 많은 학생 들 이 이상 하 게 느 낄 수 있 습 니 다. 일반적으로 괄호 는 C 언어 에서 배열 을 대표 합 니 다. Objective C 에서 괄호 는 다른 뜻 도 있 습 니 다. 그들 은 특정한 대상 에 게 무엇 을 해 야 하 는 지 알려 줍 니 다.괄호 안에 있 는 첫 번 째 항목 은 대상 이 고, 나머지 부분 은 대상 이 실행 해 야 할 작업 입 니 다.이 예 에서, 우 리 는 shape 라 는 대상 에 게 draw 작업 을 수행 하 라 고 통지 합 니 다.만약 shape 가 원형 이 라면 우 리 는 원형 을 얻 을 수 있다.만약 shape 가 직사각형 이 라면, 우 리 는 직사각형 까지 갈 것 이다.
        Objective - C 에서 대상 에 게 어떤 조작 을 수행 하 라 고 알 리 는 것 을 '메시지 보 내기' 또는 '호출 방법' 이 라 고 합 니 다.코드 에서 [shape draw] 는 shape 대상 이 draw 메 시 지 를 보 내 는 것 을 표시 합 니 다.
        또 하나의 이상 한 점 은 id 입 니 다. id 는 일종 의 범 형 으로 모든 종류의 대상 을 표시 하 는 데 사 용 됩 니 다.실제 id 는 하나의 지침 으로 그 중의 어떤 구 조 를 가리킨다.
 
 3. 대상 을 대상 으로 하 는 예
다음은 CirCle 인터페이스의 성명 입 니 다.
@interface Circle : NSObject{
	ShapeColor fillColor;
	ShapeRect bounds;
}

- (void) setFillColor : (ShapeColor) fillColor;
- (void) setBounds : (ShapeRect) bounds;
- (void) draw;

@end

 @interface "컴 파일 러 에 게 objective C 의 성명 인터페이스 라 고 알려 줍 니 다."
 
Circle 대상 에 필요 한 다양한 데이터 구성원:
{
      ShapeColor fillColor;
      ShapeRect bounds;
}
 
- (void) setBounds: (ShapeRect) bounds;
기발 한 objective, 방법 성명 앞 에 '-' 를 더 추가 합 니 다. 짧 은 선 뒤 에는 방법의 반환 유형 으로 괄호 안에 있 습 니 다. 이 어 뒤의 당신들 은 모두 알 고 있 습 니 다. 바로 매개 변수의 성명 입 니 다.
 
Circle 구현 코드:
@implementation Circle

-(void) setFillColor : (ShapeColor) c
{
	fillColor =c;
}

-(void) setBounds : (ShapeRect) b
{
	bounds = b;
}

-(void) draw
{
	NSLog(@"drawing a circle at (%d %d %d %d) in %@", bounds.x, bounds.y, bounds.width, bounds.height, colorName(fillColor));
}

@end

 
성명 인터페이스 와 마찬가지 로 실 현 된 것 도 @ implementation 으로 시작 하고 끝 에 @ end 를 사용 해 야 합 니 다.
실제로 objectvie - c 에서 호출 하 는 방법 은 self 라 는 비밀 숨겨 진 매개 변수 가 수신 대상 에 게 전달 되 는 것 입 니 다.
위의 예 에서 fillColor = c 는 self - > fillCOlor = c 로 쓸 수 있 습 니 다.
 
 다음 마지막 실례 화 대상
대상 을 예화 할 때 메모 리 를 할당 해 야 합 니 다. 그리고 이 메모리 들 은 초기 화 되 어 유용 한 기본 값 을 저장 합 니 다.
int main(int argc, const char * argv[]){
	id shapes[3];
	
	ShapeRect rect0 = {0, 0, 10, 30};
	shapes[0] = [Circle new];
	[shapes[0] setBounds : rect0];
	[shapes[0] setFillColor : kRedColor];
	
	ShapeRect rect1 = {30, 40, 50, 60};
	shapes[1] = [Rectangle new];
	[shapes[1] setBounds: rect1];
	[shapes[1] setFillColor: kGreenColor];
	
	ShapeRect rect2 = {15, 19, 37, 29};
	shapes[2] = [OblateShereoid new];
	[shapes[2] setBounds : rect2];
	[shapes[2] setFillCOlor : kBlueColor];
	
	drawShapes(shapes, 3);
	
	return (0);
}

 
보아하니 oop 예 에서 main 방법 은 과정 화 된 예 의 main 과 약간 비슷 하 다. oop 예 에는 shapes 배열 이 아 닌 id 배열 이 포함 되 어 있 으 며 대상 을 만 들 때 new 메 시 지 를 보 내야 한다.
 
만약 우리 가 프로그램 에 한 가지 유형 을 더 추가 하면 인 터 페 이 스 를 실현 하기 만 하면 확장 할 수 있다.
@implementation Triangle

-(void) setFillColor : (ShapeColor) c
{
	fillColor =c;
}

-(void) setBounds : (ShapeRect) b
{
	bounds = b;
}

-(void) draw
{
	NSLog(@"drawing a circle at (%d %d %d %d) in %@", bounds.x, bounds.y, bounds.width, bounds.height, colorName(fillColor));
}

 
 요약:
프로 세 스 프로 그래 밍: 함수 1 위, 데이터 2 위
대상 지향 프로 그래 밍: 데이터 1, 함수 2

좋은 웹페이지 즐겨찾기