아이폰어플개발정보2010. 6. 22. 17:54
과제A - 클래스 생성과 사용

Lecture2 의 숙제에 대한 설명 또한 Lecture3 에서 주어지는것 같다. 쉬운 답을 얻기전에 검색해서 풀어보란 뜻인가??

아무튼 그냥 순서대로 Lecture3을 듣지 않은 상태에서 Lecture2의 숙제를 하기로 한다.


과제A. 클래스 생성과 사용  원문: WhatATool (Part II)


<순서>
Section 5. 클래스 생성
Section 6. 생성한 클래스 사용


이번 과제에서는 PolygonShape(다각형) 클래스를 생성한후 WhatATool의 메인 함수에서 클래스를 호출하는 함수를 불러본다.


아래와 같은 소스가 추가 될 것이다.


int main (int argc, const char * argv[]) {
    NSAutoreleasepool * pool = [[NSAutoreleasePool alloc] init];

    PrintPathInfo(); // Section 1
PrintProcessInfo(); // Section 2
PrintBookmarkInfo(); // Section 3
PrintIntrospectionInfo(); // Section 4
PrintPolygonInfo(); // Section 6 (section 5는 메인에 함수를 추가하지 않는다)
[pool release];
return 0;
}


Section 5. 클래스 생성

■ 새로운 PolygonShape 라는 클래스 만들기 (다각형 클래스)


Xcode에서
1.File > New File을 선택
2.Mac OS X아래 CoCoa 섹션의 'Objective-C class' 템플렛을 선택한다.
3.PolygonShape.m 으로 생성한다. - 헤더파일을 만들기 위한 체크박스를 체크하는 것을 잊지 말것.


* 새로운 클래스는 디폴트로 NSObject를 계승받는다.


자 이제 새로운 클래스에 속성을 부여해보자.
Objective-C 2.0은 오브젝트의 속성에 접근하는 새로운 메커니즘을 제공한다.
클래스는 "properties"를 정의 할 수 있으며, 이것이 유저가 클래스에 억세스 하는 방법을 제공한다.
properties는 개발자의 단순작업(getter/setter 코딩)을 없애주며 메모리 관리 폴리시와 속성의 사용법을 정의하도록 해준다.
예를 들면, property를 읽기 전용으로 지정하거나 오브젝트의 소유권등을 정의할 수 있다.


■ PolygonShape 클래스에 속성 지정하기


1. 아래의 속성을 지정한다.
• numberOfSides(면의 수) – 정수형
• minimumNumberOfSides(최소 면의 수) – 정수형
• maximumNumberOfSides(최소 면의 수) – 정수형
• angleInDegrees(내각) – 실수형, 읽기전용
• angleInRadians(호도) – 실수형, 읽기전용
• name(이름) – NSString 오브젝트, 읽기전용


2. numberOfSides, minimumNumberOfSides, maximumNumberOfSides의 세가지 속성은
적절한 타입의 인스턴스 변수로 저장될 수 있어야 한다. 이 속성들은 @synthesize 옵션을 이용하면 컴파일러가
자동으로 getter/setter를 생성하여주며, 읽기 전용 속성은 getter만이 생성된다.


3. setter 메소드에 아래와 같은 조건을 부여하라
• numberOfSides – 최소값과 최대값의 사이 값만 가질수 있다.
• minimumNumberOfSides – 2보다 커야 한다.
• maximumNumberOfSides – 12보다 작아야 한다.


maximumNumberOfSides에 5가 설정되어 있는데 numberOfSides에 9를 세팅하려고 한다면 아래와 같은 에러로그를 출력하라.
Invalid number of sides: 9 is greater than the maximum of 5 allowed


4. 아래와 같은 초기화 메소드를 생성하라.
- (id)initWithNumberOfSides:(int)sides minimumNumberOfSides:(int)min maximumNumberOfSides:(int)max;


5. 슈퍼클래스인 NSObject의 init메소드를 오버라이드 하여 아래와 같은 디폴트값을 설정하는 커스텀 init을 생성하라.
numberOfSides – 5, minimumNumberOfSides – 3, maximumNumberOfSides – 10


6. angleInDegrees와 angleInRadians는 @synthesize 옵션을 사용하지 말라.
그리고 인스턴스 변수도 불필요하다. 이 두 속성은 numberOfSides의 값에 의해 결정될 것이다.
여기서는 정규 다각형(regular polygon)만 만들것임으로 각도(angles)의 값은 모두 똑같을 것이다.


7. name속성도 @synthesize 옵션을 사용할 필요가 없다. (인스턴스 변수도 필요없다.)
면의 갯수로부터 다각형의 이름을 출력하게 될 것이다.
<예>
면이 3일 경우: “Triangle”
면이 4일 경우: “Square”


8. PolygonShape 클래스의 -description 메소드를 아래 예와 같이 나오도록 구현하라.
Hello I am a 4-sided polygon (aka a Square) with angles of 90 degrees (1.570796 radians).


