NSDate 와 NSData 는 이름이 같아서 같이 올리는게 아니다.^^;; 코코아(?)에는 plist라 불리는 클래스 객체들이 있는데 이를 프로퍼티 리스트 (property list) 라 부른다. 프로퍼티 리스트 클래스에는 NSArray, NSDictionary, NSString, NSNumber, NSDate, NSDate 가 있다. 먼저 NSDate 는 날짜 및 시간 처리를 위한 핵심적인 클래스이다. Ex) NSDate *date = [NSDate date]; NSLog (@"today is %@", date); 이 코드는 "today is 2010-02-10 13:16:02 -0400" 을 출력한다. Ex) NSTimeInterval secondsPerDay = 24 * 60 * 60; NSDat..
프로퍼티 (property)란 - 외부에서 접근할 수 있는 객체의 속성 Objective-C에서는 인스턴스 멤버 변수들의 값에 편리하게 접근하기 위해 @property 라는 지시어를 사용한다. 선언 방식은 다음과 같으며 @interface 내부에 선언 된다. - @property(속성) 타입 변수명; -(float)value; -(void)setValue:(float)newValue; ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ @property float value; 이와 같이 두가지 메서드를 선언한 것과 같은 기능을 하게 된다. 속성에는 다음과 같은 정의를 할 수 있다. readwrite (Default) property의 값을 읽고 쓸 수 있다는 것이다. readonly property의 값..
+ (id) stringWidthFormat: (NSString *) format, ...; 메소드를 + 기호로 선언했다면 그 메소드를 클래스 메소드라고 표시한 것이다. 이 메소드는 클래스 객체(클래스의 인스턴스 객체와는 다름)에서 왔으며 주로 클래스의 새로운 인스턴스를 만드는데 사용된다. 클래스 객체는 수퍼클래스와 클래스 이름을 가리키는 포인터, 그리고 클래스 메소드 목록을 가리키는 포인터를 가지고 있다. 아울러 클래스 객체는 새롭게 만들어진 클래스의 인스턴스 객체의 크기 정보를 바이트 크기로 가지고 있다.
클래스에 초기화 메소드를 만들어야 한다는 요구사항은 없다. 하지만 클래스에 따라서는 편의를 위해 여러개의 이니셜라이저를 제공하기도 한다. -많은 인수를 하나하나 모두 전달해야 하는 경우. -기본적인 값을 사용해서 간단하게 초기화하는 경우. -초기화를 위해 데이터를 메모리에서 읽어 들이는 경우. -파일에서 읽어들이는 경우. 등등... 여러 종류의 이니셜라이저 중에서도 인스턴스를 초기화하기 위해 반드시 실행되어야 하는 메소드를 지정된 이니셜라이저 (designated initializer) 라고 한다. #import #import @interface Point : Object { int x, y; } - (id) init; - (id) initWithPoint : (int) x int : (int) y; -..
새로운 객체를 만드는 방법은 [someClass new], [[someClass alloc] init] 같은 형식이 있다. 두 방법 모두 객체를 생성해 주는 것은 동일하지만 alloc과 init을 쓰는 것을 권장한다. 객체를 할당하고 초기화 했을때 비로소 객체의 초기화가 완성된다. Car *car = [Car alloc]; 은 에러없이 동작하겠지만 초기화를 하지 않았기 때문에 버그를 발생시킬 수 있다. 메모리 할당의 중요성에 상응하는 것이 초기화 객체를 할당하고 초기화 하는 방식. Car *car = [[Car alloc] init]; 이런식으로 alloc한 후 반환된 객체에 바로 연결해서 init 메소드를 보내는 방식은 매우 중요하다. 다음의 방식은 피하는게 좋다. Car *car = [Car allo..
사과 + [ : 코드 블록을 왼쪽으로 쉬프트한다. Tab : 코드를 완성한다. Esc : 코드 완성 메뉴를 보여준다. Control + / : 코드 완성에서 다음 입력 영역으로 이동한다. 사과 + Control + S : 스냅 샷을 만든다. Control + A : 커서를 라인의 시작으로 이동한다. Control + E : 커서를 라인의 끝으로 이동한다. Control + D : 커서에 인접한 문자를 지운다. 사과 + Shift + ↑ : 연결된 파일을 연다. 사과 + D : 북마크 추가한다. Option + 더블클릭 : 문서를 찾는다. 사과 + Option + Y : 디버거로 프로그램을 실행한다. 사과 + Shift + O : 다음 스텝으로 넘어간다. 사과 + Option + ? : 도움말 Doc 창 ..
단지 클래스를 가리키는 포인터가 아니라 이 클래스를 상속받고 있는 경우, 헤더 파일에 @class를 사용하는 것만으로는 모든 정보를 전달할 수 없다. 즉, 전방선언이 아니라 포함을 해야하는데, 이런 경우 #import 를 사용한다. 단, 코드를 보면 는 사용하고 있지 않은데, Engine.h가 이미 를 포함하고 있다는 것을 알고 있기 때문에 여기서는 포함할 필요가 없는 것이다. 하지만 포함시켜도 문제는 없다. #import는 똘똘하니까 ㅎ ex) #import "Engine.h" @interface Slant6 : Engine @end // Slant6
접근자 메소드란? 접근자 메소드(Accessor Method)는 객체의 특정한 속성을 읽거나 변경할 때 쓴다. 객체의 값을 설정하는 메소드를 세터(Setter). Ex) - (void) setMyValue:(id)obj; 객체의 상태를 변경하는 메소드를 뮤테이터(mutator). 객체의 속성에 접근하기 위한 객체를 사용하는 코드를 제공하는 메소드를 게터(getter) 게터 메소드는 단순히 자신들이 반환할 속성의 이름으로 쓰여진다. Ex) -(MyValue *) myValue;
@implementation Circle - (void) setFillColor: (ShapeColor) c { if (c == kRedColor){ c = kGreenColor; } [super setFillColor: c]; } // setFillColor // and the rest of the Circle @implementation // is unchanged @end // Circle ------------------------------------------ 빨간 원을 녹색 원으로 바꾸는 소스이다. setFillColor: 가 Shape에 정의되어 있는 경우, super를 사용해서 수퍼클래스(Shape)에게 fillColor의 인스턴스 변수에 변경된 색을 저장할 수 있도록 할 수 있다. (s..
@implementation Shape 에 구현해 놓은 메소드들을 보자. @implementation Shape - (void) setFillColor : (ShapeColor) c { fillColor = c; } - (void) setBounds : (ShapeRect) b { bounds = b; } - (void) draw { // draw 는 구현하지 않는다. } @end Shape 에서 draw 를 구현하지는 않지만 하위 클래스가 상속받아 구현하도록 항상 정의한다. 하위 클래스에서 -(void) draw 를 구현하면 된다.
@interface Circle : NSObject @interface 지시자 다음에는 클래스 이름이 따라온다. 콜론(:) 뒤에 오는 식별자가 상속받으려는 상위 클래스의 이름이다. Objective-C 는 다중 상속을 지원하지 않는다. @interface Circle : Shape @end // Circle @interface Rectangle : Shape @end // Rectangle * Circle과 Rectangle의 인터페이스를 Shape에서 상속
Circle fillColor bounds setFillColor: setBounds: draw Rectangle fillColor bounds setFillColor: setBounds: draw 이와 같이 중복되는 부분이 많으면 비효율 적이다. 중복되는 코드를 한곳에 합쳐서 정리 하는 방법 - 상속. Shape 클래스를 상속받아 Circle 과 Rectangle 를 정의 하면 이와 같다. Circle 클래스를 수퍼클래스( 부모클래스 )라 부른다. Circle 과 Rectange 클래스를 서브클래스 ( 자식클래스 ). Circle 과 Rectangle 은 Shape 로 부터 상속을 받았기 때문에 Shape의 인스턴스 변수 fillColor 와 bounds 를 받는다. 메소드 또한 상속.
* 메소드 선언 (method declarations) : 내가 지원하는 기능이라고 선언 - (void) draw; - (void) setFillColor: (ShapeColor) fillColor; - (void) setBounds: (ShapeRect) bounds; ----------------------------------------------- - (반환타입) 메소드 이름: (반환타입) 인수; - 기호는 메소드를 선언한다는 의미.
@interface Circle : NSObject + @interface Circle : 컴파일러에게 "Circle이라는 이름을 갖는 새 클래스를 위한 인터페이스가 있다"고 알려준다. + NSObject : 컴파일러에게 "Circle클래스가 NSObject 클래스를 기반으로 한다"는 것을 알려준다. 모든 Circle은 NSObject이기도 하며 또한 NSObject 클래스가 정의하고 있는 모든 것들을 상속받는다는 것을 알려준다.
Xcode에서 프로그램을 편집하고 있는 경우, 프로그램을 실행할 때 파일 경로 전달은 이렇게 한다. 우선, Xcode의 왼쪽 파일 목록에서 Executables를 아래로 펼치고, 프로그램 이름을 더블 클릭한다. 그럼, [Executables "파일이름" Info] 창이 뜨는데, 여기서 Arguments 섹션에 있는 + 기호를 클릭하고 실행 인수를 입력한다. 이 인수는 파일의 경로가 되겠다. 이제 이 창을 닫고 프로그램을 실행한다. Xcode는 실행인수를 파일의 argv 배열에 전달한다.
NSString 요소는 상당히 많은 수의 기능을 담고 있으며 코코아에서 문자열이 팔요한 곳이면 언제 어디서나 사용된다. NSString 의 주요 메소드는 Foundation/NSString.h에서 선언되어 있다. NSString 은 내용의 변경이 불가능하다. 일단 메모리에 문자열이 할당되면 다음에 문자열을 바꾼다고 그 자리에 들어가지 않고 다른 메모리영역에 할당된다. NSString 의 기능 : - 문자열의 길이를 알려줌 -다른 문자열과의 비교 -정수 또는 실수로의 값 변환 등등등..... Ex) NSString *strTest = @"1234"; NSLog(@"length : %d, integer value = %d", [strTest length], [strTest integerValue]); //l..
Mac OS X 는 Apple의 현 CEO인 스티브 잡스(Steave Jobs)가 운영했던 NeXT의 객체지향 기술을 활용하고 있다. 1988년 NeXT가 개발한 NeXT 컴퓨터는 Unix를 기반으로 한 Machintosh 이상이라고 불릴 정도로 진보적인 GUI 환경을 보였다. 이 NeXT 컴퓨터의 기본 소프트웨어인 NEXTSTEP (후에 멀티 플랫폼 환경을 지원하면서 OPENSTEP으로 개명)의 개발언어가 바로 Objective-C 이다. 그리고 Mac OS X 에서 애플리케이션을 실행하기 위해 사용되는 Cocoa API는 OPENSTEP의 주요 API를 계승하고 발전시킨 것이다. 사실 Cocoa API 에 사용되는 NS라는 접두어는 NEXTSTEP에서 유래된 것이다. - Cocoa API 는 접두사 ..
Object-C 에서는 #import 라는 전처리기 지시자를 사용한다. #import 는 #include 와는 달리 같은 헤더 파일이 여러번 임포트되더라도 단 한번만 읽는다. #include 를 쓰다보면 헤더 파일 내에서 또 다른 헤더 파일을 인클루드 하는 경우가 종종 있는데, 이런 식으로 하다보면 매크로나 타입의 정의가 그 횟수만큼 반복되면서 중복 정의 에러가 발생하기 쉽다. - #import 는 그파일에서 실제로 #import 가 같은 헤더 파일을 여러번 포함해도 헤더 파일이 한번만 포함된다는 것을 보장.