9. dealloc메소드를 사용하여 메모리 관리를 하고, dealloc이 불리워졌을때 로그를 출력하도록 하여라.


<힌트>


•다각형의 이름은 위키에서 찾을 수 있다.
•내각(angleInDegrees)을 구하기 위한 식은 다음과 같다. (180 * (numberOfSides - 2) / numberOfSides)
•삼각법(trigonometry): 360° 는 2π(파이) 이다.
•π(파이)의 값은 M_PI에 정의되어 있다.

Section 6. 생성한 클래스 사용

WhatATool.m 파일에 #import "PolygonShape.h" 를 삽입한다.


중요!!! 여기서는 PolygonShape를 생성하기 위해 +alloc과 -init을 사용하도록 한다. 생성된 오브젝트는 배열에 넣도록 하고
사용이 끝난 후엔 메모리 관리 기술을 이용하여 오브젝트를 릴리스 하도록 한다.


1. alloc/init를 사용하여 mutable array를 생성하라.


2. 아래 값을 사용하여 3개 또는 그 이상의 PolygonShape 오브젝트를 생성하라.

Min number of sides Max number of sides Number of sides
 3  7  4
 5  9  6
 9  12  12

3. 생성한 오브젝트를 배열에 추가하고 description을 이용하여 로그를 출력하라. 최소한 3줄의 로그가 찍여야 한다.

4. polygon 오브젝트의 제약을 테스트 해본다.
루프를 돌며 numberOfSides에 10을 세팅해보라. 위의 테이블을 이용해 만든 오브젝트라면 두줄의 로그가 찍힐것이다.

5. polygon 오브젝트가 메모리로부터 릴리스 되었는지 확인한다.
주어진 규칙대로 생성한 클래스라면 dealloc이 불리면서 3번의 로그가 찍힐 것이다.


<시도>

우선 name의 getter를 구현하기 위해 다각형의 이름을 찾아봤다.

Polygon names

Name Edges
digon 2
triangle (or trigon) 3
quadrilateral (or quadrangle or tetragon) 4
pentagon 5
hexagon 6
heptagon 7
octagon 8
enneagon (or nonagon) 9
decagon 10
hendecagon 11
dodecagon 12

<구현한 소스>

PolygonShape.h +-----+-----+-----+-----+-----+

//

//  PolygonShape.h

//  WhatATool

//

//  Created on 09. 12. 14.

//  Copyright 2009 __MyCompanyName__. All rights reserved.

//

#import

@interface PolygonShape : NSObject {

intnumberOfSides;

intminimumNumberOfSides;

intmaximumNumberOfSides;

}

@propertyintnumberOfSides;

@propertyintminimumNumberOfSides;

@propertyintmaximumNumberOfSides;

@property (readonly) float angleInDegrees;

@property (readonly) float angleInRadians;

@property (readonly) NSString *name;

//헤더에 이 메소드를 추가하는걸 까먹어서 에러가 났었다.

- (id)initWithNumberOfSides:(int)sides minimumNumberOfSides:(int)min maximumNumberOfSides:(int)max;

@end

PolygonShape.m +-----+-----+-----+-----+-----+

//

//  PolygonShape.m

//  WhatATool

//

//  Created on 09. 12. 14.

//  Copyright 2009 __MyCompanyName__. All rights reserved.

//

#import "PolygonShape.h"

@implementation PolygonShape

@synthesize numberOfSides;

@synthesize minimumNumberOfSides;

@synthesize maximumNumberOfSides;

//synthesize선언한변수지만 setter존재하면 getter생성됨으로마음놓고써도된다.

-(void)setNumberOfSides:(int)newNumberOfSides {

    //numberOfSides최소값과최대값의사이값만가질수있다

    if(newNumberOfSides > maximumNumberOfSides) {

        //maximumNumberOfSides 5설정되어있는데 numberOfSides 9세팅하려고한다면에러로그를출력하라.

        NSLog(@"Invalid number of sides: %d is greater than the maximum of %d allowed", newNumberOfSides, maximumNumberOfSides);

    } elseif (newNumberOfSides < minimumNumberOfSides) {

        NSLog(@"Invalid number of sides: %d is less than the minimum of %d allowed", newNumberOfSides, minimumNumberOfSides);

    } else {

        numberOfSides = newNumberOfSides;

    }

}

//minimumNumberOfSides 2보다커야한다.

-(void)setMinimumNumberOfSides:(int)newMinimumNumberOfSides {

    if (newMinimumNumberOfSides < 2) {

    NSLog(@"Invalid minumum number of sides: %d is less than 2 allowed", newMinimumNumberOfSides);

} else {

    minimumNumberOfSides = newMinimumNumberOfSides;

}

}

//maximumNumberOfSides 12보다작아야한다.

-(void)setMaximumNumberOfSides:(int)newMaximumNumberOfSides {

    if (newMaximumNumberOfSides > 12) {

NSLog(@"Invalid maximum number of sides: %d is greater than 12 allowed", newMaximumNumberOfSides);

} else {

maximumNumberOfSides = newMaximumNumberOfSides;

}

}

//4. 초기화메소드를생성하라.

//주의! numberOfSides를 Max Min보다 먼저 세팅하려고 Max Min값이 0으로 인식되어 조건에서 튕겨나간다.

-(id)initWithNumberOfSides:(int)sides minimumNumberOfSides:(int)min maximumNumberOfSides:(int)max {

[selfsetMinimumNumberOfSides:min];

[selfsetMaximumNumberOfSides:max];

[selfsetNumberOfSides:sides];

returnself;

}

//5. 슈퍼클래스인 NSObject init메소드를오버라이드하여아래와같은디폴트값을설정하는커스텀 init생성하라.

-(id)init {

if (self = [superinit]) {

    self = [selfinitWithNumberOfSides:5minimumNumberOfSides:3maximumNumberOfSides:10];

}

returnself;

}

//내각

-(float)angleInDegrees {

return (180 * (self.numberOfSides - 2) / self.numberOfSides);

}

//라디안

-(float)angleInRadians {

returnM_PI / 180 * self.angleInDegrees;

}

//7. 면의갯수로부터다각형의이름을출력하게것이다.

-(NSString *)name {

    switch ([selfnumberOfSides]) {

case2: return@"digon"; break;

case3: return@"triangle"; break;

case4: return@"quadrilateral"; break;

case5: return@"pentagon"; break;

case6: return@"hexagon"; break;

case7: return@"heptagon"; break;

case8: return@"octagon"; break;

case9: return@"enneagon"; break;

case10: return@"decagon"; break;

case11: return@"hendecagon"; break;

case12: return@"dodecagon"; break;

default: return@"";

}

}

//8. description오버라이드

//: Hello I am a 4-sided polygon (aka a Square) with angles of 90 degrees (1.570796 radians).

-(NSString *)description {

return [NSStringstringWithFormat: @"Hello I am a %d-sided polygon (aka a %@) with angles of %.0f degrees (%.6f radians)."

self.numberOfSides, self.name, self.angleInDegrees, self.angleInRadians];

}

//9. dealloc메소드를사용하여메모리관리를하고, dealloc불리워졌을때로그를출력하도록하여라.

- (void)dealloc {

NSLog(@"dealloc called");

[superdealloc];

}

@end

WhatATool.m의 함수(Section 6) 부분 +-----+-----+-----+-----+-----+

//#import "PolygonShape.h" 를 잊지말자


//Section 6

void PrintPolygonInfo() {

    NSLog(@"----- Section 6 -----");


    //배열 생성

NSMutableArray *array = [[NSMutableArrayalloc] init];

PolygonShape *polygon1 = [[PolygonShapealloc] initWithNumberOfSides:4minimumNumberOfSides:3maximumNumberOfSides:7];

PolygonShape *polygon2 = [[PolygonShapealloc] initWithNumberOfSides:6minimumNumberOfSides:5maximumNumberOfSides:9];

PolygonShape *polygon3 = [[PolygonShapealloc] initWithNumberOfSides:12minimumNumberOfSides:9maximumNumberOfSides:12];

    //생성한 다각형 정보를 로그에 출력하고 배열에 다각형 오브젝트를 추가한다.

NSLog([polygon1 description]);

[array addObject:polygon1];

NSLog([polygon2 description]);

[array addObject:polygon2];

NSLog([polygon3 description]);

[array addObject:polygon3];

//제약을 테스트하기 위해 numberOfSides에 10을 넣어본다.

for (PolygonShape *polygon in array) {

polygon.numberOfSides = 10;

}

[polygon1 dealloc];

[polygon2 dealloc];

[polygon3 dealloc];

[array dealloc];

}

<결과>

2009-12-17 14:54:31.297 WhatATool[1125:10b] ----- Section 6 -----

2009-12-17 14:54:31.297 WhatATool[1125:10b] Hello I am a 4-sided polygon (aka a quadrilateral) with angles of 90 degrees (1.570796 radians).

2009-12-17 14:54:31.297 WhatATool[1125:10b] Hello I am a 6-sided polygon (aka a hexagon) with angles of 120 degrees (2.094395 radians).

2009-12-17 14:54:31.297 WhatATool[1125:10b] Hello I am a 12-sided polygon (aka a dodecagon) with angles of 150 degrees (2.617994 radians).

2009-12-17 14:54:31.298 WhatATool[1125:10b] Invalid number of sides: 10 is greater than the maximum of 7 allowed

2009-12-17 14:54:31.298 WhatATool[1125:10b] Invalid number of sides: 10 is greater than the maximum of 9 allowed

2009-12-17 14:54:31.298 WhatATool[1125:10b] dealloc called

2009-12-17 14:54:31.299 WhatATool[1125:10b] dealloc called

2009-12-17 14:54:31.299 WhatATool[1125:10b] dealloc called

The Debugger has exited with status 0.



출처 : http://blog.naver.com/PostView.nhn?blogId=katchup00&logNo=10076162791
Posted by 오늘마감

댓글을 달아 주세요